먼저 배경에 대해 이야기해 보겠습니다. 기계가 지속적으로 요청을 보내거나 악의적인 제출을 하면 이러한 종류의 공격
最优的策略是判断提交次数,产生动态验证码
, 즉判断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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.