1
<?php
if (!isset($_SESSION)) {
        session_start();
}
// anti flood protection
if($_SESSION['last_session_request'] > time() - 2){
        // users will be redirected to this page if it makes requests faster than 2 seconds
        header("location: http://www.example.com/403.html");
        exit;
}
$_SESSION['last_session_request'] = time();
?>

我已经测试了这个脚本,因为你第二个它会继续重定向到http://www.example.com/403.html没有任何理由。

谁能告诉我为什么?

4

9 回答 9

8

让我们从逻辑上考虑一下……

攻击者的请求已经被发送到 Web 服务器并通过 PHP 脚本。导致 DDoS 攻击失败的瓶颈是 Web 服务器。

DDoS 攻击背后的想法就是 - 导致拒绝服务,其中网站/服务器无法处理任何新请求。所以从本质上讲,这种做法是不合理的。您需要爬上请求处理的阶梯。

如果您有一台服务器供您使用,那就更容易了。您可以简单地在内核防火墙/iptables 上实现速率限制规则。但是假设您无法访问它,Apache 仍然可以使用 - 尽管效率不高。

在 .htaccess 中实现规则是一个更好的解决方案,但仍然不完美。但是根据 DDoS 攻击,开发人员没有真正的解决方案可以阻止它。

于 2012-09-23T16:01:34.840 回答
2

我正在使用一个很好的防洪脚本,它不需要 cookie(非常适合 web 服务)。它对高级 DDOS 攻击并不完美,但足以防止初学者攻击和自动多个请求。

为了使用它,在需要创建“flood”文件夹之前,里面有一个“ctrl”文件和一个“lock”子文件夹。还需要设置正确的权限。

已经被我测试过了。

define("SCRIPT_ROOT", dirname(__FILE__));

// number of allowed page requests for the user
define("CONTROL_MAX_REQUESTS", 3);
// time interval to start counting page requests (seconds)
define("CONTROL_REQ_TIMEOUT", 2);
// seconds to punish the user who has exceeded in doing requests
define("CONTROL_BAN_TIME", 5);
// writable directory to keep script data 
define("SCRIPT_TMP_DIR", SCRIPT_ROOT."/flood");
// you don't need to edit below this line
define("USER_IP", $_SERVER["REMOTE_ADDR"]);
define("CONTROL_DB", SCRIPT_TMP_DIR."/ctrl");
define("CONTROL_LOCK_DIR", SCRIPT_TMP_DIR."/lock");
define("CONTROL_LOCK_FILE", CONTROL_LOCK_DIR."/".md5(USER_IP));
@mkdir(CONTROL_LOCK_DIR);
@mkdir(SCRIPT_TMP_DIR);


if (file_exists(CONTROL_LOCK_FILE)) {
    if (time()-filemtime(CONTROL_LOCK_FILE) > CONTROL_BAN_TIME) {
        // this user has complete his punishment
        unlink(CONTROL_LOCK_FILE);
    } else {
        // too many requests
        echo "<h1>DENIED</h1>";
        echo "Please try later.";
        touch(CONTROL_LOCK_FILE);
        die;
    }
}

function antiflood_countaccess() {
    // counting requests and last access time
    $control = Array();

    if (file_exists(CONTROL_DB)) {
        $fh = fopen(CONTROL_DB, "r");
        $control = array_merge($control, unserialize(fread($fh, filesize(CONTROL_DB))));
        fclose($fh);
    }

    if (isset($control[USER_IP])) {
        if (time()-$control[USER_IP]["t"] < CONTROL_REQ_TIMEOUT) {
            $control[USER_IP]["c"]++;
        } else {
            $control[USER_IP]["c"] = 1;
        }
    } else {
        $control[USER_IP]["c"] = 1;
    }
    $control[USER_IP]["t"] = time();

    if ($control[USER_IP]["c"] >= CONTROL_MAX_REQUESTS) {
        // this user did too many requests within a very short period of time
        $fh = fopen(CONTROL_LOCK_FILE, "w");
        fwrite($fh, USER_IP);
        fclose($fh);
    }
    // writing updated control table
    $fh = fopen(CONTROL_DB, "w");
    fwrite($fh, serialize($control));
    fclose($fh);
}

取自这里: https ://github.com/damog/planetalinux/blob/master/www/principal/suscripcion/lib/antiflood.hack.php

于 2015-01-24T00:07:39.490 回答
0

有一个名为IOSec的脚本,它已经很老了,但它可能会有所帮助。

于 2013-11-16T15:20:11.977 回答
0

对于停止 DDos,为该 ip 添加一个空路由,如下所示:

route add -host ???.???.???.??? reject
于 2013-10-19T16:12:56.170 回答
0

spudinksi 所说的仍然适用,但这是您要寻找的内容:

 <?php


 if (!isset($_SESSION)) {
         session_start();
 }

 if($_SESSION['last_session_request'] > (time() - 5)){
    if(empty($_SESSION['last_request_count'])){
        $_SESSION['last_request_count'] = 1;
    }elseif($_SESSION['last_request_count'] < 5){
        $_SESSION['last_request_count'] = $_SESSION['last_request_count'] + 1;
    }elseif($_SESSION['last_request_count'] >= 5){
            header("location: http://www.example.com/403.html");
            exit;
         }
 }else{
    $_SESSION['last_request_count'] = 1;
 }

 $_SESSION['last_session_request'] = time();

 ?>
于 2012-09-23T16:37:55.357 回答
0

只需更改><

<?php        

if (!isset($_SESSION)) {
        session_start();
}
// anti flood protection
if($_SESSION['last_session_request'] < time() - 2){
        // users will be redirected to this page if it makes requests faster than 2 seconds
        header("location: http://www.example.com/403.html");
        exit;
}
$_SESSION['last_session_request'] = time();
?>
于 2012-09-23T15:44:28.087 回答
0

这将计算页面重新加载并在 3 秒后节省时间..如果它给新手带来问题或容易绕过然后发表评论..

if(empty($_SESSION['AFsys_time']) || $_SESSION['AFsys_time'] == '0') {
    $tGoal = time() + 3; // Pluss Seconds
    $_SESSION['AFsys_time'] = $tGoal;
}

if(empty($_SESSION['AFsys_pReloads']) || $_SESSION['AFsys_pReloads'] == 0 ) { $_SESSION['AFsys_pReloads'] = 1; } else { $_SESSION['AFsys_pReloads']++; };

if($_SESSION['AFsys_time'] < time()){
    $_SESSION['AFsys_time'] = 0; // Session Reset
    $_SESSION['AFsys_pReloads'] = 0; // Session Reset
}

if($_SESSION['AFsys_pReloads'] > '5' && $_SESSION['AFsys_time'] > time()){
    $_SESSION['AFsys_time'] = 0; // Session Reset
    $_SESSION['AFsys_pReloads'] = 0; // Session Reset
    header("location: http://www.example.com/403.html");
    exit; 
}
于 2015-09-10T16:38:03.437 回答
-1

此代码不适用于这样的 curl 循环。session 将在每个 curl exec 上再次创建;

for ($i=0;$i<999999999999999;$i++){

    /**/
    $c=curl_init();
    curl_setopt($c,CURLOPT_URL,"URL YOU WANT ATTACK");
    curl_setopt($c,CURLOPT_DNS_USE_GLOBAL_CACHE,TRUE);//dns
    curl_setopt($c,CURLOPT_HEADER,0);//get the header
    curl_setopt($c,CURLOPT_CONNECTTIMEOUT ,10);//get the header
    curl_setopt($c,CURLOPT_NOBODY,0);//and *only* get the header
    curl_setopt($c,CURLOPT_RETURNTRANSFER,1);//get the response as a string from curl_exec(), rather than echoing it
    curl_setopt($c,CURLOPT_FRESH_CONNECT,1);//don't use a cached version of the url
    curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0');
    curl_setopt($c, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded;charset=UTF-8' ));

    echo "\n $i";

}
于 2013-11-14T18:43:27.567 回答
-1

会话可能不起作用,因为我们还没有会话 cookie。

我推荐这样的

$load = sys_getloadavg();
if ($load[0] > 20) {
    header('HTTP/1.1 503 Too busy, try again later');
    die('Server too busy. Please try again later.');
}

或者你可以

shell_exec('/sbin/iptables -I INPUT -j DROP -s ' . $ip);

用于加药 $ip

于 2015-07-11T17:16:54.000 回答