网页快速恶意刷新, cc 攻击就是攻击者利用代理服务器生成指向目标站点的合法请求, 模拟多用户不停的对受害网站进行访问, 特别是访问那些需要大量数据操作需要大量 CUP 时间的页面, 最终导致目标网站服务器资源耗尽, 一直到宕机崩溃, 如此一来, 造成服务器资源的浪费, CPU 长时间处于 100%, 永远都有处理不完的连接直至就网络拥塞, 正常的访问被中止我们称之为 CC 攻击尽管我们可以借助于一些防攻击的软件来实现, 不过效果有时并不明显
下面我提供一段 PHP 的代码, 可以起到一定的防 CC 攻击效果
主要功能: 在 3 秒内连续刷新页面 5 次以上将指向本机 http://127.0.0.1
只需将该代码放到需要防 CC 攻击的页面即可
源码
- <?php
- $timestampcc = time();
- $cc_nowtime = $timestampcc;
- if(session_is_registered('cc_lasttime')){
- $cc_lasttime = $_SESSION['cc_lasttime'];
- $cc_times = $_SESSION['cc_times']+1;
- $_SESSION['cc_times'] = $cc_times;
- }else{
- $cc_lasttime = $cc_nowtime;
- $cc_times = 1;
- $_SESSION['cc_times'] = $cc_times;
- $_SESSION['cc_lasttime'] = $cc_lasttime;
- }
- if(($cc_nowtime-$cc_lasttime)<3){//3 秒内刷新 5 次以上可能为 cc 攻击
- if($cc_times>=5){
- echo '刷新太快!';
- exit;
- }
- }else{
- $cc_times = 0;
- $_SESSION['cc_lasttime'] = $cc_nowtime;
- $_SESSION['cc_times'] = $cc_times;
- }
- ?>
下面是为大家整理的 PHP 防 CC 攻击的有效方法:
1.session 记录
submit.php 为发送页面, 在这个页面上设置一个 session 变量, 并作为隐藏域和表单一起发送到 submitdeal.php 页面, 在服务器端把 post 上来的隐藏变量和服务器端记录的 session 变量进行对比, 比如一样, 则写入数据库并清除 session, 这样用户刷新页面, 两个值不相等提示错误或跳转
优点: 不用用户输入验证码
缺点: 表单容易被复制
2. 验证码
原理和第一种一样, 只是 session 数据不作为隐藏域提交, 而是让用户填写, 大多数网站都采用文字验证码和图片验证码, 图片验证码安全性高
3.IP 绑定
提交数据后, 先从 IP 表里检索客户端 IP, 如果有, 并且没有过期, 那么报错, 否则写入数据库, 然后再取客房端 IP, 把 IP 写入数据库
4.cookie: 客户提交后处理程序先检索客户端有没有设置 cookie, 如果有, 则不重复提交; 如果没有, 则写数据, 再写个 cookie;
例:
用户无意义的频繁跳转请求都会给服务器加重很多负担 其实 用 cookie 就可以防止这一点
- <?php
- error_reporting(0);
- //if($_COOKIE["ck"])die("刷新过快!");
- if($_COOKIE["ck"])header("Location:http://www.baidu.com");// 这里如果用户刷新过快, 给予终止 php 脚本或者直接 302 跳转
- setcookie("ck","1",time()+3);// 设定 cookie 存活时间 3s
- echo "hello!";
- ?>
方式一:
- <?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;
- }
- ?>
方式二:
- <?
- session_start();
- if(!emptyempty($_POST[name])){
- $data = $_POST[name];
- $tag = $_POST[tag];
- if($_SESSION[status]==$tag){
- echo $data;
- }else{
- echo "不允许刷新!";
- }
- }
- $v = mt_rand(1,10000);
- ?>
- <?
- echo $v;
- $_SESSION[status] = $v;
- ?>
方式三:
- <?
- session_start();
- if(!emptyempty($_POST[name])){
- $data = $_POST[name];
- $tag = $_POST[tag];
- if($_SESSION[status]==$tag){
- echo $data;
- }else{
- echo "不允许刷新!";
- }
- }
- $v = mt_rand(1,10000);
- ?>
- <?
- echo $v;
- $_SESSION[status] = $v;
- ?>
以上就是 php 防止 CC 攻击的多种方式, 希望能帮助大家防止网页快速恶意刷新
来源: https://www.php1.cn/detail/php-063d8a2ae6.html