php通过token验证表单重复提交

PHP防止重复提交表单

2016-11-08 轻松学PHP

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

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手,首先从前端做限制。前端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{

?>

<form method="post" action="">

<input type="hidden" name="token" value="<?php echo $_SESSION[‘token‘]?>">

<input type="text" class="input" name="web" value="www.helloweba.com">

<input type="submit" class="btn" value="提交" />

</form>

<?php

}

?>

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

时间: 2024-09-28 20:34:00

php通过token验证表单重复提交的相关文章

PHP生成token防止表单重复提交

1.提交按钮置disabled 当用户提交后,立即把按钮置为不可用状态.这种用js来实现. 提交前代码如下: $("#submit").attr('disabled','true'); $("#submit").val("正在提交,请稍等"); 执行后,把按钮置为原来状态 代码如下: $('#submit ').removeAttr('disabled'); $("#submit ").val("确定提交"

PHP简单利用token防止表单重复提交

<?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_SESSION['token'] = md5(microtime(true)); } function valid_token() { $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false; set_token(); retur

struts2 自带的 token防止表单重复提交拦截器

在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name="token"></interceptor-ref> <result name="invalid.token">/error.jsp</result> 2. 增加error.jsp文件,代码如下:  <h1>禁止重复提交&l

token防止表单重复提交

出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; import java.io.IOException; import java.io.PrintWriter; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServle

【struts2】struts防止表单重复提交

一.概述 表单重复提交已经存在很久了,也有很多讨论.防止表单重复提交主要是防止"服务器处理慢时的页面刷新",以及浏览器后退后再次提交,甚至是点击提交按钮的时候手快点了很多次. 常用的JS将提交按钮设置成disabled,这种防止不了页面刷新,重定向防止不了浏览器后退后重复提交,两者结合也没用. struts2采用的是页面hidden+session来实现防止重复提交,通过拦截器token或或tokenSession来说hi线,其思想很简单,本文主要是讨论实现代码中涉及的细节. 二.原理

Struts防止表单重复提交

1.什么是表单重复提交 > 在不刷新表单页面的前提下:         >> 多次点击提交按钮        >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".        >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)" > 注意:        >> 若刷新表单页面, 再提交表单不算重复提交        >> 若使

Struts2系列:(13)防表单重复提交(token + 拦截器)

1.原理 服务器端和客户端通过token(令牌)来进行验证: (1)Browser向Tomcat服务器请求填写表单 (2)Tomcat服务器将带有token的表单返回给Browser (3)浏览器端在提交时,将form和token一起发送到服务器 (4)Tomcat服务器对Browser进行验证 2.基本步骤 基本步骤如下: 第一步:写好Action,在struts.xml为接受该表单提交请求的action配置token拦截器[服务器] <action name="student_*&qu

Jfinal token拦截器另类实现,防止表单重复提交

大部分的操作和jfinal原来的是相似的 在跳转到view之前,生成token createToken("jockillerToken", 30*60); 2.在页面中加入隐藏域,内容如下 <input type="hidden" name="jockillerToken" value="${jockillerToken}"/> 3.定义token拦截器,这就是唯一的一点不同的地方 /**  * 防止表单重复提交

表单重复提交问题

一.常见的重复提交问题  a>点击提交按钮两次.  b>点击刷新按钮.  c>使用浏览器后退按钮重复之前的操作,导致重复提交表单.  d>使用浏览器历史记录重复提交表单.  e>浏览器重复的HTTP请求. 二.防止表单重复提交原理 提交表单的时候提交一份随机的字符串或随机数字等等,再把这个随机的数据存到request里面,然后把表单数据提交,在后台验证的时候判断提交的这两份额外的数据是否一致,如果一致,则把其中一份删除掉,这么做的目的是防止再次提交,继续进行操作,如果不一致,