2011-09-21 45 views
3

我的網站有一個JavaScript方法,使一個AJAX請求將項目添加到購物車無需重新加載頁面,並製作一個簡單的通知。防止AJAX洪水在Javascript

AddToCart() 

然而,使用任何JavaScript控制檯,我發現您可以填充這個要求用一個簡單的聲明:

while (true) {AddToCart()} 

而最終鎖定服務器,直到瀏覽器崩潰。更穩定的瀏覽環境甚至可能無限期地鎖定服務器。那麼防止這種嘗試的最佳方法是什麼?

+0

檢查項目是否已經在購物車?服務器端和客戶端。 –

+0

客戶可以添加多個項目的數量 –

回答

5

也許你應該只在私有名稱空間中定義函數?

(function() { 
    function AddtoCart(){}; 
})(); 

這樣你就不能通過控制檯引用它。

這當然是沒有防彈任何人都可以複製代碼或向URI發出HTTP請求。

您無法停止HTTP請求,但您可以通過實施CSRF令牌來停止頁面處理數據,以便它不會執行繁重的處理,除非CSRF令牌匹配(從您的頁面生成),從而創建CSRF基於諸如時間戳等變量,因此不能(容易地)重現。

2

的請求是一個請求,AJAX或沒有。常規的DOS攻擊也適用同樣的規則。即使沒有AJAX,也沒有什麼可以阻止人們直接調用您的網址。

3

有很多是服務器保護自己免受惡意的客戶端的方式。在這種特殊情況下,當服務器從客戶端選擇每分鐘最大操作次數時,「限速」可能是合適的,因爲它認爲人工操作是合理的,並且當來自一個客戶端的操作速率超過其自身保護的速率時。它如何選擇保護自己取決於。它可能會立即使每個新請求都失敗一段時間以避免使用多個服務器資源,它可能會將客戶端記錄在外,它可能會以失敗方式失敗或返回錯誤。

服務器應該知道,對這種類型的東西真正的保護具有在服務器上完成,因爲Ajax調用任何人都可以做,不只是你自己的客戶端代碼。

在客戶端,你可以從惡意的JavaScript保護被注入多種方式。在你的代碼中較低的位置,你也可以實現速率限制(就像在進行實際的ajax調用之前)並拒絕每分鐘執行超過X個Ajax調用。這並不能完全保護你的服務器,但是保護你免受你自己的以這種方式使用的AddToCart()函數的影響。

或者,你可以把它所以沒有頂級的全局命名空間功能,無需參數可以這樣調用。你可以通過從全局命名空間中刪除相關功能(使其成爲需要適當的「this」指針的對象之一的方法),或者可以使該功能需要某些相關的內部狀態,而這些狀態並不總是衆所周知。

就個人而言,我真的不一樣下跌客戶需要得到保護免遭虐待它的主人可能會在它造成時,有對什麼是正在做除了引起混亂不合法的目的。如果用戶想要做不好的事情,讓自己的客戶崩潰,那很好。如果他們想要的話,他們可以用任務管理器關閉客戶端。你確實想要保護它免受不良情況的影響,並保護它免受合法的普通用戶操作可能發生的任何不良情況的影響,但是如果用戶想要取下自己的客戶端,我不會失眠那。

0

你可以做的一件事是讓AddToCart函數只在請求沒有進行時才執行請求。

另一個認爲你可以做的就是混淆代碼(有工具可以做到這一點,做一個JavaScript混淆搜索),所以它不明顯什麼方法做什麼。

這兩種方法將有所幫助,但不會完全解決問題。服務器確實需要檢測是否通過一個客戶端的請求發送垃圾郵件並通過限速器限制它們。

3

他們可以使用ab(Apache基準測試)以較高的併發值進行更多的破壞,或者他們可以坐在那裏碰到F5。您需要一個較低級別的解決方案 - 速率限制,可能是IP,或一次性哈希或任何其他解決方案。

1

有人足夠聰明弄清楚你的代碼,打開瀏覽器的控制檯,然後輸入while (true) {AddToCart()}甚至不需要一個瀏覽器(或代碼)–他們可能只是在一個無限循環中執行wget,或者如果真正的目標是一個DoS,爲此使用script

在服務器端,您正在處理如何減輕拒絕服務攻擊。有很多strategies;使用Nginx反向代理是我首先想到的。