簡體   English   中英

如何防止PHP中的ajax-spam?

[英]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操作登錄用戶,因此解決起來非常簡單。

  • 為每個帳戶創建一個時間戳字段。 您可以在數據庫中執行此操作,也可以利用Memcached,或者使用平面文件。
  • 每次用戶通過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 ,因此它不會通過。

是的,你的理念原則上是好的。 有些事情需要考慮:

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

如果您可以訪問網站的源代碼,則可以重寫一些實際執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM