page contents

转盘抽奖分享得积分,防止页面被恶意

以下内容希望帮助到大家!

attachments-2020-06-K633nncu5ee0495f2d9a0.png


恶意刷新

恶意刷新就是不停的去刷新提交页面,导致出现大量无效数据,这类问题在实际应用中我们经常遇到,比如一个活动的分享得积分,刷票,刷红包等等,遇到这些问题,你是如何去防止的。

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


下面我们来看看防止恶意刷页面的原理:

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); 为读取文件中数值型值的方法(可包含小数点数值)


想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-06-KdH4L3Xq62a1b5cec356f.jpeg

  • 发表于 2020-06-10 10:46
  • 阅读 ( 438 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章