2011-03-04 37 views
5

美好的一天,如何防止PHP中的ajax垃圾郵件?

我想知道如何保護我的網站免受ajax垃圾郵件。我正在尋求限制每個 用戶的任何Ajax操作。假設每分鐘執行8次ajax動作。

一個動作的例子是:一個按鈕來添加/刪除博客帖子「作爲我的最愛」。

除非我錯了,否則我相信最好的方法是使用$_SESSION的變量並避免有人/機器人清除cookie以避免我的保護。我只允許ajax函數登錄用戶。

使用數據庫將使我的保護無用,因爲它是我想要避免的不需要的數據庫的寫入。

我不得不提到我實際使用PHP作爲服務器語言和jQuery的到我的收益ajax調用。

謝謝

編輯:

的sentense

......以保護我的網站......

是混亂的,但它不是關於跨域阿賈克斯。

編輯2011-04-20: 我給它增加了50的賞金。

+0

爲什麼我不改變日期以獲得更多電話?此外,Cookie不適用於大多數/所有機器人。如果我理解正確,我可以使用PHP的curl輕鬆解決限制。 – 2011-03-04 16:57:38

+0

基本上,你限制行動,每分鐘8,然後拒絕所有的行動。這可以工作,即使我不確定限制你的用戶在Ajax電話是最好的事情:)沒有人喜歡在使用網站的時間或數量有限 - 我當然不要 – Tsadiq 2011-03-04 16:59:15

+0

@Kevin,I懷疑你可以自己更改日期:這是一個會話變量。另外,即使使用cURL,您也必須發送與登錄用戶匹配的good sessionid,以便您可以執行任何操作。 – Cybrix 2011-03-04 17:06:59

回答

9

由於您只允許AJAX操作登錄用戶,所以這非常容易解決。

  • 爲每個帳戶創建一個時間戳字段。您可以在數據庫中執行此操作,或利用Memcached,或者使用平面文件。
  • 每次用戶發出請求通過您的AJAX界面,當前時間戳添加到您的記錄,以及:
  • 檢查以確保八強時間戳不所有前一分鐘前。

從那裏,你可以添加額外的魔法,比如tempbanning公然違反限速賬戶,或針對已知垃圾郵件製造者,等等的黑名單比較違規的IP地址。

+0

+1很好的解決方案。讓我們等一下看看其他解決方案,但我懷疑它會有很大的不同。 – Cybrix 2011-04-24 12:11:35

+0

@Cybrix,肯定的事情。作爲一個附錄,如果你發現你的賬號限制模型已經發現了很多令人討厭的AJAX請求,它會付出努力確保沒有任何登錄檢查邏輯涉及複雜的數據庫查詢加入或不止一對夫婦查詢整體。將過多的數據庫開銷暴露給易受攻擊的進程(如會話檢查)會使您容易受到DDoS攻擊。 – 2011-04-25 15:44:10

0

是的,你的想法原則上是好的。有些事情要考慮,雖然:

  • 如果您追蹤全球範圍,那麼你可能會遇到一個機器人DoS荷蘭國際集團服務器和防止合法用戶不能夠使用你的「收藏」按鈕的問題。
  • 如果您根據IP追蹤請求,則有人可以使用bot網絡(多個IP)繞過阻止。根據您的網站和您的偏好,可能會根據subnet of the IP進行限制。
  • 安裝並使用Memcache來存儲和跟蹤請求,特別是如果您打算基於IP進行跟蹤。這應該比使用會話變量更快(有人可能會糾正我)。
+0

問:Memcache對APC的好處是什麼?(如果有的話) – 2011-03-04 17:35:12

+0

我不知道具體情況,但我建議Memcache純粹用於將值存儲在內存中,而不是將它們寫入會話文件。 AFAIK APC做了類似的事情,所以要麼使用。 – 2011-03-04 17:37:54

+0

我相信最有效的方法來限制ajax是每個用戶,而不是每個功能。 – Cybrix 2011-03-04 18:26:49

1

您是否在談論特定的ajax垃圾郵件到您的網站或一般的ajax垃圾郵件?

如果是後者,您可以使用散列來防止自動發送表單,即編寫您的hash()單向函數,該函數需要字符串並對其進行sha1校驗和。

所以這就是你如何使用它:

 
// the page is a blog post #357 
$id = 357; 
$type = 'post'; 
$hash = hash($_SERVER['REMOTE_ADDR'].$type.$id); 

放入隱藏字段是評論表單中,甚至隱藏的div,在頁面底部的地方,哈希,並將其命名爲「 control_hash「什麼的。將它的值附加到表單提交中的ajax-request。當腳本收到表單時,請從$_REQUEST數據(不包括現有的$control_hash)中創建新的散列表,並檢查它們是否匹配。

如果表單是由機器人提交的,它將不會有$control_hash,所以它不會通過。

+0

>> *如果表單是由bot提交的,它不會有$ control_hash,所以它不會通過。* 這是假設機器人是通用的,而不是針對特定的網站定製的。這不是一個安全的假設。 – 2011-04-24 06:12:34

+1

@Kerin「當你假設的時候,你和我做了一個屁股。」 – 2011-04-24 06:21:29

+0

......是的,那差不多就是我說的。另外我不知道如何讓你的評論失去理想,那是一個意外。 – 2011-04-24 06:24:24

0

如果您有權訪問網站的源代碼,您可以重寫一些實際執行AJAX請求的JavaScript代碼。即您的頁面可以有一個隱藏的計數器字段,每次用戶單擊該按鈕時該字段都會增加。此外,您還可以在頁面上隱藏時間欄,以評估點擊次數。

這個想法是,你甚至不需要發送任何東西到服務器 - 只需在腳本內的客戶端檢查它。當然,這對於直接向服務器直接傳送機器人沒有幫助。

0

這真的取決於這樣的垃圾郵件的結果。如果您只是想避免寫入數據庫,那麼所有這些檢查最終可能會比實際寫入數據庫需要更多的資源。

最後是否證明了方法?

您還必須判斷這種垃圾郵件的概率是多少。大多數機器人不是很聰明,並且在涉及一些伐木時會失敗。

只要我2美分,其他答案完全有效,以避免垃圾郵件。

0

購買更強大的託管服務請求,不要限制他們。 每分鐘8請求是荒謬的。
無論如何,如果請求是'合法的',您應該找到如何爲請求提供服務的方法,而不是如何限制它們。如果不是'合法的' - 那麼就沒有任何'時間限制'就否認它們。

0

您可以使用帶有全局變量的會話字段來保存上次ajax請求的時間。由於您想要允許8個請求,請將其設置爲8號數組並檢查時差。如果它增加,(重要的)它可能並不總是一個機器人。爲用戶提供驗證碼或類似的東西。(一個數學問題也許?)

一旦驗證碼進行驗證,讓接下來的幾個帖子等。

但一定要確保你正在檢查特定的會話和用戶。

克林的回答很好,我只是想強調驗證碼。

0

是的,你需要在每個函數視圖中都可以使用一個函數進行交互,而且,它應該在全局庫中,這樣你就可以在任何地方使用它。

if(is_logged_in()) 
{ 
    // do you code here 
} 

而被定義爲is_logged如下

function is_logged_in($activated = TRUE) 
{ 
    return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED); 
} 

你應該設置狀態會話時,用戶登錄成功。

+0

它將如何幫助防止垃圾郵件伴侶?因爲用戶可以登錄並將Cookie傳遞給垃圾郵件腳本 – 2014-08-21 12:35:14