使用htaccess拒绝从ip临时访问

时间:2016-08-27 07:14:48

标签: php apache .htaccess security

我正在尝试创建一个小脚本,它可以防止(不会阻止,但会降低效果)简单的ddos攻击。目前我只是在我的服务器上的每个页面上包含我的ddosprotection.php文件。如果现在有人试图在网站上发送大量请求,脚本会检测到这一点并将攻击者IP写入htaccess文件。

Deny from 1.2.3.4

这应该会降低DDOS攻击的影响,因为攻击者无法访问网站本身。 (是的,我知道服务器仍然需要处理一些数据,但它仍然会减少DDOS攻击的影响)

我现在的问题是:如果某个合法用户访问我的网站并且我的脚本未能将其视为合法用户,则他将被永久禁止。有没有办法只在htaccess中暂时禁止IP地址。不应该连接任何数据库,也不应该在用户尝试连接到网站时请求任何PHP脚本(这将是无稽之谈,攻击会更有效)示例:

Deny from 1.2.3.4 before TIMESTAMP

2 个答案:

答案 0 :(得分:2)

数据库确实是管理此方法的最便捷方式。

但是你不必在每个请求上运行php脚本并查询数据库:相反,你可以在阻止它时添加一个条目并定期运行php脚本(例如在Linux上使用cron)清理过期的条目并重新生成.htaccess文件。这也可以避免不断增长的带有重复IP地址的.htaccess文件。

除此之外,您应该尝试通过将规则直接写入防火墙而不是.htaccess文件来完全避免网络服务器被阻止的条目。

答案 1 :(得分:1)

使用mod_rewrite和服务器环境变量为您完成了这项工作:

summary

说明:

  • 确保已安装并启用mod_rewrite。
  • 如果IP地址 1.2.3.4 且服务器时间早于2016-08-27 8:55:00,则重定向到禁止页面。

您需要知道您的服务器时间来计算禁令时间,只需添加5分钟或其他内容。如果您不确定,可以使用以下格式的php获取服务器时间:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.4
    RewriteCond %{TIME} <20160827085500
    RewriteRule ^(.*)$ - [F,L]
</IfModule>

现在假设您要禁用ip 5分钟,您可以这样做:

echo date('Ymdhis');

并使用.htaccess中的输出。

您可以详细了解 Time-Dependent Rewriting