资讯专栏INFORMATION COLUMN

PHP防止用户重复提交表单

zengdongbao / 2702人阅读

摘要:我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。我们现在来了解下简单的利用来防止表单重复提交的方法。

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手:

首先从前端做限制。前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效。

第二,我们可以在提交后做redirect页面重定向,即提交后跳转到新的页面,主要避免F5重复提交,但是也有不足之处。

第三,就是数据库做唯一索引约束。

第四,就是做session令牌验证。

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

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

< ?php
/ PHP简单利用token防止表单重复提交 */
session_start();
header("Content-Type: text/html;charset=utf-8");
function set_token() {
$_SESSION["token"] = md5(microtime(true));
}
function valid_token() {
$return = $_REQUEST["token"] === $_SESSION["token"] ? true: false;
set_token();
return $return;
}
//如果token为空则生成一个token
if(!isset($_SESSION["token"]) || $_SESSION["token"]=="") {
set_token();
}
if(isset($_POST["web"])){
if(!valid_token()){
echo "token error,请不要重复提交!";
}else{
echo "成功提交,Value:".$_POST["web"];
}
}else{
?>
}
?>

以上是一个简单的防止重复提交表单的例子。

那么实际项目开发中,会对表单token做更复杂的处理,即我们说的令牌验证。可能要做的处理 有:验证来源域,即来路,是否为外部提交;匹配要执行的动作,是添加、修改or删除;其次最重要的是构建token,token可以采用可逆的加密算法, 尽可能复杂,因为明文还是不安全的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22736.html

相关文章

  • php表单加入Token防止重复提交

    摘要:下次客户端提交请求时,会随着表单一起提交到服务器端。简单利用防止表单重复提交此处理方法纯粹是为了给初学者参考如果为空则生成一个成功提交,提交 Token浅谈Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方——防止表单重复提交、anti csrf攻击(跨站点请求伪造)。两者在原理上都...

    william 评论0 收藏0
  • PHP 防止表单重复提交

    摘要:框架很多框架都有防止重复提交的功能,大家应该都有了解,这里不再赘述。后端也就是使用进行验证,当然不局限以下几种用户提交表单到后端,在中做标记,指定时间内重复提交无效。 导语 说来惭愧,前几天做项目的时候,出现个低级错误。在公司后台做表单提交,一是自己员工用,二是 html 自己来写的,没有验证表单重复提交,结果出错了。写出来记录下以便提醒自己,时刻不能疏忽。 解决方法 其实方法有很多种...

    wushuiyong 评论0 收藏0
  • php表单提交后再后退 内容则默认清空的解决方法

    摘要:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。指示客户机可以接收生存期不大于指定时间以秒为单位的响应。指示客户机可以接收超出超时期间的响应消息。 转载原文地址: http://www.jquerycn.cn/a_14422 在session_start()之后,字符输出之前加上header(Cac...

    Joyven 评论0 收藏0
  • php表单提交后再后退 内容则默认清空的解决方法

    摘要:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。指示客户机可以接收生存期不大于指定时间以秒为单位的响应。指示客户机可以接收超出超时期间的响应消息。 转载原文地址: http://www.jquerycn.cn/a_14422 在session_start()之后,字符输出之前加上header(Cac...

    hightopo 评论0 收藏0
  • 2018 PHP面试真题(包括详细解析)

    摘要:以下题目和解析分别来源于我的新书程序员面试笔试宝典程序员面试笔试真题解析。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。真题获得实例化对象所属类名字的函数是。 以下题目和解析分别来源于我的新书《PHP程序员面试笔试宝典》、《PHP程序员面试笔试真题解析》。 1、PHP常考基础 1、PHP与ASP、JSP有什么区别?ASP全名Active Server Page...

    pubdreamcc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<