11

我实际上正在开发一个 PHP 项目,该项目将具有用户系统(登录、注册、将丢失的密码发送到电子邮件,..),我认为这可能很容易受到蛮力攻击和/或垃圾邮件(发送某人电子邮件的密码,例如 1000 次等。使用您的幻想)。

  • 今天的网络服务器(Apache、IIS)是否有某种针对暴力破解的内置防御?
  • 什么是实现反垃圾邮件/洪水系统的最佳方法,如果我例如:希望一个页面每分钟不能被调用超过两次,但是另一个页面每分钟最多可以调用 100 次左右.

    • 我肯定必须存储 IP 地址、他们上次访问页面的时间以及某处的访问次数 - 但将其存储在文本文件/数据库 (MySQL) 中是否足够有效

    • 我应该使用验证码来注册/恢复丢失的密码吗?

    • “文本”验证码是否可行?(类似“什么是 5 加 9 减 2?”)

    • 该页面不会被那么多用户(100-200)使用,我真的必须实现所有这些东西吗?

4

6 回答 6

21

关于验证码:除非你真的需要,否则我建议不要使用验证码。为什么?

  1. 它很丑。
  2. 这对您的用户来说很烦人。您不应该让他们跳过箍来使用您的网站。

有一些替代方案非常简单,可以非常有效并且对(几乎所有)用户完全透明。

  1. 蜜罐字段:在表单中添加一个具有通用名称的字段,例如“网站”。在它旁边,添加一个标签,上面写着“不要在这个盒子里写”。使用 Javascript 隐藏输入和标签。当您收到表单提交时,如果该字段中有任何内容,请拒绝输入。

    使用 JS 的用户不会看到它并且会没事的。没有 JS 的用户只需要按照简单的说明进行操作即可。垃圾邮件机器人会爱上它并暴露自己。

  2. Automatic faux-CAPTCHA:这与上面的类似。添加一个带有“写‘亚历克斯’”标签的输入字段(例如)。使用 Javascript(并且知道大多数自动垃圾邮件机器人不会运行 JS),隐藏该字段并使用“Alex”填充它。如果提交的表单没有魔法词,那么忽略它。

    使用 JS 的用户不会看到它并且会没事的。没有 JS 的用户只需要按照简单的说明进行操作即可。垃圾邮件机器人不知道该怎么做,您可以忽略他们的输入。

这将保护您免受 99.9% 的自动垃圾邮件机器人的侵害。即使是最轻微的,它也不会保护您免受有针对性的攻击。有人可以自定义他们的机器人以避免蜜罐或始终填写正确的值。


关于蛮力阻止:显然,服务器端解决方案是唯一可行的方法。对于我目前的一个项目,我实施了一个与您描述的非常相似的蛮力保护系统。它基于CakePHP 的蛮力保护插件

该算法相当简单,但最初有点混乱。

  1. 用户请求一些操作(例如重置密码)
  2. 跑:DELETE * FROM brute_force WHERE expires < NOW()
  3. 跑:

    SELECT COUNT(*) FROM brute_force 
    WHERE action = 'passwordReset'
    AND ip = <their ip address>
    
  4. 如果计数大于X然后告诉他们等待一段时间。
  5. 否则,运行:

    INSERT INTO brute_force (ip, action, expires)
    VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)
    
  6. 继续使用重置密码功能。

这将允许用户在 Y 分钟内仅尝试重置密码 X 次。根据需要调整这些值。也许在 5 分钟内重置 3 次?此外,您可以为每个操作设置不同的值:对于某些事情(例如:生成 PDF),您可能希望在 10 分钟内将其限制为 10 个。

于 2010-01-29T15:29:40.727 回答
5
  1. 是的,在数据​​库中存储 IP 地址、上次访问和访问时间就可以了。
  2. 建议使用 CAPTCHA 注册/恢复密码,这样电子邮件地址就不会被发送垃圾邮件。还要停止暴力破解。
  3. 是的,文本验证码是可能的,尽管有人更容易破解并编写脚本来自动化答案。对于免费的验证码,我推荐Recaptcha
  4. 这实际上取决于您对安全性的关心程度。我当然会推荐使用 CAPTCHA,因为它们很容易实现。
于 2010-01-29T14:32:35.887 回答
2

不要试图在你的 PHP 中实现所有的逻辑——你可以实现的堆栈越低,处理它的效率就越高。

大多数防火墙(包括 BSD/Linux 上的 iptables)都有连接限制。另外,请查看 mod_security 以防止 DDOS/暴力攻击。

应该围绕此类攻击不会让攻击者访问应用程序的想法来设计您的应用程序 - 归根结底,您无法阻止 DOS 攻击,尽管您可以限制其有效性。

依赖攻击者提供的一致 IP 地址没有多大价值 - 有很多方法可以解决这个问题。

例如,跟踪每个用户登录之间的密码重置请求数。在您的密码重置表单中,如果用户提交未知的电子邮件地址,请以完全相同的方式回复(回复客户) 。记录无效的电子邮件地址。

高温高压

C。

于 2010-01-29T17:07:24.217 回答
0

除了按照 Gazler 告诉您的操作外,您还应该有一些方法来计算一般的登录尝试。如果所有登录尝试的总数大于 X,则要么开始使用 sleep 命令,要么只是说服务器负载很高。

于 2010-01-29T14:52:18.063 回答
-1

当然,您的目标受众可能不会很大,但如果它在公共领域,那么它很容易受到攻击,

这些天来,文本验证码很容易破解,相信我

对于反垃圾邮件/洪水系统,您可以记录 IP 地址(最好是 MySQL)并添加时间限制登录重试

于 2010-01-29T15:05:02.773 回答
-1

存储 IP 地址是登录和跟踪的好习惯,但我认为只是验证码就可以阻止垃圾邮件、暴力攻击和泛滥。

Recaptcha 确实是一个很好的解决方案。

于 2010-01-29T14:35:32.953 回答