2011-02-04 59 views
3

我运行一个大型论坛,并像其他人一样,与垃圾邮件发送者/机器人有问题。有大量已知的垃圾邮件IP列表,您可以下载并以htaccess格式使用,但我唯一关心的是文件大小。所以我想这个问题是多大太大了,因为它会为每个用户加载。添加所有的IP到它大约100kb。IP禁止 - 最有效的方式?

是否有替代品可以减少开销?可能用php做,或者由于文件大小和检查IPS等原因会导致一些重负载?

任何意见将不胜感激。

感谢,

史蒂夫

回答

0

好吧,你正在建设地址的数据库,对不对?为它使用数据库产品不是有用的吗?如果你还没有,SQLite可以完成任务。

+0

这是一个静态列表,只有网络服务器将读取它,所以可能不会。当你有改变数据和特别的时候,DBS会发挥全部的力量。与多个数据访问器。对于一个静态的IP列表检查这将是开销,虽然人们可能会争论,如果它真的是太多的开销。 (虽然我刚刚注意到在阅读其他答案时,查询它可能实际上在DBS中更加高效,包括索引列和所有内容。) – Kissaki 2011-02-04 09:51:30

+0

@Kissaki:嗯,这取决于很多变量(分析在此非常重要)。如果OP已经有某种数据库,这将更容易。顺便说一句,“DBs对于只读数据并不真正有用”是一种常见的误解,因为错误地反转了“文件不适合并发读写访问” - 使用DB可以提高只读性能(或杀死它,如果它做错了,当然)。在特定的环境中测试和测量*是关键 - 一种尺寸永远不适合所有人。 – Piskvor 2011-02-04 09:56:13

1

有几个选项:

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

但是,然后,IP块列表往往不是非常可靠。也许你应该实施其他两种解决方法:隐藏的表单域来检测愚蠢的机器人。或者验证码来阻止非人类(不是非常方便用户,但解决了问题)。

+0

啊,关于IP禁止有效性的好处。前段时间我遇到过这个问题,然后去了“保持IP,阻止用户”的方式:http://stackoverflow.com/questions/3513445/keeping-a-troll-out-ip-bans-considered-有害的东西,而不是 – Piskvor 2011-02-04 09:51:21

+0

@Piskvor:我有同样的问题。虽然一些知识产权禁止名单可以缓解这个问题,但它只能对付未经专人处理的垃圾邮件制造者。 – mario 2011-02-04 09:55:16

0

也许你想阻止垃圾邮件的好方式 - Captcha

我相信爱因斯坦曾经说过:问题不能在创建它们:)意识同级解决

+0

感谢您的回复。不过,我已经使用了recaptcha,但仍然得到机器人通过。但是,它确实削减了这一数额。 – Steve 2011-02-04 10:19:16

0

除非你已经有问题,你的服务器上的负载,你可能不会注意到,与100K .htaccess文件的区别。 可能有更快的替代方案,可能包括使用iptables或使用排序的ip列表,这些列表可以更快搜索匹配,甚至可以使用数据库(尽管单个数据库查询的开销可能会压缩索引的好处表),但它可能不值得的努力,除非你运行高负载的论坛。

您也可以尝试使用captcha或类似的。这个方向的一切都是在付出代价的,没有什么是100%可靠的。

2

通常比IP禁令更有效的方法。例如,只有表单中的隐藏字段才会填写,或者需要JavaScript或Cookie来提交表单。

对于IP禁止,我不会使用.htaccess文件。根据您的网络服务器,它可能会读取每个请求的htaccess文件。我肯定会将IP禁令添加到您的Web服务器虚拟主机配置中。这样我就可以确定网络服务器将它保存在RAM中,而不是一次又一次地读取它。

通过PHP来做它也是一个选项。这样,您也可以轻松地将禁令限制为表单,例如在论坛中注册。

0

请勿使用此类IP列表。他们很可能会过时,你可能会阻止错误的请求。只要投资于好的或更好的验证码,并且只是时时阻止IP,如果他们真的在做某种拒绝服务攻击。

0

在.htaccess在你的DocumentRoot后:

Order Deny,Allow 

附加一行:

Deny from <black ip>