摘要:先說背景機器不斷的發(fā)送請求或者惡意提交,會給服務(wù)器造成很大壓力針對這種攻擊最優(yōu)的策略是判斷提交次數(shù),產(chǎn)生動態(tài)驗證碼,即判斷規(guī)定時間內(nèi)重復(fù)發(fā)送達(dá)到次彈出驗證碼。
識別和校驗ip先說背景:機器不斷的發(fā)送請求或者惡意提交,會給服務(wù)器造成很大壓力;針對這種攻擊最優(yōu)的策略是判斷提交次數(shù),產(chǎn)生動態(tài)驗證碼,即判斷ip規(guī)定時間內(nèi)重復(fù)發(fā)送達(dá)到N次彈出驗證碼。下面是小拽在實踐過程中一個簡單的識別ip,利用session記錄和防御的過程。
過程如下;
識別ip
ip屬于白名單直接通過[白名單策略:內(nèi)網(wǎng)ip+指定ip表]
利用session存儲ip的請求時間戳
校驗規(guī)定時間內(nèi)ip的請求次數(shù)
采取相應(yīng)的措施
/** * 獲取和校驗ip;同時防止短時間內(nèi)多次提交 * * @notice :彈出驗證碼,需要替換掉echo $echo_str 即可。 * @return string :返回校驗成功的ip */ protected function getAndCheckIP() { // 獲取環(huán)境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 環(huán)境ip if (!$this->isWhiteList($ip)) { $echo_str = "提交過于頻繁,請稍后再試!"; // 構(gòu)建ip的時間棧數(shù)據(jù) 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內(nèi)已經(jīng)提交了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分鐘期間已經(jīng)提交了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小時內(nèi)提交10次,禁止提交 if (isset($_SESSION[$ip][10])) { echo $echo_str; exit; } } else { $_SESSION[$ip][] = time(); } } return ($ip); }白名單策略
白名單策略采用:內(nèi)網(wǎng)ip放行和特定ip放行
/** * 檢驗是否存在于白名單中 * * @param $ip :校驗的ip * @return bool :校驗結(jié)果 */ function isWhiteList($ip){ /** * 內(nèi)網(wǎng)ip默認(rèn)全部存在于白名單中 */ 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); }防攻擊策略
小拽采用的比較簡單的策略,如上面代碼,實際過程中可以結(jié)合業(yè)務(wù)需求。
1s內(nèi)禁止重復(fù)提交
5s內(nèi)提交上限3次
60s內(nèi)提交上限5次
6小時內(nèi)提交上限10次
【轉(zhuǎn)載請注明:機器多次惡意提交攻擊簡單防范 | 靠譜崔小拽 】
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/21307.html
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。合理使用上報可以及時發(fā)現(xiàn),利于盡快修復(fù)問題。因為事件會從目標(biāo)元素一層層冒泡至對象。允許給一個事件注冊多個監(jiān)聽。表示在捕獲階段觸發(fā),表示在冒泡階段觸發(fā)。 關(guān)于【Step-By-Step】 Step-By-Step (點擊進(jìn)入項目) 是我于 2019-05-20 開始的一個項目,每個工作日發(fā)布一道面試題。每個周末我會仔細(xì)閱讀大家的答案,整理最一份...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點,并保留了登錄憑證。站點接收到請求后,對請求進(jìn)行驗證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時,各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個問題,今天一起...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點,并保留了登錄憑證。站點接收到請求后,對請求進(jìn)行驗證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時,各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個問題,今天...
閱讀 2414·2021-10-08 10:04
閱讀 1190·2021-09-03 10:40
閱讀 1214·2019-08-30 15:53
閱讀 3357·2019-08-30 13:13
閱讀 2985·2019-08-30 12:55
閱讀 2337·2019-08-29 13:21
閱讀 1479·2019-08-26 12:12
閱讀 2814·2019-08-26 10:37