2012-06-27 69 views
3

我有一些基於php程序的案例。我已經實現了一個處理搜索需求的搜索輸入表單。有一個控制器處理搜索請求。一旦我意識到請求的行爲,POST或GET可能會導致一個漏洞,允許人們在很短的時間間隔內重複請求。我在想什麼是檢查最後的請求,並與當前請求進行比較。如果時間間隔與禁止時間範圍相匹配(表示大約0-500ms),則控制器將不會搜索,直到請求超過時間範圍。檢查請求在PHP中的時間間隔短重複

我有想在表格上保存請求,密鑰在請求者real_IP上。然後將其與新請求(CMIIW)進行比較。

有什麼好的方法來正確地得到它?

+0

你試圖解決什麼問題? – Jon

+0

@Jon裏面沒有特定的問題。只是限制訪問Web程序的搜索功能的請求。當我問這個我記得有關蠻力或善良的網絡壓力的作品。所以我想讓它安全,所以服務器。 –

回答

2

使用IP限制搜索次數將導致任何機構(例如:學校)無法使用您的服務/網站/搜索。使用會話將使用限制在瀏覽器會話中;關閉瀏覽器將刪除會話變量,從而允許新用戶使用您的應用程序。

一個更好的方法是在會話變量中設置最後的搜索時間(如您所建議的),並檢查該變量是否在500ms之前或之後,以滿足搜索請求。

對於要設置的會話變量,您可以在會話加載後使用$_SESSION['lastsearchtime']session_start()。請注意,session_start可以在已經被調用時觸發錯誤。

2

該解決方案使用$ _SESSION代替:

session_start(); 

$now = microtime(true); 
$interval = $now - 2; 

if( 
    isset($_SESSION['last_request']) 
    && ($_SESSION['last_request'] >= $interval) 
){ 
    exit('timeout'); 
} 

$_SESSION['last_request'] = $now; 

//do query 
1

您有幾種選擇在這裏:

  1. 實現一次性令牌(在WordPress,它被稱爲nonce)。並根據每個請求,檢查它。如果令牌已經被使用並且被再次使用(通過後續請求),拒絕該請求)。

  2. 在會話變量中執行最後一次請求時間,如果仍在時間窗口內,請檢查稍後的請求,拒絕該請求。爲此,您可以檢查Max Gherkins的回答。