封禁IP-最有效的方法是什么?

5
我经营着一个大型论坛,像其他人一样,我也遇到了垃圾邮件/机器人的问题。有大量已知的垃圾IP地址列表可以下载并以htaccess表单使用,但我的唯一担忧是文件大小。所以我想问的问题是,考虑到它将为每个用户加载,那么多大才算太大呢?如果添加所有的IP,它的大小会达到约100kb。
是否有其他选择可以减少开销?可能使用php来做,或者由于文件大小和检查IP等原因,这也会导致重负载吗?
任何建议都将不胜感激。
谢谢,
史蒂夫
8个回答

3

通常有比IP屏蔽更有效的方法。例如,在表单中加入仅机器人会填写的隐藏字段,或要求在提交表单前启用javascript或cookies。

对于IP屏蔽,不建议使用.htaccess文件。根据您的Web服务器设置,它可能会为每个请求读取.htaccess文件。我建议将IP屏蔽添加到您的Web服务器vhost配置中,以确保Web服务器将其保存在RAM中,而不是一遍又一遍地读取它。

通过PHP也可以实现IP屏蔽。这样,您还可以轻松地将屏蔽限制在表单上,例如您论坛的注册表单。


好主意,通过PHP仅在注册表单上进行IP阻止可能更有意义。这可能是一个更明智的选择。我在注册表单上使用了recaptcha,但有时机器人仍然能够通过。有点喜欢在表单上要求JavaScript的想法,但是我猜有些用户没有打开它吧? - Steve
使用Cookie或JS是必需的,因此您必须添加一个检查它们的功能,并在它们被禁用时显示一个提示,以便用户知道该怎么做。这个提示对机器人没有帮助,所以这很好。:) 当JS和Cookie仅对表单是必需的时,检查也只需要存在即可。 - Kissaki

2

有几个选项:

  • 您可以将阻止列表存储到数据库中。在PHP中循环查询比在数据库中查询更有效率。
  • 您可以使用array_map(ip2long())预处理列表以节省内存和可能的查找时间。
  • 您可以将IP列表打包成正则表达式,可能会通过优化器(Perl Regexp::Optimizer)运行。PCRE测试速度比foreach和strpos测试快。 $regex = implode("|", array_map("preg_quote", file("ip.txt")));

但是,IP阻止列表通常不太可靠。也许您应该实施其他两个解决方法:隐藏表单字段以检测愚蠢的机器人。或者使用验证码来阻止非人类(不太用户友好,但解决了问题)。


啊,关于IP封禁的有效性,你说得很好。我曾经遇到过这个问题,采用了“保留IP,封禁用户”的方式:https://dev59.com/4HA75IYBdhLWcg3wBkO1 - Piskvor left the building
@Piskvor:我也遇到了同样的问题。虽然一些IP封禁列表可以缓解这个问题,但它只对非专业垃圾邮件发送者有效。 - mario

0
在您的DocumentRoot中的.htaccess文件中,在以下内容之后:
Order Deny,Allow
添加一行:
Deny from <black ip>

0

嗯,你正在构建一个地址的数据库,对吧?使用一个数据库产品不是很有用吗?如果你还没有,SQLite可能能胜任这项任务。


这是一个静态列表,只有Web服务器会读取它,所以可能不需要使用数据库。当您拥有变化的数据和多个数据访问器时,数据库才能发挥其全部作用。对于静态IP列表检查,这将是额外的开销,尽管可以争论它是否真的是太大的开销。(尽管我刚刚注意到在阅读其他答案时,查询它可能实际上更有效率,在DBS中具有索引列等。) - Kissaki
@Kissaki:啊,这取决于许多变量(在此基础上进行分析非常重要)。如果OP已经拥有某种类型的数据库,那么这将更容易。顺便说一句,“对只读数据来说,DB并不是真正有用的”是一个普遍的误解,因为它不正确地倒置了“文件不适合并发读写访问”的概念-使用DB可以大大提高只读性能(当然,如果操作不当也可能使性能下降)。在特定环境中测试和测量是关键-没有一种大小适合所有情况。 - Piskvor left the building

0
也许您想要停止垃圾邮件的传统方式- 验证码
我相信,阿尔伯特·爱因斯坦先生曾经说过:问题无法在创造它们的同一意识层次上解决 :)

感谢您的回复。不过我已经使用了reCAPTCHA,但仍然有机器人通过。它确实减少了数量。 - Steve

0

除非您的服务器负载已经存在问题,否则您可能不会注意到100K .htaccess文件的差异。 可能有更快的替代方法,例如使用iptables或使用可更快速搜索匹配项的排序IP列表,甚至是使用数据库(尽管单个数据库查询的开销可能会压制索引表的好处),但除非您运行具有高负载的论坛,否则可能不值得这样做。

您还可以尝试使用验证码或类似功能。但是,所有这些都需要付出代价,并且没有任何一种方法是100%可靠的。


一个10K的.htaccess文件还勉强可管理;但如果你每分钟有超过1个访问者,我敢打赌100K的.htaccess文件会非常明显——当它过大时,它就无法很好地扩展(更不用说它不是正确的工具了,别管你能不能用锤子做任何事情)。 - Piskvor left the building

0

不要使用这样的IP列表。它们很可能会过时,你可能会阻止错误的请求。只需投资于好的或更好的验证码,并仅在它们真正进行某种拒绝服务攻击时才偶尔阻止IP。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接