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

1、提交按钮置disabled

当用户提交后,立即把按钮置为不可用状态。这种用js来实现。

提交前代码如下:

$("#submit").attr(‘disabled‘,‘true‘);

$("#submit").val("正在提交,请稍等");

执行后,把按钮置为原来状态

代码如下:

$(‘#submit ‘).removeAttr(‘disabled‘);

$("#submit ").val("确定提交");

这样只是针对一些简单的前台提交了,如果我们自己做个表单站长提交给我们php逻辑层文件就过滤这那个js了。

过期时间法

用户提交按钮后生成一个token(每次业务提交token 为唯一值)存入session,并设置过期时间。当用户再此提交时,检测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();

return $return;

}

//如果token为空则生成一个token

if(!isset($_SESSION[‘token‘]) || $_SESSION[‘token‘]==‘‘) {

set_token();

}

if(isset($_POST[‘test‘])){

if(!valid_token()){

echo "token error";

}else{

echo ‘成功提交,Value:‘.$_POST[‘test‘];

}

}

?>

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

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

<input type="text" name="test" value="Default">

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

</form>

方法二

<?php

//开启session

session_start();

//如果有提交标识

if(isset($_GET[‘action‘]) && $_GET[‘action‘] === ‘save‘){

//如果有session且跟传过来的值一样才算提交

if(isset($_SESSION[‘__open_auth‘]) && isset($_POST[‘auth‘]) && $_SESSION[‘__open_auth‘] == $_POST[‘auth‘]){

print_r($_POST);

$_SESSION[‘__open_auth‘] = null;//清空

} else {

//走起

header("location: post.php");

}

exit();

}

//授权

$auth = $_SESSION[‘__open_auth‘] = time();

?>

<!doctype html>

<html>

<head>

<meta charset="UTF-8">

<title>post</title>

</head>

<body>

<form action="post.php?action=save" method="post">

<ul>

<li>

<input type="hidden" name="auth" value="<?php echo $auth;?>">

<input type="text" name="userName">

</li>

<li>

<input type="password" name="userpass">

</li>

<li>

<input type="submit" value="走起">

</li>

<li>

<?php echo time(); ?>

</li>

</ul>

</form>

</body>

</html>

mysql php数据库重复记录防止

<?php

$link=mysql_connect(‘localhost’,’root’,’root’); //得到MySQL数据库连接

$username=$_GET["name"]; //得到从客户端表单传过来的数据

$q="select * from usertable where user_name=‘$username‘";

mysql_query("SET NAMES gb2312"); //避免出现中文乱码

$rs = mysql_query($q, $link); //查询数据库

$num_rows = mysql_num_rows($rs); //得到查询结果的总行数

if($num_rows==0)

{

$exec="insert into student (user_name) values ($username)";

mysql_query("SET NAMES gb2312");

mysql_query($exec, $link); //若没有此用户则将数据插入到数据库(注册用户)

echo "用户注册成功!";

}

else

{

echo "该用户名已存在,请重新选择用户名!";

}

?>

session过期法有非常重要的一点是一个session设置与提交成功与不成功时的一个session验证了,这个有点像登录一样的如果登录成功了我们要清除session这个原理也差不多。

				
时间: 2024-11-03 14:51:32

PHP生成token防止表单重复提交的相关文章

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

PHP防止重复提交表单 2016-11-08 轻松学PHP 我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手,首先从前端做限制.前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效.第二,

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

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 自带的 token防止表单重复提交拦截器

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

【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拦截器,这就是唯一的一点不同的地方 /**  * 防止表单重复提交

防表单重复提交

防表单重复提交 1.令牌生成器 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Random; import sun.misc.BASE64Encoder; public class TokenProccessor { /* *单例设计模式(保证类的对象在内存中只有一个) *1.把类的构造函数私有 *2.自己创建一个类的对象 *3.对外提供一个公