PHP 7: Maintaining and Upgrading Legacy Apps · Security Hardening for PHP 7 Apps
Hardening Sessions and Authentication
Fix session fixation, insecure cookies and weak 'remember me' implementations.
Common legacy problems: session IDs not regenerated at login, cookies missing Secure/HttpOnly/SameSite, 'remember me' cookies containing user IDs or md5 hashes, and no rate limiting on login. Fix with secure session settings, session_regenerate_id(true) on login, random remember-me tokens stored hashed (selector/validator pattern), and throttling.
<?php
// Remember-me: selector/validator pattern
$selector = bin2hex(random_bytes(9));
$validator = random_bytes(33);
$pdo->prepare('INSERT INTO auth_tokens (selector, hashed_validator, user_id, expires_at) VALUES (?, ?, ?, ?)')
->execute([$selector, hash('sha256', $validator), $userId, date('Y-m-d H:i:s', time() + 30 * 86400)]);
setcookie('remember', $selector . ':' . bin2hex($validator), [
'expires' => time() + 30 * 86400, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax',
]);
// On use: look up by selector, compare hash('sha256', validator) with hash_equals, rotate token.
Common pitfalls
- Remember-me cookies with predictable values (user ID, md5 of email).
- Storing tokens unhashed in the database.
- No way to revoke all sessions after a password change.
Key points
- Regenerate session IDs at login
- Random, hashed remember-me tokens
- Throttle logins; revoke on password change
Further reading: Paragon IE: secure 'remember me'
Practice questions
Why split remember-me tokens into selector and validator?
Answer
The selector is used to look up the row (not secret), while only a hash of the validator is stored. Lookups don't leak timing info about the secret, and a database leak doesn't reveal usable tokens.
What should happen to sessions and tokens when a user changes their password?
Answer
Invalidate other sessions and remember-me tokens so an attacker using a stolen session or cookie is logged out.
Open in the app to mark lessons complete, take notes and track your progress.