回答
您可以使用內存緩存來做到這一點..
簡單演示腳本
$memcache = new Memcache();
$memcache->connect ('localhost', 11211);
$runtime = $memcache->get ('floodControl');
if ((time() - $runtime) < 2) {
die ("Die! Die! Die!");
}
else {
echo "Welcome";
$memcache->set ("floodControl", time());
}
這僅僅是一個示例代碼..也有考慮,如
A.另一件事Better IP
地址檢測(Proxy,Tor)
B. Current Action
每分鐘等C.最長執行...
後D.班用戶最大洪水等
EDIT 1 - 改進版
用法
$flood = new FloodDetection();
$flood->check();
echo "Welcome" ;
類
class FloodDetection {
const HOST = "localhost";
const PORT = 11211;
private $memcache;
private $ipAddress;
private $timeLimitUser = array (
"DEFAULT" => 2,
"CHAT" => 3,
"LOGIN" => 4
);
private $timeLimitProcess = array (
"DEFAULT" => 0.1,
"CHAT" => 1.5,
"LOGIN" => 0.1
);
function __construct() {
$this->memcache = new Memcache();
$this->memcache->connect (self::HOST, self::PORT);
}
function addUserlimit($key, $time) {
$this->timeLimitUser [$key] = $time;
}
function addProcesslimit($key, $time) {
$this->timeLimitProcess [$key] = $time;
}
public function quickIP() {
return (empty ($_SERVER ['HTTP_CLIENT_IP']) ? (empty ($_SERVER ['HTTP_X_FORWARDED_FOR']) ? $_SERVER ['REMOTE_ADDR'] : $_SERVER ['HTTP_X_FORWARDED_FOR']) : $_SERVER ['HTTP_CLIENT_IP']);
}
public function check($action = "DEFAULT") {
$ip = $this->quickIP();
$ipKey = "flood" . $action . sha1 ($ip);
$runtime = $this->memcache->get ('floodControl');
$iptime = $this->memcache->get ($ipKey);
$limitUser = isset ($this->timeLimitUser [$action]) ? $this->timeLimitUser [$action] : $this->timeLimitUser ['DEFAULT'];
$limitProcess = isset ($this->timeLimitProcess [$action]) ? $this->timeLimitProcess [$action] : $this->timeLimitProcess ['DEFAULT'];
if ((microtime (true) - $iptime) < $limitUser) {
print ("Die! Die! Die! $ip") ;
exit();
}
// Limit All request
if ((microtime (true) - $runtime) < $limitProcess) {
print ("All of you Die! Die! Die! $ip") ;
exit();
}
$this->memcache->set ("floodControl", microtime (true));
$this->memcache->set ($ipKey, microtime (true));
}
}
- 將腳本的上次執行時間存儲在數據庫或 文件中。
- 從該文件/數據庫讀取並與當前時間進行比較。
- 如果差值小於2秒,請終止腳本。
- 否則,正常繼續。
Shoudnt我使用這個會話嗎? – Lucas 2012-04-14 16:40:41
如果用戶沒有保留cookie,則會話無效,腳本不會調節。 – 2012-04-14 16:41:14
您可以使用cookies(可以禁用),所以不是一個好主意,或者您可以使用將他的IP地址存儲在數據庫中,所以如果更多,則X嘗試使用相同的IP地址,執行代碼,只是如果else語句,你將需要請求IP地址的時間的表,如果你不想使用數據庫,那麼你可以使用下面的代碼
$file = "file.txt";
$file_content = file_get_contents($file);
$fh = fopen($file, 'w') or die("could not open file");
$now = time();
if($now - $file_content > 60){
// your code here
fwrite($fh, $now);
}else{
echo "Try again later";
}
fclose($fh);
嘗試
數
但在這種情況下,它不會是每個訪問者,而是所有的訪問者(所以說用戶A來了並執行腳本,用戶B將不能執行它,直到60秒過去。
最好的方法是將時間存儲在服務器端。如果您將信息留在客戶端,那麼很容易通過。
我會例如將時間戳保存在表中。輸入並檢查垃圾郵件您的腳本。而容易設定寬容。
使用ap ap c緩存或mencache存儲信息存儲到數據庫或從文件中讀取我認爲是時間/資源消耗
- 1. 防止PHP腳本
- 2. 防止被腳本抓取
- 3. 有沒有辦法100%防止php郵件腳本被濫用?
- 4. 如何防止HTTP會話淹沒攻擊
- 5. 防止PHP中的跨站點腳本
- 6. PHP + SQL腳本 - 防止SQL注入
- 7. JButton不會出現,直到被淹沒
- 8. 舊分支可以被淹沒嗎?
- 9. 如何防止腳本
- 10. 防止JavaScript GET和腳本
- 11. signal.alarm防止腳本執行
- 12. 如何阻止人們淹沒PHP API的請求?
- 13. phpdocx - 如何讓圖像被文本淹沒?
- 14. 如何防止ListView頁腳被選中?
- 15. 如何防止腳本停止
- 16. PHP腳本停止
- 17. PHP腳本停止
- 18. 如何防止Bing不規則地使用流量淹沒我的網站?
- 19. 如何防止這個Lua腳本被反覆發送?
- 20. 如何停止PHP腳本?阻止電子郵件被髮送?
- 21. PHP - 防止用戶被註銷
- 22. 防止圖像和文本被選擇
- 23. 如何防止包含的PHP腳本更改位置URL?
- 24. 防止Dreamweaver在保存時執行PHP腳本
- 25. 防止訪問使用AJAX的php腳本
- 26. 防止PHP過早執行HTML表單腳本
- 27. 防止外部訪問的PHP腳本,但允許AJAX
- 28. 防止長時間運行PHP腳本關閉
- 29. 如何防止瀏覽器超時(長PHP腳本)
- 30. 使用巨大的PHP腳本防止504網關超時
我知道你選擇了我的答案,但...感覺就像爲你寫了一個改進版本......查看更新腳本的答案 – Baba 2012-04-14 17:42:41
@Baba非常感謝你! :) – Lucas 2012-04-15 14:14:23