PHP防止重复提交表单

* 我们提交表单的时候,
* 不能忽视的一个限制是防止用户重复提交表单,
* 因为有可能用户连续点击了提交按钮
* 或者是攻击恶意提交数据,
* 那么我们在提交数据后的处理,
* 如修改或添加到数据库时就会惹上麻烦。
* 那么如何规避这种重复提交表单的现象出现呢?
* 我们可以从很多方面入手,首先从前端做限制。
* 第一:前端JavaScript在按钮被点击一次后禁用,即disabled,
*      这个方法简单的防止了多次点击提交按钮,
*      但是缺点是如果用户禁用了javascript脚本则失效。
* 第二:我们可以在提交后做redirect页面重定向,
*      即提交后跳转到新的页面,
*      主要避免F5重复提交,
*      但是也有不足之处。
* 第三:数据库做唯一索引约束。
* 第四:做session令牌验证。

我们现在来了解下简单的利用session token来防止表单重复提交的方法。

我们在表单中加一个input隐藏域,即type="hidden",其value值用来保存token值,当页面刷新的时候这个token值会变化,提交后判断token值是否正确,如果前台提交的token与后台不匹配,则认为是重复提交。

<?php
/**
 * Created by PhpStorm.
 * User: 52818
 * Date: 2019/7/22
 * Time: 14:18
 */

/**
 * PHP简单例用token防止表单重复提交
 */
session_start();
header("Content-type:text/html;charset=gb2312");

/*
 * 方法或函数命名规则
 * a。首字母小写;
 * b。多个单词间不使用间隔,除第一个单词外,其他单词首字母大写。
 * */
function setToken(){
    $_SESSION['token'] = md5(microtime(true));
}

function validToken(){
    $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;
    //验证后,更新token。
    //这样第二次提交过来,老token和新token不一样,就可以检测是否是重复提交。
    setToken();
    return $return;
}

// 如果token为空则生成一个token
if ( !isset($_SESSION['token']) || $_SESSION['token'] == '' ){
    setToken();
}


if ( isset($_POST['web']) ){
    if ( !validToken() ){
        echo "token error, 请不要重复提交!";
    } else {
        echo "成功提交,Value:" . $_POST['web'];
    }
} else {
?>
    <form method="post" action="">
        <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>">
        <input type="text" class="input" name="web" value="www.baidu.com">
        <input type="submit" class="btn" value="提交" />
    </form>


<?php
}
?>
以上是一个简单的防止重复提交表单的例子,仅供参考。
那么实际项目开发中,会对表单token做更复杂的处理,即我们说的令牌验证。
可能要做的处理有:验证来源域,即来路,是否为外部提交;
匹配要执行的动作,是添加、修改or删除;
其次最重要的是构建token,token可以采用可逆的加密算法,
尽可能复杂,因为明文还是不安全的。
令牌验证的具体算法可以参考各大PHP框架,如ThinkPHP提供了很好的令牌验证功能。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值