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 攻撃の背後にある考え方は、Web サイト/サーバーが新しい要求を処理できないサービス拒否を引き起こすことです。したがって、本質的に、このアプローチは不合理です。リクエスト処理のはしごを上る必要があります。

自由に使えるサーバーがある場合は、より簡単です。カーネル ファイアウォール/iptables にレート制限ルールを実装するだけです。しかし、それにアクセスできないと仮定すると、Apache は自由に使用できますが、それほど効率的ではありません。

.htaccess 内にルールを実装することはより良い解決策ですが、それでも完全ではありません。しかし、DDoS 攻撃によっては、開発者が自由にブロックできる実際のソリューションはありません。

于 2012-09-23T16:01:34.840 に答える
2
于 2015-01-24T00:07:39.490 に答える
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

これにより、ページのリロードがカウントされ、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 に答える
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

DDo を停止するには、次のように、その IP の null ルートを追加します。

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

IOSecというスクリプトがありますが、これはかなり古いものですが、役に立つかもしれません。

于 2013-11-16T15:20:11.977 に答える
-1

このコードは、このようなカール ループでは機能しません。セッションはすべてのカール実行で再度作成されます。

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 を ddos​​ するため

于 2015-07-11T17:16:54.000 に答える