Security Basics
OWASP Top 10 Quick Reference
- Injection - SQL, NoSQL, OS, LDAP injection
- Broken Authentication - Weak session management
- Sensitive Data Exposure - Missing encryption
- XML External Entities (XXE) - XML parser attacks
- Broken Access Control - Missing authorization
- Security Misconfiguration - Default configs, verbose errors
- XSS - Cross-Site Scripting
- Insecure Deserialization - Untrusted data execution
- Vulnerable Components - Outdated dependencies
- Insufficient Logging - Missing audit trails
Input Validation
Always Validate
- User input (forms, query params)
- File uploads (type, size, content)
- API request bodies
- URL parameters
Validation Patterns
// Whitelist approach (preferred)
const allowedFields = ['name', 'email', 'age'];
const sanitized = pick(input, allowedFields);
// Schema validation
const schema = z.object({
email: z.string().email(),
age: z.number().min(0).max(150),
name: z.string().min(1).max(100)
});
SQL Injection Prevention
// BAD - SQL Injection vulnerable
const query = `SELECT * FROM users WHERE id = ${userId}`;
// GOOD - Parameterized query
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);
// GOOD - ORM
await User.findOne({ where: { id: userId } });
XSS Prevention
// BAD - Direct HTML insertion
element.innerHTML = userInput;
// GOOD - Text content
element.textContent = userInput;
// GOOD - Sanitize HTML if needed
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(userInput);
// React handles this automatically
<div>{userInput}</div> // Safe
// But not this
<div dangerouslySetInnerHTML={{__html: userInput}} /> // DANGEROUS
Authentication Checklist
- [ ] Hash passwords with bcrypt/argon2 (cost factor >= 10)
- [ ] Implement rate limiting on login
- [ ] Use secure session tokens (random, sufficient length)
- [ ] Set secure cookie flags (HttpOnly, Secure, SameSite)
- [ ] Implement proper logout (invalidate session)
- [ ] Consider 2FA for sensitive operations
Authorization Checklist
- [ ] Check permissions on every request
- [ ] Use role-based access control (RBAC)
- [ ] Validate resource ownership
- [ ] Don't rely on hidden fields/URLs for security
- [ ] Log authorization failures
Security Headers
Content-Security-Policy: default-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Secrets Management
- Never commit secrets to version control
- Use environment variables
- Rotate secrets regularly
- Use secrets managers (AWS Secrets Manager, Vault)
- Different secrets per environment
Dependency Security
# Check for vulnerabilities
npm audit
pip-audit
bundler-audit
# Keep dependencies updated
npm update
dependabot/renovate for automation
Code Review Security Checklist
- [ ] No hardcoded secrets
- [ ] Input validation present
- [ ] Parameterized queries used
- [ ] Proper error handling (no stack traces)
- [ ] Authorization checks in place
- [ ] Sensitive data not logged