因為最近專案懷疑被惡意刷,打算如果懷疑誰在刷,就延遲他的回應。但是要做到不影響其它人的訪問速度。據我所了解,php會給每次的請求開一個線程,例如同時有1000個訪問,導致接口反應慢了,我給其中的999個用了這個延遲響應的方法,是不是剩下那1個請求會快?還是一樣的速度?
目前我想到的只有用sleep這個方法,不知道靠不靠譜...
識別用戶的方法我已經有了,想知道的是延遲這個用戶的請求的方法
回答有朋友提到返回http錯誤碼,這是可以,但是我限制判斷一個用戶的方式,主要是ip和他的識別碼,這兩個都是可以隨時換的,萬一他換個ip,就知道只對他的ip做了限制了,之後他只要用動態ip來刷,隨時改變他的識別碼,就能繼續刷我的接口,而延遲返回會被認為是伺服器被他拖垮了,他滿足了就好
因為最近專案懷疑被惡意刷,打算如果懷疑誰在刷,就延遲他的回應。但是要做到不影響其它人的訪問速度。據我所了解,php會給每次的請求開一個線程,例如同時有1000個訪問,導致接口反應慢了,我給其中的999個用了這個延遲響應的方法,是不是剩下那1個請求會快?還是一樣的速度?
目前我想到的只有用sleep這個方法,不知道靠不靠譜...
識別用戶的方法我已經有了,想知道的是延遲這個用戶的請求的方法
回答有朋友提到返回http錯誤碼,這是可以,但是我限制判斷一個用戶的方式,主要是ip和他的識別碼,這兩個都是可以隨時換的,萬一他換個ip,就知道只對他的ip做了限制了,之後他只要用動態ip來刷,隨時改變他的識別碼,就能繼續刷我的接口,而延遲返回會被認為是伺服器被他拖垮了,他滿足了就好
發送HTTP 104 狀態碼(傳說中的「連線被重置」)。
<code>$Code = 104; $Text = 'connection reset by peer'; http_response_code($Code); $Protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'); header($Protocol . ' ' . $Code . ' ' . $Text);</code>
當然,可以由Nginx來做:發送444(服務端超時回應)或499(客戶端等不及了主動關閉連線):判斷IP然後return 444;
。
sleep的方法不可靠,sleep會阻塞進程,sleep後面是無法給其他請求提供服務的。你php的進程就那麼多,有點阻塞操作都可能影響吞吐量,怎麼會sleep呢。
延遲返回的方案還有個問題,既然是惡意刷,他一定有辦法可以同時發多個請求,那麼延遲返回並不能根本上減少他的請求次數,反而造成請求在伺服器積壓。如果用你們自己的客戶端或網頁,很難做到『惡意』。
延遲回傳也有辦法做,非同步回傳請求,反正不要阻塞進程。
綜上還是樓上給他4xx的方法好一點。
就問知道ip嗎?
限制訪問頻率