Maison >développement back-end >tutoriel php >Comment ajouter un jeton au formulaire PHP pour éviter les soumissions répétées

Comment ajouter un jeton au formulaire PHP pour éviter les soumissions répétées

藏色散人
藏色散人avant
2020-04-06 16:07:322606parcourir

Une brève discussion sur le jeton

Le jeton est un jeton, et sa plus grande caractéristique est le caractère aléatoire et l'imprévisibilité. Les pirates informatiques ou logiciels normaux ne peuvent pas le deviner.

Alors, quelle est la fonction du Token ? Quel est le principe ?

Le jeton est généralement utilisé à deux endroits : pour empêcher les soumissions répétées de formulaires et les attaques anti-csrf (falsification de requêtes intersites).

Les deux sont en principe implémentés via des jetons de session. Lorsque le client demande une page, le serveur génère un jeton à nombre aléatoire, place le jeton dans la session, puis envoie le jeton au client (généralement en construisant un formulaire caché). La prochaine fois que le client soumettra une demande, le jeton sera soumis au serveur avec le formulaire.

Ensuite, s'il est appliqué à une "attaque anti-csrf", le serveur vérifiera la valeur du jeton pour déterminer si elle est égale à la valeur du jeton dans la session. Si elle est égale, il peut être prouvé que la demande est valide. et non forgé.

Cependant, s'il est utilisé pour "empêcher la soumission répétée de formulaires", après que la première vérification côté serveur soit la même, la valeur du jeton dans la session sera mise à jour. Si l'utilisateur soumet à plusieurs reprises, la valeur du jeton dans la session sera mise à jour. le deuxième jugement de vérification sera Il a échoué car le jeton dans le formulaire soumis par l'utilisateur n'a pas changé, mais le jeton dans la session côté serveur a changé.

L'application de session ci-dessus est relativement sûre, mais elle est également encombrante, lorsqu'il y a plusieurs pages et plusieurs requêtes, la méthode de génération de plusieurs jetons en même temps doit être utilisée, ce qui prend du temps. plus de ressources et réduit l’efficacité de l’exécution. Par conséquent, la méthode de stockage des informations de vérification dans les cookies peut également être utilisée à la place du jeton de session. Par exemple, lorsqu'il s'agit de « soumissions répétées », les informations soumises seront écrites dans le cookie après la première soumission. Lors de la deuxième soumission, puisque le cookie a déjà un enregistrement de soumission, la deuxième soumission échouera.

Cependant, le stockage des cookies présente une faiblesse fatale. Si le cookie est piraté (les attaques XSS peuvent facilement obtenir les cookies des utilisateurs), il y aura alors une autre partie. Les pirates mettront directement en œuvre les attaques CSRF.

<?php
/*
* PHP简单利用token防止表单重复提交
* 此处理方法纯粹是为了给初学者参考
*/
session_start();
function set_token() {
  $_SESSION[&#39;token&#39;] = md5(microtime(true));
}
function valid_token() {
  $return = $_REQUEST[&#39;token&#39;] === $_SESSION[&#39;token&#39;] ? true : false;
  set_token();
  return $return;
}
//如果token为空则生成一个token
if(!isset($_SESSION[&#39;token&#39;]) || $_SESSION[&#39;token&#39;]==&#39;&#39;) {
  set_token();
}
if(isset($_POST[&#39;test&#39;])){
  if(!valid_token()){
    echo "token error";
  }else{
    echo &#39;成功提交,Value:&#39;.$_POST[&#39;test&#39;];
    echo "<br/>";
    echo "token:".$_SESSION[&#39;token&#39;];
  }
}
?>
<form method="post" action="">
  <input type="hidden" name="token" value="<?php echo $_SESSION[&#39;token&#39;]?>">
  <input type="text" name="test" value="Default">
  <input type="submit" value="提交" />
</form>

Apprentissage recommandé : Tutoriel vidéo PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer