Regere o ID da sessão no login e logout para mitigar Session Fixation
if ($user = $this->loginFrom($_POST)) {
session_start();
session_regenerate_id(true); // true para apagar a sessão antiga
}
Com Let's Encrypt, podemos ter
certificados SSL gratuitos ♥
session.cookie_domain="meusite.com.br"
session.cookie_httponly=On
session.cookie_samesite="Strict"
session.cookie_secure=On
session.name="MYSESSNAME"
session.sid_bits_per_character=6
session.sid_length=48
session.use_only_cookies=On
session.use_strict_mode=On
session.use_trans_sid=Off
“Mas eu estou validando no frontend!”— Alguém antes de ter sua aplicação invadida
htmlentities($str, ENT_QUOTES | ENT_HTML5, $encoding)
HTTP 400 Bad Request
(recomendado para aplicações críticas)Se possível, use a libsodium!
Uma biblioteca segura, moderna e fácil de usar...
(por mais que os métodos sejam um pouco verbosos)
Sim, estou de olho em você, sodium_crypto_sign_keypair_from_secretkey_and_publickey()
public function login(string $username, string $password) : bool
{
$user = $this->findByUsername($username);
if (! $user) {
return false;
}
if (! $this->verifyPassword($password, $user->getPassword())) {
return false;
}
return true;
}
É possível saber que usuários existem em sua aplicação através de Timing attacks
public function login(string $username, string $password) : bool
{
$storedPassword = $this->generateFakePassword();
$user = $this->findByUsername($username);
if ($user) {
$storedPassword = $user->getPassword();
}
return ($this->verifyPassword($password, $storedPassword))
&& ($user !== null);
}
Será que não estamos exagerando?
É realmente possível ver essa diferença?
Vamos testar, então!
Executando os scripts login-user-enumeration.php
e login-user-enumeration-fixed.php