J'essaye d'ajouter une certaine sécurité aux formulaires sur mon site Web. L'un des formulaires utilise AJAX et l'autre est un simple formulaire «contactez-nous». J'essaye d'ajouter un jeton CSRF. Le problème que j'ai est que le jeton n'apparaît que dans la "valeur" HTML de temps en temps. Le reste du temps, la valeur est vide. Voici le code que j'utilise sur le formulaire AJAX:
PHP:
if (!isset($_SESSION)) {
session_start();
$_SESSION['formStarted'] = true;
}
if (!isset($_SESSION['token']))
{$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
HTML
<form>
//...
<input type="hidden" name="token" value="<?php echo $token; ?>" />
//...
</form>
Aucune suggestion?
token_time
ça sert?token_time
. J'allais limiter le temps pendant lequel un jeton est valide, mais je n'ai pas encore entièrement implémenté le code. Par souci de clarté, je l'ai supprimé de la question ci-dessus.Réponses:
Pour le code de sécurité, veuillez ne pas générer vos jetons de cette façon:
$token = md5(uniqid(rand(), TRUE));
rand()
est prévisibleuniqid()
ajoute seulement jusqu'à 29 bits d'entropiemd5()
n'ajoute pas d'entropie, il la mélange simplement de manière déterministeEssayez ceci:
Générer un jeton CSRF
PHP 7
Sidenote: L'un des projets open source de mon employeur est une initiative de backport
random_bytes()
et derandom_int()
projets PHP 5. Il est sous licence MIT et disponible sur Github et Composer en tant que paragonie / random_compat .PHP 5.3+ (ou avec ext-mcrypt)
Vérification du jeton CSRF
Ne vous contentez pas d'utiliser
==
ou même d'===
utiliserhash_equals()
(PHP 5.6+ uniquement, mais disponible pour les versions antérieures avec la bibliothèque hash-compat ).Aller plus loin avec les jetons par formulaire
Vous pouvez restreindre davantage les jetons afin qu'ils ne soient disponibles que pour un formulaire particulier en utilisant
hash_hmac()
. HMAC est une fonction de hachage à clé particulière qui peut être utilisée en toute sécurité, même avec des fonctions de hachage plus faibles (par exemple MD5). Cependant, je recommande d'utiliser la famille de fonctions de hachage SHA-2 à la place.Tout d'abord, générez un deuxième jeton à utiliser comme clé HMAC, puis utilisez une logique comme celle-ci pour le rendre:
Et puis en utilisant une opération congruente lors de la vérification du jeton:
Les jetons générés pour un formulaire ne peuvent pas être réutilisés dans un autre contexte sans le savoir
$_SESSION['second_token']
. Il est important que vous utilisiez un jeton distinct comme clé HMAC que celui que vous venez de déposer sur la page.Bonus: approche hybride + intégration Twig
Quiconque utilise le moteur de création de modèles Twig peut bénéficier d'une double stratégie simplifiée en ajoutant ce filtre à son environnement Twig:
Avec cette fonction Twig, vous pouvez utiliser les deux jetons à usage général comme ceci:
Ou la variante verrouillée:
Twig ne s'occupe que du rendu des modèles; vous devez toujours valider correctement les jetons. À mon avis, la stratégie Twig offre une plus grande flexibilité et simplicité, tout en conservant la possibilité d'une sécurité maximale.
Jetons CSRF à usage unique
Si vous avez une exigence de sécurité selon laquelle chaque jeton CSRF est autorisé à être utilisable exactement une fois, la stratégie la plus simple le régénère après chaque validation réussie. Cependant, cela invalidera chaque jeton précédent qui ne se marie pas bien avec les personnes qui parcourent plusieurs onglets à la fois.
Paragon Initiative Enterprises gère une bibliothèque Anti-CSRF pour ces cas d'angle. Il fonctionne avec des jetons à usage unique par formulaire, exclusivement. Lorsque suffisamment de jetons sont stockés dans les données de session (configuration par défaut: 65535), les jetons non utilisés les plus anciens sont d'abord supprimés.
la source
On dirait que vous avez besoin d'un autre avec votre if.
la source
md5(uniqid(rand(), TRUE));
aux contextes de sécurité.La variable
$token
n'est pas récupérée de la session lorsqu'elle s'y trouvela source