2016-09-27 30 views
1

2個請求我有一個反洪水的功能,PHP - 抗洪 - 如何限制每秒

if (!isset($_SESSION)) { 
    session_start(); 
} 

if($_SESSION['last_session_request'] > time() - 1){ 
die(); 
} 

$_SESSION['last_session_request'] = time(); 

如果用戶請求超過1秒1個請求,腳本將停止本身。我想要做的是,我需要允許每秒最多2個請求(而不是1個)。 我該怎麼做?

回答

1

我會做這種方式:

<? 
$time_interval = 1;#In seconds 
$max_requests = 2; 
$fast_request_check = ($_SESSION['last_session_request'] > time() - $time_interval); 

if (!isset($_SESSION)) 
{ 
    # This is fresh session, initialize session and its variables 
    session_start(); 
    $_SESSION['last_session_request'] = time(); 
    $_SESSION['request_cnt'] = 1; 
} 
elseif($fast_request_check && ($_SESSION['request_cnt'] < $max_requests)) 
{ 
    # This is fast, consecutive request, but meets max requests limit 
    $_SESSION['request_cnt']++; 
} 
elseif($fast_request_check) 
{ 
    # This is fast, consecutive request, and exceeds max requests limit - kill it 
    die(); 
} 
else 
{ 
    # This request is not fast, so reset session variables 
    $_SESSION['last_session_request'] = time(); 
    $_SESSION['request_cnt'] = 1; 
} 

一件事,雖然 - 它不會保護你免受DDoS攻擊,如果你正在嘗試做這個國王的事情。 PHP中的會話很容易被丟棄,即使不是,也可以從一個客戶端創建多個會話。如果您想了解更多關於保護的信息,請致電Read this discussion

+0

偉大的方法,謝謝。 –

+1

沒問題,爲您的參考添加額外的評論。 –

+0

請注意,實際上綁定到DoS的用戶不會保存/重用會話,他們可能會創建一個新的會話以處理每個請求 – hanshenrik