【发布时间】:2011-08-28 02:35:57
【问题描述】:
最近我的一台服务器被一些中国 IP(这些 ip 并不总是相同)的一些 dos 攻击(数千个请求/分钟)作为目标。
所以在我的框架开始时,我做了一个小函数来阻止一个 ip,如果它发出了太多请求。
function firewall() {
$whitelist = array('someips');
$ip = $_SERVER['REMOTE_ADDR'];
if (in_array($ip,$whitelist))
return null;
if (search($ip,$pathToFileIpBanned))
die('Your ip did too many requests')
appendToFile($ip,$pathTofileIpLogger); //< When the file reaches 13000 bytes truncate it
if (search($ip,$pathTofileIpLogger) > $maxRequestsAllowed)
appendToFile($ip,$pathToFileIpBanned);
}
- 基本上,脚本会检查当前 ip 是否在文件 'ipBlocked' 中找到,如果发现它就会死掉。
- 如果未找到,则将当前 ip 添加到文件记录器“ipLogger”中。
- 在此之后,它会计算文件 ipLogger 中 ip 的出现次数,如果它们 > $max,它会通过将 ip 添加到文件 ipBlocked 来阻止该 ip
ATM 正在工作.. 它已经禁止了一些中文/tw ips
这个脚本的瓶颈是搜索功能,它必须计算一个字符串(ip)文件中出现的次数。出于这个原因,我将文件保持在低位(iplogger 文件在记录到 600-700 ips 后立即被截断)
当然要在文件中添加 ips 而不必担心竞争条件我这样做:
file_put_contents($file,$ip."\n",FILE_APPEND | LOCK_EX);
我遇到的唯一问题是 NAT 背后的人。它们都具有相同的 IP,但不应阻止它们的请求
【问题讨论】:
-
您可以将序列化的数组存储到您的 ipLogger。在这个数组中,您将使用 ip 作为键,使用访问次数作为值。这样你就不会有这么大的文件了。
-
天哪,这太棒了。回复可能会添加一些信息
标签: php ip firewall ddos denial-of-service