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

七月 28, 2019 | views
Comments 0

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 = ''//phpfensi.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. ?> 

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. ?> 



zend