2015-06-16 32 views
2

我有一個網站發送XMLHTTPRequests到一個PHP文件,它處理HTTP POST請求並返回JSON格式的數據。 post_requests文件的網址是公開信息(因爲用戶只能查看頁面的JS代碼並找到我要發送HTTP請求的URL)防止spammy XMLHTTP請求到php

我主要在PHP中處理HTTP Post Requests:

//First verify XMLHTTPRequest, then get the post data 
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') 
{ 
    $request = file_get_contents('php://input'); 
    $data = json_decode($request); 
    //Do stuff with the data 
} 

不幸的是,我相當肯定的是,頭是可以被欺騙和一些狡猾的用戶或點擊機器人可以只垃圾郵件我的職務的請求,多次查詢我的數據庫,直到我的網站出現故障或他們去了戰鬥。

我不確定他們的請求是否會在凍結服務器和他們的請求方面發揮巨大的作用(因爲每秒20個請求沒有那麼多)。我應該對此做些什麼? (特別是在DDOS攻擊的情況下)。我聽說過的限速,你記錄每一次的實例一些IP請求數據,然後跟蹤,如果它們在本質上垃圾:

INSERT INTO logs (ip_address, page, date) values ('$ip', '$page', NOW()) 
//And then every time someone loads the php post request, check to see if they loaded the same one in the past second or 10 seconds 

但是,這意味着每當有一個正常用戶的請求,我不得不花費資源來記錄它們。是否有標準或更好的「練習」(可能是某些服務器配置?)來防止或處理他的疑慮?

編輯:只是爲了澄清。我指的是一些編碼軟件(使用cookie或已登錄)的人員,每秒向我的網站上的所有PHP請求文件發送數百萬個請求。

+3

使用類似CSRF保護的東西,在服務器已知的頁面上隨機輸出一些內容,並檢查它是否存在,請求不是來自您的站點。 – adeneo

+1

那麼,在DDOS的情況下,速率限制可能甚至不會有幫助,因爲它們通常欺騙請求中的IP地址和/或通過多個系統發送它。我建議只傳遞一個來自每個會話的唯一標記。 –

+0

對,我可以看到這會有什麼幫助,但我更多的要求。某人編寫軟件(使用cookie或已登錄),每秒向我的網站上的所有發佈請求發送數百萬次請求。令牌如何防止這種情況發生?這不就是說每個請求都會產生數百萬個令牌嗎? –

回答

2

解決方法是通過每個客戶端IP對請求進行速率限制。

大多數網絡服務器都有模塊可以做到這一點,所以請使用其中的一個模塊 - 這樣,您的應用程序只接收它要處理的請求。


-1

有很多事情可以做:

  • 使用令牌驗證請求。在會話中保存令牌並僅允許每個令牌的一定數量的請求(例如20)。也使令牌在一段時間後過期(例如5分鐘)。確切的值取決於您的網站使用模式。這當然不會阻止攻擊者,因爲他可能會刷新網站並獲取新的令牌,但這是一個小而且幾乎無成本的惡化。

  • 一旦你有令牌,需要在多次令牌刷新請求後進行captcha。還要根據您的使用模式進行調整,以避免向常規用戶顯示驗證碼。

  • 調整您的服務器的防火牆規則。使用iptables connlimit和最近的模塊(見http://ipset.netfilter.org/iptables-extensions.man.html)。這將減少您的http服務器處理的請求比率,所以耗盡資源將更加困難。