首页 > 开发 > PHP > 正文

PHP表单增加token验证,防止站外及重复提交

2024-05-04 22:00:27
字体:大 中 小
来源:转载
供稿:网友

token用于常用的表单防止重复提交及站外提交的一个常用的处理方式了,下文我们一起来看一个PHP表单增加token验证,防止站外及重复提交例子。

原理在于生成一个随机字符串放在session里。提交表单后来验证这个字符串。可以做到防止他人自己写form来欺骗提交,重复提交或者双击提交。

Token.php

  1. <?php 
  2.  
  3. /* 
  4.  * Created on 2013-3-25 
  5.  * 
  6.  * To change the template for this generated file go to 
  7.  * Window - Preferences - PHPeclipse - PHP - Code Templates 
  8.  */ 
  9. function getToken($len = 32, $md5 = true) { 
  10.  # Seed random number generator 
  11.  # Only needed for PHP versions prior to 4.2 
  12.  mt_srand((double) microtime() * 1000000); 
  13.  # Array of characters, adjust as desired 
  14.  $chars = array ( 
  15.   'Q', 
  16.   '@', 
  17.   '8', 
  18.   'y', 
  19.   '%', 
  20.   '^', 
  21.   '5', 
  22.   'Z', 
  23.   '(', 
  24.   'G', 
  25.   '_', 
  26.   'O', 
  27.   '`', 
  28.   'S', 
  29.   '-', 
  30.   'N', 
  31.   '<', 
  32.   'D', 
  33.   '{', 
  34.   '}', 
  35.   '[', 
  36.   ']', 
  37.   'h', 
  38.   ';', 
  39.   'W', 
  40.   '.', 
  41.   '/', 
  42.   '|', 
  43.   ':', 
  44.   '1', 
  45.   'E', 
  46.   'L', 
  47.   '4', 
  48.   '&', 
  49.   '6', 
  50.   '7', 
  51.   '#', 
  52.   '9', 
  53.   'a', 
  54.   'A', 
  55.   'b', 
  56.   'B', 
  57.   '~', 
  58.   'C', 
  59.   'd', 
  60.   '>', 
  61.   'e', 
  62.   '2', 
  63.   'f', 
  64.   'P', 
  65.   'g', 
  66.   ')', 
  67.   '?', 
  68.   'H', 
  69.   'i', 
  70.   'X', 
  71.   'U', 
  72.   'J', 
  73.   'k', 
  74.   'r', 
  75.   'l', 
  76.   '3', 
  77.   't', 
  78.   'M', 
  79.   'n', 
  80.   '=', 
  81.   'o', 
  82.   '+', 
  83.   'p', 
  84.   'F', 
  85.   'q', 
  86.   '!', 
  87.   'K', 
  88.   'R', 
  89.   's', 
  90.   'c', 
  91.   'm', 
  92.   'T', 
  93.   'v', 
  94.   'j', 
  95.   'u', 
  96.   'V', 
  97.   'w', 
  98.   ',', 
  99.   'x', 
  100.   'I', 
  101.   '$', 
  102.   'Y', 
  103.   'z', 
  104.   '*' 
  105.  ); 
  106.  # Array indice friendly number of chars; 
  107.  $numChars = count($chars) - 1; 
  108.  $token = ''; //Vevb.com 
  109.  # Create random token at the specified length 
  110.  for ($i = 0; $i < $len; $i++) 
  111.   $token .= $chars[mt_rand(0, $numChars)]; 
  112.  # Should token be run through md5? 
  113.  if ($md5) { 
  114.   # Number of 32 char chunks 
  115.   $chunks = ceil(strlen($token) / 32); 
  116.   $md5token = ''; 
  117.   # Run each chunk through md5 
  118.   for ($i = 1; $i <= $chunks; $i++) 
  119.    $md5token .= md5(substr($token, $i * 32 - 32, 32)); 
  120.   # Trim the token 
  121.   $token = substr($md5token, 0, $len); 
  122.  } 
  123.  return $token; 
  124. } 
  125. ?> 

form.php

  1. <?php 
  2. include_once("token.php"); 
  3. $token = getToken(); 
  4. session_start(); 
  5. $_SESSION['token'] = $token; 
  6. ?> 
  7. <form action="action.php" method="post" 
  8. <input type="hidden" name="token" value="<?=$token?>" /> 
  9. <!-- 其他input submit之类的 --> 
  10. </form> 
  11. action.php 
  12. <?php 
  13. session_start(); 
  14. if($_POST['token'] == $_SESSION['token']){ 
  15.     unset($_SESSION['token']); 
  16.     echo "这是一个正常的提交请求"; 
  17. }else{ 
  18.     echo "这是一个非法的提交请求"; 
  19. } 
  20. ?> 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表