原理是:首先在表单页生成一个 随机不重复的 token(可以利用时间戳),把 token 的值分别存入 session 和 表单的隐藏域;当提交表单的时候,在接收页对比传递过来的 token 和session 中的 token ,当两者相等时,重新生成一个 token 并存入 session。此时如果重复提交表单,则必然session 中新的 token 值不等于 post 来的 token。
代码:
表单页 post.php
1 session_start(); 2 3 $token = md5(microtime(true)); 4 $_SESSION['token'] = $token; 5 6 ?> 7 <form method='post' action='post2.php'> 8 <input type="text" name="token" value="<?php echo $token;?>"> 9 <input type="text" name="test" value="value<?php echo mt_rand(1,9999);?>"> 10 <input type="submit"> 11 </form>
接收页 post2.php
1 <?php 2 session_start(); 3 if(isset($_SESSION['token'])){ 4 $token = $_SESSION['token']; 5 }else{ 6 $token = ''; 7 } 8 if(isset($_POST['test'])){ 9 if($_POST['token'] != $token){ 10 echo '重复提交 <br />'; 11 }else{ 12 echo 'success'; 13 $token = md5(microtime(true)); 14 $_SESSION['token'] = $token; 15 } 16 }