您的位置:首页 > 编程语言 > PHP开发

php 重复提交 刷新 直接访问

2013-11-07 10:06 405 查看
防止 直接访问PHP页面,只能引用!

A页面:

Java代码  


define('INIT_PHPV', true); //定义 INIT_PHPV 为 true  

require 'b.php';  //引用b页面   

B页面:

Java代码  


!defined('INIT_PHPV') && die('非法操作!请与管理员联系!');  

这样就不能直接访问B页面了。也可以在A加COOKIE,B判断COOKIE后用完删掉COOKIE

 

防止刷新模块 

所以就考虑增加一个参数来防止这类情况的发生,COOKIE和SESSION可供选择,不过 COOKIE是客户端的,如果人家禁用COOKIE的话,照样可以恶意刷新点击数。还是用SESSION的好,IP+URL参数的MD5值做 SESSION名,我想大家也不好伪造了吧. 

实现原理 设置 max_reloadtime =100; //设置页面刷新最长间隔时间

用户第一次打开页面 记录当前的时间保存在 session_start

用户第二次打开页面(判断 session_start是否存在) 用当前时间和 session_start 相减 得到差值 time_passed

当 time_passed < max_reloadtime 表示用户在指定时间内频繁刷新了 警告后直接退出

Java代码  


<?php  

session_start();  

$k = $_GET['k'];  

$t = $_GET['t'];  

//防刷新时间  

$allowTime = 1800;  

$ip = get_client_ip();  

$allowT = md5($ip . $k . $t);  

if (!isset($_SESSION[$allowT])) {  

    $refresh = true;  

    $_SESSION[$allowT] = time();  

} elseif (time() - $_SESSION[$allowT] > $allowTime) {  

    $refresh = true;  

    $_SESSION[$allowT] = time();  

} else {  

    $refresh = false;  

}  

?>   


防重复提交

首先,我们可以定义一个session变量用来保存一个表单的提交序列号。这里我定义为“$userLastAction”。然后在表单里加入一个 hidden变量,把值设为$userLastAction+1: 

<input type=Hidden name=lastAction value=<? =$userLastAction+1 ?>> 

最后,在处理提交之前判断表单是否已被提交过: 

if($lastAction>$userLastAction and inputIsValid(…)){ 

$userLastAction++; // 序列号加1 

// 处理表单数据 

}

Java代码  


提交页面:  

<?  

$_SESSION['code']=mt_rand(1,1000);//生成1到1000之间的随机器数  

?>  

<form>  

<input type="hidden" name="scode" value="<?php echo $_SESSION['code']?>" />  

</form>  

  

被提交页面:  

if($_SESSION['code']!=$_REQUEST['scode']){  

    echo "请不要重复提交";  

   exit;  

}  

$_SESSION['code']=0  

 

 

Java代码  


<?php    

/* 改进版 

PHP防止用户刷新页面(Refresh or Reload),重复提交表单内容。 

由于表单变量的内容由$_POST['name']引用,也许在处理完表单后,直接将$_POST['name']销毁(unset())即可。其实不然。可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST['name'],刷新后,$_POST['name']还是会被赋值,一样有效。   

可利用Session解决。首先给Session赋个值,比如400,第一次提交成功后改变Session的值,当第二次提交时去检查这个Session 的值,如果不是400,就不再处理表单中的数据。 

可设置Session的有效时间?    

*/  

if (isset($_POST['action']) && $_POST['action'] == ’submitted’) {       

      session_start();       

      isset($_SESSION['num']) or die ("no session");       

      if ($_SESSION['num']==400){       

              print ‘<pre>’;       

              print_r($_POST);       

              print ‘<a href="’. $_SERVER['PHP_SELF'] .’">Please try again</a>’;       

              print ‘</pre>’;       

              $_SESSION['num']=500;       

      } else {       

              print ‘<pre>’;       

              print_r($_POST);       

              echo "However you have submitted";       

              print ‘</pre>’;       

      }       

} else {       

      session_start() or die("session is not started");       

      $_SESSION['num']= 400;        

?>      

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">      

Name: <input type="text" name="personal[name]"><br>      

Email: <input type="text" name="personal[email]"><br>      

Beer: <br>      

<select multiple name="beer[]">      

      <option value="warthog">Warthog</option>      

      <option value="guinness">Guinness</option>      

      <option value="stuttgarter">Stuttgarter Schwabenbr</option>    

</select><br>      

<input type="hidden" name="action" value="submitted">      

<input type="submit" name="submit" value="submit me!">      

</form>      

<?php      

}       

?>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: