다수의 악성 머신 제출 공격을 간단하게 예방

WBOY
풀어 주다: 2016-07-29 09:07:51
원래의
1094명이 탐색했습니다.

먼저 배경에 대해 이야기해 보겠습니다. 기계가 지속적으로 요청을 보내거나 악의적인 제출을 하면 이러한 종류의 공격 最优的策略是判断提交次数,产生动态验证码, 즉 判断ip规定时间内重复发送达到N次弹出验证码에 대해 서버에 많은 부담을 줄 것입니다. 다음은 실제로 IP를 식별하고 세션 녹화 및 방어를 사용하는 간단한 과정입니다.

IP 식별 및 검증

  • IP 식별

  • whitelist에 속한 ip, [whitelist 정책: 인트라넷 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회 제출 제한

[재인쇄 시 주의 사항 : 단순 방지 Pu Cui Xiaoyan에 의한 다수의 악성 제출 공격|

위의 내용은 공격 측면을 포함하여 시스템에 대한 다중 악성 제출 공격에 대한 간단한 예방 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿