防止php重复提交表单更安全的方法

来源:互联网 发布:修改jenkins的端口 编辑:程序博客网 时间:2024/04/20 06:31

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

0 0