Php - Failles CSRF : utilisez des tokens !
ARCHIVE
Cela reste, somme toute, très basique, mais néanmoins indispensable. Les failles CSRF "utilisent l'utilisateur comme déclencheur, celui-ci devient complice sans en être conscient. L'attaque étant actionnée par l'utilisateur, un grand nombre de systèmes d'authentification sont contournés". L'idée est tout simplement de soumettre un formulaire, envoyé par l'utilisateur sans qu'il le sache. Si celui-ci est, par exemple, connecté sur son compte, le formulaire pourra donc faire tout ce que l'utilisateur peut lui même faire.
La solution la plus simple est de placer un "token" dans chacun de vos formulaires, via un champs hidden.
Ce token peut être une chaîne aléatoire , par exemple :
[sourcecode language="php"]
$_SESSION['token'] = md5(uniqid(rand(), true));
[/sourcecode]
Vous stockez ainsi le token en session.
Dans vos formulaires, rajoutez :
[sourcecode language="php"]
[/sourcecode]
Ensuite, vérifiez, pour chaque requête post envoyée, si le token envoyé est bien celui stocké en sessions :
[sourcecode language="php"]
if(isset($_POST) && count($_POST) > 1){
if($_POST['t']!=$_SESSION['t'])die('Unallowed token');
}
[/sourcecode]
Cela constitue une première protection.
Néanmoins, on peut tout à fait supposer que le "vilain pirate" peut être en mesure de serialiser votre formulaire et de renvoyer le tout, et donc, de récupérer votre token... Mais, normalement, les navigateurs bloquent le crossdomain.
Donc, à priori, cette solution est tout à fait défendable.
Vous pouvez toujours doubler cette solution avec une vérification du referer...