首页 php教程 php手册 PHP利用session与cookies防重复提交实例

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

May 25, 2016 pm 04:54 PM
select

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

防止刷新或再交提交

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

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

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

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

当 time_passed

<?php
session_start();
$k = $_GET[&#39;k&#39;];
$t = $_GET[&#39;t&#39;];
//防刷新时间
$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[&#39;name&#39;]引用,也许在处理完表单后,直接将$_POST[&#39;name&#39;]销毁(unset())即可。其实不然。可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST[&#39;name&#39;],刷新后,$_POST[&#39;name&#39;]还是会被赋值,一样有效。   
    可利用Session解决。首先给Session赋个值,比如400,第一次提交成功后改变Session的值,当第二次提交时去检查这个Session 的值,如果不是400,就不再处理表单中的数据。 
    可设置Session的有效时间?    
*/
if (isset($_POST[&#39;action&#39;]) && $_POST[&#39;action&#39;] == &#39;submitted&#39;) {
    session_start();
    isset($_SESSION[&#39;num&#39;]) or die("no session");
    if ($_SESSION[&#39;num&#39;] == 400) {
        print &#39;<pre class="brush:php;toolbar:false">&#39;;
        print_r($_POST);
        print &#39;<a href="&#39; . $_SERVER[&#39;PHP_SELF&#39;] . &#39;">Please try again</a>&#39;;
        print &#39;
登录后复制
'; $_SESSION['num'] = 500; } else { print '
&#39;;
        print_r($_POST);
        echo "However you have submitted";
        print &#39;
登录后复制
'; } } else { session_start() or die("session is not started"); $_SESSION['num'] = 400; ?>
Name:
Email:
Beer:

例,一个基于smarty演示版

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

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

在tpl模板中

1.

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


永久链接:

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用golang进行Select Channels Go并发式编程的异步处理方法 使用golang进行Select Channels Go并发式编程的异步处理方法 Sep 28, 2023 pm 05:27 PM

使用golang进行SelectChannelsGo并发式编程的异步处理方法引言:并发式编程是现代软件开发中的一个重要领域,它可以有效地提高应用程序的性能和响应能力。在Go语言中,使用Channels和Select语句可以简单而高效地实现并发编程。本文将介绍如何使用golang进行SelectChannelsGo并发式编程的异步处理方法,并提供具体的

jquery如何隐藏select元素 jquery如何隐藏select元素 Aug 15, 2023 pm 01:56 PM

jquery隐藏select元素的方法:1、hide()方法,在HTML页面中引入jQuery库,可以使用不同选择器来隐藏select元素,ID选择器将selectId替换为你实际使用的select元素的ID;2、css()方法,使用ID选择器选择需要隐藏的select元素,使用css()方法将display属性设置为none,并将selectId替换为select元素的ID。

jQuery中如何实现select元素的改变事件绑定 jQuery中如何实现select元素的改变事件绑定 Feb 23, 2024 pm 01:12 PM

jQuery是一个流行的JavaScript库,可以用来简化DOM操作、事件处理、动画效果等。在web开发中,经常会遇到需要对select元素进行改变事件绑定的情况。本文将介绍如何使用jQuery实现对select元素改变事件的绑定,并提供具体的代码示例。首先,我们需要使用标签来创建一个包含选项的下拉菜单:

linux要用select的原因是什么 linux要用select的原因是什么 May 19, 2023 pm 03:07 PM

因为select可以使开发者在同时等待多个文件缓冲区,可减少IO等待的时间,能够提高进程的IO效率。select()函数是IO多路复用的函数,允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态;所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类IO操作了,包括可读,可写,发生异常三种。select是一个计算机函数,位于头文件#include。该函数用于监视文件描述符的变化情况——读写或是异常。1.select函数介绍select函数是IO多路复用的函

mysql的select语法怎么使用 mysql的select语法怎么使用 Jun 01, 2023 pm 07:37 PM

1、SQL语句中的关键词对大小写不敏感,SELECT等效于SELECT,FROM等效于from。2、从users表中选择所有列的,可以用符号*代替列的名称。语法--这是注释--从FEOM指定的[表中],查询出[所有的]数据.*表示[所有列]SELECT*FROM--通过从FROM从指定的[表中],查询出指定列名称(字段)的数据SELECT列名称FROM表名称实例--注意:多个列之间,使用英文的逗号来分隔selectusername,passwordfrom

通过golang实现Select Channels Go并发式编程的性能优化 通过golang实现Select Channels Go并发式编程的性能优化 Sep 27, 2023 pm 01:09 PM

通过golang实现SelectChannelsGo并发式编程的性能优化在Go语言中,使用goroutine和channel实现并发编程是非常常见的。而在处理多个channel的情况下,我们通常会使用select语句来进行多路复用。但是,在大规模并发的情况下,使用select语句可能会导致性能下降。在本文中,我们将介绍一些通过golang实现select

使用golang实现可靠性和鲁棒性的Select Channels Go并发式编程 使用golang实现可靠性和鲁棒性的Select Channels Go并发式编程 Sep 28, 2023 pm 05:37 PM

使用Golang实现可靠性和鲁棒性的SelectChannelsGo并发式编程引言:在现代软件开发中,并发性已经成为了一个非常重要的主题。使用并发编程可以使得程序更具有响应性、更高效地利用计算资源,并且能够更好地处理大规模的并行计算任务。Golang是一种非常强大的并发编程语言,它通过go协程和channel机制,提供了一种简单而有效的方式来实现并发编程

如何使用golang进行Select Channels Go并发式编程 如何使用golang进行Select Channels Go并发式编程 Sep 27, 2023 pm 09:07 PM

如何使用golang进行SelectChannelsGo并发式编程Go语言是一种非常适合进行并发编程的语言,其中的通道(Channel)和Select语句是实现并发的两个重要要素。本文将介绍如何使用golang的SelectChannels进行并发编程,并提供具体的代码示例。一、通道(Channel)的概念通道是用来在goroutine之间进行通信和数

See all articles