PHP Security
Priority: P0 (CRITICAL)
Structure
src/
└── Security/
├── Validators/
└── Auth/
Implementation Guidelines
- Prepared Statements: Use PDO with Parameterized Queries:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute([':id' => $id]);. NEVER concatenate user input into SQL strings. - Password Hashing: ALWAYS use
password_hash()withPASSWORD_ARGON2ID(PHP 7.4+) orPASSWORD_BCRYPT. - Auth Verification: Use
password_verify(). Usepassword_needs_rehash()to upgrade legacy hashes. Implement Rate Limiting and MFA where appropriate. - XSS Escaping: Use
htmlentities($userInput, ENT_QUOTES | ENT_HTML5, 'UTF-8')orhtmlspecialchars()on all user output. Prefer Twig or Blade for auto-escaping. - CSRF Protection: Mandate
CSRF tokensfor all state-changing requests (POST,PUT,PATCH,DELETE). - Input Validation: Use
filter_var($email, FILTER_VALIDATE_EMAIL)orfilter_var($url, FILTER_VALIDATE_URL). Always Whitelist allowed values. - File Security: RESTRICT file uploads by MIME type and extension. Store uploads outside the public root.
- Session Safety: Configure
session.cookie_httponly = 1,session.cookie_secure = 1, andsession.samesite = "Lax". - Header Security: Enforce
Content-Security-Policy (CSP),X-Frame-Options: DENY, andX-Content-Type-Options: nosniff.
Anti-Patterns
- No SQL string concatenation: Use PDO prepared statements only.
- No MD5/SHA1 for passwords: Use
password_hash($password, PASSWORD_ARGON2ID). - No raw
$_GET/$_POST: Validate all input withfilter_var()first. - No production error display: Log to file; never show to users.