php防止恶意刷新与刷票的方法


Posted in PHP onNovember 21, 2014

本文实例讲述了php防止恶意刷新与刷票的方法。分享给大家供大家参考。具体实现方法如下:

一般来说,恶意刷新就是不停的去刷新提交页面,导致出现大量无效数据,下面我们来总结一下php 防止恶意刷新页面方法总结。

防止恶意刷页面的原理是:

要求在页面间传递一个验证字符串,
在生成页面的时候 随机产生一个字符串,
做为一个必须参数在所有连接中传递。同时将这个字符串保存在session中。
点连接或者表单进入页面后,判断session中的验证码是不是与用户提交的相同,如果相同,则处理,不相同则认为是重复刷新。
在处理完成后将重新生成一个验证码,用于新页面的生成

PHP实现代码如下:

<?php 

session_start(); 

$k=$_GET['k']; 

$t=$_GET['t']; 

$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; 

} 

?>

ie6提交两次我也碰到过,大致是用图片代替submit时,图片上有个submit(),这样会提交两次,如果只是submit钮我没碰到过提交两次的情况。 现在整理一下:
方法基本上前面几位说得差不多

接收的页即2.php分为两部分,一部分处理提交过来的变量,一部分显示页面
处理变量完毕用header( "location: ".$_SERVER[ 'PHP_SELF '])跳转到自身页
本部分要做判断,如果没有post的变量就跳过。当然也可以跳到别的页面。
跳到别的页面返回时会有问题,建议做在一个php文件里。

如果上页穿过来得变量不符合要求可以强制返回 <script> history.go(-1); </script>

只说了一下大体思路,也许高手们不会遇到此类问题,可是并不是每个人都是高手。

if(isset($_POST)) 

{  

if(变量不符合要求) 

<script> history.go(-1); </script> 

else 

//操作数据 

... 

if(操作完成) 

header( "location: ".$_SERVER[ 'PHP_SELF ']); 

} 

<script language= "JavaScript "> 

<!-- 

 javascript:window.history.forward(1); 

//--> 

</script>

也可以利用COOKIE
<?php

$c_file="counter.txt"; //文件名赋值给变量

if(!file_exists($c_file)) //如果文件不存在的操作

{

$myfile=fopen($c_file,"w"); //创建文件

fwrite($myfile,"0"); //置入“0”

fclose($myfile); //关闭文件

}

$t_num=file($c_file); //把文件内容读入变量

if($_COOKIE["date"]!="date(Y年m月d日)") //判断COOKIE内容与当前日期是否一致

{

$t_num[0]++; //原始数据自增1

$myfile=fopen($c_file,"w"); //写入方式打开文件

fwrite($myfile,$t_num[0]); //写入新数值

fclose($myfile); //关闭文件

//重新将当前日期写入COOKIE并设定COOKIE的有效期为24小时

setcookie("date","date(Y年m月d日)",time()+60*60*24);

}

?>

利用session:
主页面文件 index.php 代码:
<?php

session_start();

?>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>通过session禁止页面刷新</title>

<style type="text/css">

<!--

.style1 {

font-size: 14px;

font-family: "华文仿宋";

font-weight: bold;

}

.style2 {font-family: "华文琥珀"}

-->

</style>

</head>

<body>

<?php

//使用文本存储数据

   if($_SESSION[temp]==""){

   if(($fp=fopen("counter.txt","r"))==false){ 

   echo "打开文件失败!";

     }else{ $counter=fgets($fp,1024);   //读取文件中数据

     fclose($fp);                        //关闭文本文件

     $counter++;                         //计数器增加1

     $fp=fopen("counter.txt","w");       //以写的方式打开文本文件

  

     fputs($fp,$counter);                //将新的统计数据增加1

     fclose($fp);    }                   //关闭文

//从文本文件中读取统计数据

       if(($fp=fopen("counter.txt","r"))==false){

       echo "打开文件失败!";

       }else{

        $counter=fgets($fp,1024);

        fclose($fp);

           echo "数字计数器: " .$counter ;

    }   //输出访问次数

     $_SESSION[temp]=1; //登录以后,$_SESSION[temp]的值不为空,给$_SESSION[temp]赋一个值1

     }else{

     echo "<script>alert('您不可以刷新本页!!'); history.back();</script>";

     }

?>

<table width="300" border="0" cellpadding="0" cellspacing="0" background="images/141.jpg">

<tr>

    <td height="35" align="center"><span class="style1">通过session禁止页面刷新</span></td>

</tr>

<tr>

    <td height="40" align="center"><span class="style2">

      <?php if(($fp=fopen("counter.txt","r"))==false){

      echo "打开文件失败!";

      }else{

        $counter=fgets($fp,1024);

        fclose($fp);

           echo "网页访问量: " .$counter ; 

    }   //输出访问次数

 ?>

    </span></td>

</tr>

<tr>

    <td height="25" align="center"> </td>

</tr>

</table>

</body>

</html>

其中:
counter.txt 文件为同目录下的记录登录数文件。
$counter=fgets($fp,1024);   为读取文件中 数值型值的方法(可包含小数点数值)

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
完美解决PHP中文乱码
Nov 26 PHP
php5 图片验证码实现代码
Dec 11 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
php 团购折扣计算公式
Nov 24 PHP
php异常处理使用示例
Feb 25 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PDO::lastInsertId讲解
Jan 29 PHP
php采用curl实现伪造IP来源的方法
Nov 21 #PHP
php文件缓存类汇总
Nov 21 #PHP
php实现事件监听与触发的方法
Nov 21 #PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 #PHP
IIS下PHP的三种配置方式对比
Nov 20 #PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 #PHP
php目录遍历函数opendir用法实例
Nov 20 #PHP
You might like
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python3图片文件批量重命名处理
2019/10/31 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
店长岗位职责
2013/11/21 职场文书
餐饮业会计岗位职责
2013/12/19 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
食品安全责任书
2014/04/15 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle
Ajax异步刷新功能及简单案例
2021/11/20 Javascript