[英]How do I protect against ajax-spam in PHP?
美好的一天,
我想知道如何保護我的網站免受ajax垃圾郵件的侵害。 我希望限制每個用戶的任何ajax操作。 讓我們說每分鍾8次ajax動作。
一個動作的例子是:一個添加/刪除博客帖子的按鈕“作為我的最愛”。
除非我錯了,否則我認為最好的方法是使用$_SESSION
的變量並避免某人/機器人清除cookie以避免我的保護。 我只允許登錄用戶使用ajax功能。
使用數據庫會使我的保護無用,因為這是我想要避免的不需要的數據庫寫入。
我必須提到我實際上使用PHP作為服務器語言和jQuery來進行我的ajax調用。
謝謝
編輯:
感恩
...保護我的網站......
令人困惑,但它不是關於跨域的ajax。
編輯2011-04-20:我為它添加了50的賞金。
由於您只允許AJAX操作登錄用戶,因此解決起來非常簡單。
從那里你可以添加額外的魔法,比如明顯違反速度限制的臨時賬戶,或者將違規者的IP與已知垃圾郵件發送者的黑名單等進行比較。
您是在談論特定的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
數據(不包括現有的$control_hash
)創建一個新哈希,並檢查它們是否匹配。
如果表單是由bot提交的,它將沒有$control_hash
,因此它不會通過。
如果您可以訪問網站的源代碼,則可以重寫一些實際執行AJAX請求的javascript代碼。 即您的頁面可以有一個隱藏的計數器字段,每次用戶單擊該按鈕時都會遞增。 此外,您還可以在頁面上隱藏時間字段,以便對點擊次數進行評級。
這個想法是你根本不需要向服務器發送任何東西 - 只需在腳本內的客戶端進行檢查。 當然,這無法幫助機器人直接對服務器進行攻擊。
這真的取決於這種垃圾郵件的結果。 如果您只是想避免寫入數據庫,那么所有這些檢查最終可能會占用比實際寫入數據庫更多的資源。
最終證明手段合理嗎?
您還必須判斷此類垃圾郵件的概率是多少。 大多數機器人都不是很聰明,並且當涉及到一些日志記錄時會很糟糕。
只需2美分,其他答案完全有效,可以避免垃圾郵件。
購買更強大的托管服務請求,不要限制它們。 每分鍾8個請求很荒謬。
無論如何,如果請求是“合法的”,您應該找到如何處理請求的方法,而不是如何限制請求。 如果不是“合法的” - 然后在沒有任何“時間”限制的情況下否認它們。
您可以使用具有全局變量的會話字段,該變量保存上次ajax請求的時間。 由於您要允許8個請求,因此請將其設置為大小為8的數組,並檢查時間差異。 如果它增加,(重要)它可能並不總是機器人。 為用戶提供驗證碼或類似的機會。 (也許是數學問題?)
驗證驗證碼后,允許接下來的幾個帖子等。
但請確保您正在檢查該特定會話和用戶。
Kerin的答案很好,我只是想強調驗證碼。
是的,你需要在每個函數視圖中使用一個函數進行交互,它也應該在全局庫中,這樣你就可以在任何地方使用它。
if(is_logged_in())
{
// do you code here
}
而is_logged in定義如下
function is_logged_in($activated = TRUE)
{
return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED);
}
您應該在用戶成功登錄時設置狀態會話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.