转盘抽奖分享得积分,防止页面被恶意
< 返回列表时间: 2020-06-10来源:OSCHINA
恶意刷新
恶意刷新就是不停的去刷新提交页面,导致出现大量无效数据,这类问题在实际应用中我们经常遇到,比如一个活动的分享得积分,刷票,刷红包等等,遇到这些问题,你是如何去防止的。

当你在做一个刷红包的活动,或者一个分享得积分的活动时,频繁的被刷新会导致数据库吃紧,严重时会导致系统死机。遇到这方面你是如何防止恶意刷新页面的,说白了也就是恶意刷新你创建的链接。

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

我们可以从session方面防止用户恶意刷新。
代码如下:

方案一:
<?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 ; } ?>

方案二:
<?php session_start (); $allow_sep = "2" ; if ( isset ( $_SESSION [ "post_sep" ])) {    if ( time () - $_SESSION [ "post_sep" ] < $allow_sep ) {    exit ( "请不要频繁刷新,休息2秒再刷新吧" );    }    else {    $_SESSION [ "post_sep" ] = time ();    } } else { $_SESSION [ "post_sep" ] = time (); } ?>

方案三:
<?php session_start (); if ( ! empty ( $_POST [ name ])){ $data = $_POST [ name ]; $tag = $_POST [ tag ]; if ( $_SESSION [ status ] == $tag ){ echo $data ; } else { echo "不允许刷新!" ; } } $v = mt_rand ( 1 , 10000 ); ?> < form method = "post" name = "magic" action = "f5.php" > < input type = "hidden" name = "tag" value = " <? = $v ?> " > < input type = text name = "name" > < input type = "submit" value = "submit" > </ form > <?php echo $v ; $_SESSION [ status ] = $v ; ?>
上面的代码是基于 session的验证,假设你在2秒内刷新了页面,那么他会执行exit() 函数输出一条消息,并退出当前脚本,于是就不会加载下面的内容,所以这段代码最好放在header中,先让代码执行,再加载其他的东西。
如果把代码放在了footer里,结果整个页面都加载了只在最后一行输出了"请不要频繁刷新",放在header中,效果比较好,想看效果的话按两下F5 吧。当然最好的是采用的是新建一个php文件,然后在header调用。

这样做的好处有两个:
一个是修改功能代码方便,不用每次都打开header文件,也不怕误改了其他地方的代码,二是一旦出错,可以快速修改并检查,甚至可以直接删除文件。

代码如下:
<?php include ( 'includes/forbiddenCC.php' ); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
你也可以结合cookie与session一起用,代码如下:利用文件存储数据
<?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 ); } ?>
这里读取数据
<?php //使用文本存储数据 if ( $_SESSION [ temp ] == "" ){ if (( $fp = fopen ( "counter.txt" , "r" )) == false ){ echo "打开文件失败!" ; } else { //读取文件中数据 $counter = fgets ( $fp , 1024 ); //关闭文本文件 fclose ( $fp ); //计数器增加1 $counter ++ ; //以写的方式打开文本文件 $fp = fopen ( "counter.txt" , "w" ); //将新的统计数据增加1 fputs ( $fp , $counter ); fclose ( $fp ); } //从文本文件中读取统计数据 if (( $fp = fopen ( "counter.txt" , "r" )) == false ){ echo "打开文件失败!" ; } else { $counter = fgets ( $fp , 1024 ); fclose ( $fp ); //输出访问次数 echo "数字计数器: " . $counter ; } //登录以后,$_SESSION[temp]的值不为空,给$_SESSION[temp]赋一个1 $_SESSION [ temp ] = 1 ; } else { echo "<script>alert(" 您不可以刷新本页 !! "); history.back();</script>" ; } ?>
其中counter.txt 文件为同目录下的记录登录数文件。
$counter=fgets($fp,1024); 为读取文件中数值型值的方法(可包含小数点数值)

热门排行