name: security-testing
description: Security best practices (OWASP Top 10) and testing strategies for software development. Covers secure coding, vulnerability prevention, testing pyramid, API design, and observability patterns. Use when reviewing code for security, writing tests, designing APIs, or when asking about security vulnerabilities, testing strategies, logging, or monitoring.
Security & Testing
Security Principles
- Defense in Depth: Multiple layers of security
- Least Privilege: Minimum necessary permissions
- Fail Secure: Default to deny
- Zero Trust: Never trust, always verify
OWASP Top 10 Quick Reference
| # |
Vulnerability |
Prevention |
| 1 |
Broken Access Control |
RBAC, deny by default, audit logs |
| 2 |
Cryptographic Failures |
TLS, strong algorithms, key management |
| 3 |
Injection |
Parameterized queries, input validation |
| 4 |
Insecure Design |
Threat modeling, secure patterns |
| 5 |
Security Misconfiguration |
Hardened defaults, minimal services |
| 6 |
Vulnerable Components |
Dependency scanning, updates |
| 7 |
Auth/Identity Failures |
MFA, session management |
| 8 |
Software/Data Integrity |
Signed artifacts, CI/CD security |
| 9 |
Logging/Monitoring Failures |
Centralized logs, alerting |
| 10 |
SSRF |
Input validation, allowlists |
Security Checklist
Testing Pyramid
/\
/ \ E2E Tests (few)
/----\
/ \ Integration Tests
/--------\
/ \ Unit Tests (many)
/------------\
| Type |
Purpose |
Speed |
Coverage |
| Unit |
Test isolated logic |
Fast |
High |
| Integration |
Test component interaction |
Medium |
Medium |
| E2E |
Test full user flows |
Slow |
Low |
Testing Best Practices
# Arrange-Act-Assert pattern
def test_user_creation():
# Arrange
user_data = {"name": "Alice", "email": "alice@acme.com"}
# Act
user = create_user(user_data)
# Assert
assert user.name == "Alice"
assert user.email == "alice@acme.com"
# Test edge cases
def test_empty_input():
with pytest.raises(ValueError):
create_user({})
def test_invalid_email():
with pytest.raises(ValidationError):
create_user({"name": "Bob", "email": "invalid"})
API Security
# Essential security headers
Content-Security-Policy: default-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
# Rate limiting
from flask_limiter import Limiter
limiter = Limiter(key_func=get_remote_address)
@app.route("/api/login")
@limiter.limit("5 per minute")
def login():
pass
Observability
Three Pillars
| Pillar |
Purpose |
Tools |
| Logs |
Event records |
ELK, CloudWatch |
| Metrics |
Numerical measurements |
Prometheus, DataDog |
| Traces |
Request flows |
Jaeger, X-Ray |
Structured Logging
logger.info("User action", extra={
"user_id": user.id,
"action": "login",
"ip": request.remote_addr,
"timestamp": datetime.utcnow().isoformat()
})
Detailed References
- OWASP Security: See references/owasp-security.md
- Testing Strategies: See references/testing-strategies.md
- API Design: See references/api-design.md
- Observability: See references/observability.md
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: kiraneswaran-engineering-skills-security-testing3description: ---4---5---6name: security-testing7description: Security best practices (OWASP Top 10) and testing strategies for software development. Covers secure coding, vulnerability prevention, testing pyramid, API design, and observability patterns. Use when reviewing code for security, writing tests, designing APIs, or when asking about security vulnerabilities, testing strategies, logging, or monitoring.8---910# Security & Testing1112## Security Principles13141. **Defense in Depth**: Multiple layers of security152. **Least Privilege**: Minimum necessary permissions163. **Fail Secure**: Default to deny174. **Zero Trust**: Never trust, always verify1819## OWASP Top 10 Quick Reference2021| # | Vulnerability | Prevention |22|---|---------------|------------|23| 1 | Broken Access Control | RBAC, deny by default, audit logs |24| 2 | Cryptographic Failures | TLS, strong algorithms, key management |25| 3 | Injection | Parameterized queries, input validation |26| 4 | Insecure Design | Threat modeling, secure patterns |27| 5 | Security Misconfiguration | Hardened defaults, minimal services |28| 6 | Vulnerable Components | Dependency scanning, updates |29| 7 | Auth/Identity Failures | MFA, session management |30| 8 | Software/Data Integrity | Signed artifacts, CI/CD security |31| 9 | Logging/Monitoring Failures | Centralized logs, alerting |32| 10 | SSRF | Input validation, allowlists |3334## Security Checklist3536- [ ] No hardcoded secrets37- [ ] Secrets not logged38- [ ] Input validation on all boundaries39- [ ] Parameterized queries40- [ ] Dependencies scanned for CVEs41- [ ] Authentication & authorization implemented42- [ ] HTTPS enforced43- [ ] Security headers configured44- [ ] Rate limiting in place45- [ ] Audit logging enabled4647## Testing Pyramid4849```50 /\51 / \ E2E Tests (few)52 /----\53 / \ Integration Tests54 /--------\55 / \ Unit Tests (many)56 /------------\57```5859| Type | Purpose | Speed | Coverage |60|------|---------|-------|----------|61| Unit | Test isolated logic | Fast | High |62| Integration | Test component interaction | Medium | Medium |63| E2E | Test full user flows | Slow | Low |6465## Testing Best Practices6667```python68# Arrange-Act-Assert pattern69def test_user_creation():70 # Arrange71 user_data = {"name": "Alice", "email": "alice@acme.com"}72 73 # Act74 user = create_user(user_data)75 76 # Assert77 assert user.name == "Alice"78 assert user.email == "alice@acme.com"7980# Test edge cases81def test_empty_input():82 with pytest.raises(ValueError):83 create_user({})8485def test_invalid_email():86 with pytest.raises(ValidationError):87 create_user({"name": "Bob", "email": "invalid"})88```8990## API Security9192```yaml93# Essential security headers94Content-Security-Policy: default-src 'self'95X-Content-Type-Options: nosniff96X-Frame-Options: DENY97Strict-Transport-Security: max-age=31536000; includeSubDomains98```99100```python101# Rate limiting102from flask_limiter import Limiter103limiter = Limiter(key_func=get_remote_address)104105@app.route("/api/login")106@limiter.limit("5 per minute")107def login():108 pass109```110111## Observability112113### Three Pillars114115| Pillar | Purpose | Tools |116|--------|---------|-------|117| Logs | Event records | ELK, CloudWatch |118| Metrics | Numerical measurements | Prometheus, DataDog |119| Traces | Request flows | Jaeger, X-Ray |120121### Structured Logging122```python123logger.info("User action", extra={124 "user_id": user.id,125 "action": "login",126 "ip": request.remote_addr,127 "timestamp": datetime.utcnow().isoformat()128})129```130131## Detailed References132133- **OWASP Security**: See [references/owasp-security.md](references/owasp-security.md)134- **Testing Strategies**: See [references/testing-strategies.md](references/testing-strategies.md)135- **API Design**: See [references/api-design.md](references/api-design.md)136- **Observability**: See [references/observability.md](references/observability.md)137138139---140> Converted and distributed by [TomeVault](https://tomevault.io/claim/kiraneswaran) — claim your Tome and manage your conversions.141<!-- tomevault:4.0:skill_md:2026-04-11 -->