我會做這種方式:
<?
$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。
偉大的方法,謝謝。 –
沒問題,爲您的參考添加額外的評論。 –
請注意,實際上綁定到DoS的用戶不會保存/重用會話,他們可能會創建一個新的會話以處理每個請求 – hanshenrik