【轉載】PHP代碼,拒絕頻繁訪問

【轉載helingfeng  http://www.cnblogs.com/helingfeng/】  php

一個網站性能有限,若是有人惡意去頻繁對頁面進行刷新,其實對服務器影響是很大的,致使資源使用很是高,直接影響到其餘用戶的體驗。web

那麼對於這樣的一些頻繁訪問,咱們該如何去拒絕它呢?服務器

我總結了兩種方法:第一種方式經過Web服務器檢查拒絕,第二種方式經過代碼進行攔截過濾session

經過Web服務器檢查拒絕

第一種方式大體原理和思路是這樣的,好比咱們的Web服務器採用Nginx,那個Nginx能夠記錄用戶訪問記錄,並經過查詢分析這個日誌能夠得出頻繁訪問用戶IP列表。curl

咱們須要作的事情:性能

作一個定時任務,定時去分析日誌文件,將獲得的頻繁訪問用戶的IP,並將IP設置到Nginx配置文件中的IP黑名單中,而後進行reload配置文件,當IP類表較大時,能夠更新到iptables中去。網站

日誌文件,查詢IP的訪問次數url

[root@z-dig www]# grep '195.154.216.165' 2015-11-28.access.log|wc -l 289 [root@z-dig www]#
 1 [root@z-dig www]# curl ipinfo.io/195.154.216.165;echo''  2 {  3 "ip": "195.154.216.165",  4 "hostname": "fr.07.gs",  5 "city": "",  6 "region": "",  7 "country": "FR",  8 "loc": "48.8600,2.3500",  9 "org": "AS12876 ONLINE S.A.S." 10 } 11 [root@z-dig www]# 

Nginx 上,因此可使用 Nginx 的 Deny 來拒絕攻擊者的IP訪問。spa

 1 deny 195.154.211.220;  2 deny 195.154.188.28;  3 deny 195.154.188.186;  4 deny 180.97.106.161;  5 deny 180.97.106.162;  6 deny 180.97.106.36;  7 deny 195.154.180.69;  8 deny 195.154.211.26;  9 deny 221.229.166.247; 10 deny 180.97.106.37; 11 deny 195.154.216.164; 12 deny 195.154.216.165; 13 [root@z-dig website]# 

經過代碼進行攔截過濾

 1 $config['request_limit']['open'] = true; // 開啓攔截請求  2 $config['request_limit']['all_request'] = false; // 攔截全部請求,不然攔截相同請求  3 $config['request_limit']['min_request_interval_time'] = 10; // 容許的最小請求間隔 單位S(秒)  4 $config['request_limit']['max_malicious_times'] = 1; // 容許的最大惡意請求次數  5  6 function maliciousRequestInterceptor() {  7 $config = array(  8 'all_request'=> false,  9 'min_request_interval_time' => 1, 10 'max_malicious_times' => 10 11  ); 12 $request_limit_cfg = C("request_limit"); 13 if($request_limit_cfg && is_array($request_limit_cfg)){ 14 if($request_limit_cfg['open'] == false){ 15 return true; 16  } 17 $config = array_merge($config,$request_limit_cfg); 18  } 19 session_start(); 20 $pre_request_url = $_SESSION['PRE_REQUEST_URL']; 21 $pre_request_time = $_SESSION['PRE_REQUEST_TIME']; 22 $cur_request_url = GetCurUrl(); 23 if(isset($pre_request_url) && isset($pre_request_time)){ 24 if((trim($pre_request_url) == trim($cur_request_url) || $config['all_request']) 25 && (((microtime(TRUE) - floatval($pre_request_time))) < floatval($config['min_request_interval_time']))){ 26 $request_times = $_SESSION['MALICIOUS_REQUEST_TIMES']; 27 if(isset($request_times)){ 28 $request_times = intval($request_times) + 1; 29 }else{ 30 $request_times = 1; 31  } 32 $_SESSION['MALICIOUS_REQUEST_TIMES'] = $request_times; 33 if ($request_times > $config['max_malicious_times']) { 34 // error_log("intercept a malicious request ".$_SERVER['REMOTE_ADDR'].":".$cur_request_url); 35 // header($_SERVER["SERVER_PROTOCOL"]." 403 access denied."); 36 // exit(); 37 return false; 38  } 39 }else{ 40 $_SESSION['MALICIOUS_REQUEST_TIMES'] = 0; 41  } 42  } 43 $_SESSION['PRE_REQUEST_URL'] = $cur_request_url; 44 $_SESSION['PRE_REQUEST_TIME'] = microtime(TRUE); 45 return true; 46 } 47 // php獲取當前訪問的完整url地址 48 function GetCurUrl() { 49 $url = 'http://'; 50 if (isset ( $_SERVER ['HTTPS'] ) && $_SERVER ['HTTPS'] == 'on') { 51 $url = 'https://'; 52  } 53 if ($_SERVER ['SERVER_PORT'] != '80') { 54 $url .= $_SERVER ['HTTP_HOST'] . ':' . $_SERVER ['SERVER_PORT'] . $_SERVER ['REQUEST_URI']; 55 }
   } else { 56 $url .= $_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI']; 57 } 58 return $url; 59 }
相關文章
相關標籤/搜索