首页 > php开发 > PHP利用session与cookies防重复提交实例

PHP利用session与cookies防重复提交实例

在网页开发中防止重复提交是一个比较实用并且也常用碰到的问题了,除了我们可以直接在数据库查询用户是否提交相同数据进行过滤外,我们还可以在用户提交数据时就防止这类事情发现,下面我来介绍基于session与cookies防重复提交一些基于实现方法。

防止刷新或再交提交

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

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

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

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

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

<?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;
}
?>

防表单重复提交

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

例,一个基于smarty演示版

<?php
$code = mt_rand(0, 1000000);
setcookie('addtips', $code, time() + 300);
if (isset($_POST['submit'])) {
    if ($_COOKIE['addtips'] != $_POST['code']) {
        echo "请不要刷新本页面或重复提交表单";
        exit();
    }
}
$smarty->assign('code', $code);
?>

10./////防止表单重复提交

在tpl模板中

1. <input type="hidden" name="code" value="{$code}"/>

<?php
/*利用PHP的Session功能,也能避免PHP表单重复提交。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交
*/
session_start(); //根据当前SESSION生成随机数
$code = mt_rand(0, 1000000);
$_SESSION['code'] = $code;
//在表单中隐藏传递:
 < inputtype = "hidden"name = "originator"value = "< ?=$code?>" >
//在接收页代码如下:
session_start();
if (isset($_POST['originator'])) {
    if ($_POST['originator'] == $_SESSION['code']) {
        // 处理该表单的语句,省略
        
    } else {
        echo '请不要刷新本页面或 
重复提交表单!';
    }
}
?>


永久链接:http://www.phprm.com/develop/53657.html

转载随意!带上文章地址吧。

标签:select

相关文章

发表留言