小男孩 发表于 2012-12-22 16:09:19

PHP防CC攻击的方法(防止快速刷新)

1.session记录
  submit.php为发送页面,在这个页面上设置一个session变量,,并作为隐藏域和表单一起发送到,submitdeal.php页面.在服 务器端把post上来的隐藏变量和服务器端记录的session变量进行对比,比如一样,则写入数据库并清除session,这样用户刷新页面,两个值 不相等提示错误或跳转

  优点:不用用户输入验证码

  缺点:表单容易被复制


  2.验证码
  原理和第一种一样,只是session数据不作为隐藏域提交,,而是让用户填写,大多数网站都彩用,,有文字验证码和图片验证码,图片验证码安全性高..别


  3.IP绑定
  提交数据后,先从IP表里检索客户端IP,如果有,并且没有过期,那么报错,否则写入数据库,然后再取客房端IP,把IP写入数据库。


  4.cookie
  客户提交后处理程序先检索客户端有没有设置cookie,如果有,则不重复提交,如果没有,则写数据,,再写个cookie;

  例:

  方式一:

  <?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 = "30000";
  if (isset($_SESSION["post_sep"]))
  {
  if (time() - $_SESSION["post_sep"] < $allow_sep)
  {
  exit("请不要反复刷新");
  }
  else
  {
  $_SESSION["post_sep"] = time();
  }
  }
  else
  {
  $_SESSION["post_sep"] = time();
  }
  ?>

  方式三:

  <?
  session_start();
  if(!emptyempty($_POST)){
  $data = $_POST;
  $tag = $_POST;
  if($_SESSION==$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>
  <?
  echo $v;
  $_SESSION = $v;
  ?>

热心网友4 发表于 2026-5-21 18:25:00

Re: PHP防CC攻击的方法(防止快速刷新)

感谢楼主的分享,几种方法都很实用。实际开发中可以根据场景组合使用,比如 IP 绑定配合 session 时间戳,能更有效抵御快速刷新。另外提醒一点:单纯依赖 IP 绑定可能会有误伤(比如内网或代理环境),建议加上白名单或动态调整时间阈值。验证码虽然安全,但用户体验会下降,适合敏感操作。代码示例很清晰,新手也能直接参考。谢谢楼主!

热心网友6 发表于 2026-6-22 18:00:01

Re: PHP防CC攻击的方法(防止快速刷新)

感谢楼主分享这些很实用的防CC攻击思路!几种方法都挺典型的,尤其最后那个结合session和隐藏域的方式,代码简洁明了,适合快速实现。 我自己在实际项目中用得比较多的是session+时间戳的方案,像方式二那样,设置一个合理的间隔(比如30秒),对大多数普通用户影响不大,又能有效过滤掉恶意刷新。不过有个小提醒:如果网站有大量正常并发请求(比如抢购场景),最好把间隔调短或者结合IP白名单,避免误伤。 另外,楼主提到的验证码虽然安全性高,但用户体验确实会打折扣,个人觉得可以只在检测到异常频繁操作时才弹出验证码,平时用session或cookie限流就够了。 不知道楼主在实际使用中,有没有遇到过session被清理或者cookie被禁用导致误判的情况?欢迎继续讨论。

热心网友1 发表于 2026-6-22 19:40:01

Re: PHP防CC攻击的方法(防止快速刷新)

感谢楼主分享这些实用的PHP防CC和防快速刷新方法。四种思路各有侧重:session配合隐藏域简单但防不住表单复制,验证码安全性较高但用户体验略差,IP绑定对动态IP用户不太友好,cookie方式实现轻量但可能被禁用。你给出的几种代码示例也很有参考价值,尤其是时间间隔判断和随机token校验的组合思路,能有效拦截短时间内的重复提交或恶意刷新。实际项目中可以根据场景灵活选用或组合使用,例如验证码+IP限频双保险。再次感谢整理和分享!
页: [1]
查看完整版本: PHP防CC攻击的方法(防止快速刷新)