ホームページ  >  記事  >  バックエンド開発  >  複数の悪意のあるマシン送信攻撃を簡単に防止

複数の悪意のあるマシン送信攻撃を簡単に防止

WBOY
WBOYオリジナル
2016-07-29 09:07:511083ブラウズ

まず背景について話しましょう。この種の攻撃では、マシンがリクエストや悪意のある送信を継続的に送信すると、サーバーに多大な負荷がかかります。以下は、IP を識別し、実際にセッションの記録と防御を使用する簡単なプロセスです。 最优的策略是判断提交次数,产生动态验证码,即判断ip规定时间内重复发送达到N次弹出验证码

IP

を識別および検証するプロセスは次のとおりです。

  • IPがホワイトリストに属していることを[ホワイトリストポリシー:イントラネットIP +指定されたIPテーブル]を通じて直接識別します

  • セッションを使用します。 IPリクエストのタイムスタンプを保存します

  • 指定された時間内のIPリクエストの数を確認します

  • 対応する措置を講じます

<code>/**
 * 获取和校验ip;同时防止短时间内多次提交
 *
 * @notice        :弹出验证码,需要替换掉echo $echo_str 即可。
 * @return string :返回校验成功的ip
 */
protected function getAndCheckIP()
{

    // 获取环境ip
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
        $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
        $ip = getenv("REMOTE_ADDR");
    else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
        $ip = $_SERVER['REMOTE_ADDR'];
    else
        $ip = "unknown";

    // check 环境ip
    if (!$this->isWhiteList($ip)) {
        $echo_str = "提交过于频繁,请稍后再试!";
        // 构建ip的时间栈数据
        if (!is_array($_SESSION[$ip])) {
            $_SESSION[$ip] = array();
        }

        if (isset($_SESSION[$ip][0])) {
            $_SESSION[$ip][] = time();

            // session 保存时间为6小时。清理session
            $post_interval_first = time() - $_SESSION[$ip][0];
            if ($post_interval_first > 21600) {
                $_SESSION[$ip] = array();
            }

            // 两次提交小于1s,禁止提交
            $post_interval_pre = time() - $_SESSION[$ip][count($_SESSION[$ip]) - 3];
            if ($post_interval_pre < 1) {
                echo $echo_str;
                exit;
            };

            // 您在10s内已经提交了3请求,禁止提交
            $post_interval_third = time() - $_SESSION[$ip][count($_SESSION[$ip]) - 3];
            if (isset($_SESSION[$ip][3]) && ($post_interval_third < 10)) {
                echo $echo_str;
                exit;
            }

            // 您在1分钟期间已经提交了5请求,禁止提交
            $post_interval_fifth = time() - $_SESSION[$ip][count($_SESSION[$ip]) - 3];
            if (isset($_SESSION[$ip][5]) && ($post_interval_fifth < 60)) {
                echo $echo_str;
                exit;
            }

            // 6小时内提交10次,禁止提交
            if (isset($_SESSION[$ip][10])) {
                echo $echo_str;
                exit;
            }
        } else {
            $_SESSION[$ip][] = time();
        }
    }

    return ($ip);
}
</code>
  • ホワイトリスト戦略

    ホワイトリスト戦略は、イントラネットIPリリースと特定IPリリース
  • <code>/**
     * 检验是否存在于白名单中
     *
     * @param $ip    :校验的ip
     * @return bool  :校验结果
     */
    function isWhiteList($ip){
        /**
         * 内网ip默认全部存在于白名单中
         */
        if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)){
            return true;
        }
    
        // 是否在写死的whitelist 里面
        return in_array($ip,$this->_WHTTE_LIST);
    }
    </code>
    を採用します攻撃対策戦略

    Xiaoya は、上記のコードのような比較的単純な戦略を採用しており、実際のプロセスでのビジネス ニーズと組み合わせることができます。

    1秒以内の重複投稿禁止

    • 5秒以内に3回まで

    • 60秒以内に最大5回まで

    • 6時間以内に最大10回まで

    • 【転載の際は明記してください】している:マシンによる複数の悪意のある送信攻撃を簡単に防止 信頼できる崔暁燕】

      上記では、次の側面を含む、マシン上での複数の悪意のある送信攻撃の簡単な防止方法を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。