Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的抗洪水DDoS_Php_Ddos - Fatal编程技术网

PHP中的抗洪水DDoS

PHP中的抗洪水DDoS,php,ddos,Php,Ddos,我已经对这个脚本进行了测试,你可以在它将继续重定向到的第二个更高的位置查看它http://www.example.com/403.html 没有任何理由 有人能告诉我为什么吗?换成换成让我们逻辑地思考一下 攻击者的请求已发送到web服务器并通过PHP脚本。 导致DDoS攻击失败的瓶颈是web服务器 DDoS攻击背后的理念就是——造成拒绝服务,即网站/服务器无法处理任何新请求。因此,在Essense中,这种方法是不合理的。 你需要走上请求处理的阶梯 如果你有一个服务器供你使用,那就容易多了。您可以

我已经对这个脚本进行了测试,你可以在它将继续重定向到的第二个更高的位置查看它http://www.example.com/403.html 没有任何理由


有人能告诉我为什么吗?

换成换成让我们逻辑地思考一下

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

DDoS攻击背后的理念就是——造成拒绝服务,即网站/服务器无法处理任何新请求。因此,在Essense中,这种方法是不合理的。 你需要走上请求处理的阶梯

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

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

让我们逻辑地思考一下

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

DDoS攻击背后的理念就是——造成拒绝服务,即网站/服务器无法处理任何新请求。因此,在Essense中,这种方法是不合理的。 你需要走上请求处理的阶梯

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

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

斯普丁克西所说的仍然是正确的,但以下是你想要的:

<?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();
?>

斯普丁克西所说的仍然成立,但以下是你想要的:

<?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();
?>

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

 <?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();

 ?>

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

 <?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();

 ?>

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

route add -host ???.???.???.??? reject

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

route add -host ???.???.???.??? reject

有一个名为的脚本,它很旧,但可能会有帮助。

有一个名为的脚本,它很旧,但可能会有帮助。

我使用的是一个很好的防洪水脚本,des不需要适合Web服务的Cookie。它对高级DDOS攻击并不完美,但足以防止初学者攻击和自动多个请求

为了使用它,在需要创建包含ctrl文件和锁定子文件夹的flood文件夹之前。还需要设置正确的权限

我已经测试过了

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";

}

摘自这里:

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

为了使用它,在需要创建包含ctrl文件和锁定子文件夹的flood文件夹之前。还需要设置正确的权限

我已经测试过了

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";

}

从这里开始:

会话可能不起作用,因为我们没有会话协作

我建议这样做

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);
}
或者你可以

$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.');
}

对于DDoS,使用$ip会话可能不起作用,因为我们没有会话协作

我建议这样做

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);
}
或者你可以

$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.');
}

对于使用$ip的DDoS,这将计算页面重新加载的次数,并在3秒后节省时间。。。。 如果它给新手带来了问题或容易绕过,请留下评论

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

这将计算页面重新加载的次数,并在3秒后节省时间。。。。 如果它给新手带来了问题或容易绕过,请留下评论

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

调试提示:在if语句之前回显变量,以确保它是您认为的。请尝试在没有if语句的情况下将第一行设置为session_start。我刚刚测试了这个脚本,它工作得非常好。它不会为我自己继续重定向。如果将秒数提高到8,它将继续重定向调试提示:在if语句之前回显变量,以确保它是您认为的。尝试使您的第一行仅为session\u start,而不使用if语句。我刚刚测试了这个脚本-它工作得非常好。它不会为我自己继续重定向。将秒数提高到8,然后它将继续重定向。这将重定向请求速度低于2秒的用户。这不是一开始的问题吗?如果用户在6秒内提出5个以上的请求,我需要重定向用户,而您必须将第一个请求的时间保存在某个地方

我只需要修复这个php脚本,将5个请求限制在6秒内。这将重定向请求速度低于2秒的用户。这不是一开始的问题吗?我需要重定向用户,如果他在6秒内发出5个以上的请求,那么你将不得不节省第一个请求的时间。我只需要修复这个php脚本在6秒钟内限制5个请求我有自己的专用服务器,但iptables不限制每个IPS 6个请求真的吗?您可以实现一个规则集,该规则集将在x秒的时间内阻止x个具有特定状态的请求。看:顺便说一下,我已经试过了。我需要自动限制每个ip的请求,因为有很多文章,只有谷歌我看过同样多的文章,但仍然有同样的问题。但是iptables配置正确。那么我有自己的专用服务器,但iptables不限制每个iptables 6个请求真的吗?您可以实现一个规则集,该规则集将在x秒的时间内阻止x个具有特定状态的请求。看:顺便说一下,我已经试过了。我需要自动限制每个ip的请求,因为有很多文章,只有谷歌我看过同样多的文章,但仍然有同样的问题。但iptables配置正确。这实际上并不能从任何意义上阻止DDoS;它只是忽略了这一点。这实际上并不能在任何意义上阻止DDoS;在这种情况下,只要服务器负载超过20%。。。没有人会访问您的服务器。。。。嗯,我想not@Mayhem平均负荷,平均负荷!所以在这种情况下,只要服务器负载超过20%。。。没有人会访问您的服务器。。。。嗯,我想not@Mayhem平均负荷,平均负荷!该链接不再处于活动状态该链接不再处于活动状态