2011-07-26 59 views
6

即時通訊實施延遲系統,以便我認爲濫用任何IP將通過睡眠()自動獲得增量延遲。我應該使用睡眠()還是僅僅拒絕他們

我的問題是,這會導致增加CPU的使用,從而反正殺了我的網站,如果攻擊者只是不斷在被推遲打開新的實例?或者,sleep()命令使用最小的CPU /內存,並且不會成爲小腳本的負擔。我不想拒絕他們,因爲我寧願他們不知道明顯的限制,但願意聽到我爲什麼應該這樣做。

[請了爲什麼IM推定的IP濫用的一個小網站,導致繼承人爲什麼沒有討論:我最近建立了一個捲曲是一個&頁面返回信息給用戶一個劇本,我注意到了一些IP的垃圾郵件我愚蠢的小腳本。捲曲太頻繁有時會導致我的結果無法從服務器進行輪詢,並且合法用戶被搞砸了。 ]

+0

我會去禁止他們在更高的水平,如果可能的話(=更少的資源使用),[這個問題在serverfault](http://serverfault.com/questions/ 287851/prevent-hammering-script-parsers)似乎很適合。 – Wrikken

+0

@Wrikken,這不是一個段錯誤問題,因爲OP在詢問如何防禦惡意用戶。 – Soren

+1

傑夫·阿特伍德沒有寫過關於這方面的東西嗎?它被稱爲hellbanning或lagbanning什麼的。我有興趣瞭解他是如何計劃實施它的,如果他確實沒有讓百萬睡眠線程搞亂系統的話。 –

回答

5

睡眠不使用任何CPU或內存,這是接受調用的進程尚未使用的。

執行sleep()會面臨的問題是,當攻擊者站點等待您的睡眠時間超時時,您最終將耗盡文件描述符,然後您的站點將顯示爲任何其他人誰試圖連接。

這是一個典型的DDoS場景 - 攻擊者實際上並沒有試圖闖入你的機器(他們也可能試圖做到這一點,但這是一個不同的存儲),而不是他們試圖通過使用您擁有的每種資源,包括帶寬,文件描述符,處理線程等 - 當您的某個資源用完時,您的網站似乎已關閉,儘管您的服務器實際上並非

這裏唯一的真正的防禦是要麼不接受電話,或者有一個動態防火牆配置過濾掉電話 - 或者路由器/防火牆設備,其不相同,但關閉服務器。

5

我覺得這個問題是,你可能有睡眠線程的系統周圍鋪設的大量。如果你發現你的濫用,立即發回一個錯誤,並與它做。

我的擔心與你的方法是重複濫用者,他們的超時長達幾個小時。即使他們沒有使用CPU,你也會有他們的線程長時間存在。除了CPU以外,還有其他資源需要記住。

5

Sleep()是一個「阻止」執行一段時間的函數。這不等於:

while (x<1000000); 

因爲這會導致100%的CPU使用率。它只是將操作系統中的進程置於「阻塞」狀態,然後在計時器啓動後將進程重新置於「就緒」狀態。

請記住,PHP的默認超時時間爲30秒。我不確定是否「睡眠()」符合或不符合(我會懷疑它,因爲它是一個系統調用,而不是腳本)

您的主機可能不喜歡你有這麼多「阻塞」進程,所以小心點。

編輯:根據Does sleep time count for execution time limit?,看起來「睡眠()」不受「最大執行時間」(在Linux下)的影響,正如我所料。顯然它在Windows下。

1

如果你正在做我也試過的東西,我想你會清楚。

我的驗證腳本構建了類似於阿特伍德的屁股想法。會話ID被捕獲在RAM中,並在每次頁面調用時都旋轉。如果條件沒有得到滿足,我會以記過的方式標記該特定會議。三點之後,我開始將sleep()調用添加到它們的執行中。這個限制是可變的,但我以3秒的速度定位爲一個快樂的數字。

通過身份驗證,攻擊者依靠每秒執行一定次數的嘗試使其值得他們值得攻擊。如果這是他們的焦點,那麼引入睡眠會讓系統看起來比實際情況要慢,這在我看來會讓它不太適合進行攻擊。

如果你讓他們放慢腳步,而不是單純地告訴他們不行,那麼你會有一個看起來不太吸引人的機會。

這就是說,這是通過一種「混淆類型」來實現的安全性,所以你不能真正依賴它太多太多。它只是在我的整體食譜中的另一個因素:)

相關問題