PHP:反洪水/垃圾邮件系统

时间:2010-01-29 14:27:07

标签: php security spam brute-force flooding

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

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

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

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

    • “text”验证码是否可行? (比较“什么是5加9减2?”)

    • 许多用户(100-200)不会使用该页面,我实际上是否必须实施所有这些内容?

6 个答案:

答案 0 :(得分:19)

关于CAPTCHA:我建议不要使用CAPTCHA,除非你真的需要它。为什么呢?

  1. 很难看。
  2. 这对您的用户来说很烦人。你不应该让他们跳过篮球来使用你的网站。
  3. 有一些替代方案非常简单,可以非常有效,并且对 (几乎所有) 用户完全透明。

    1. 蜜罐字段:使用“网站”等常用名称在表单中添加字段。除此之外,添加一个标签,说明“不要在此框中书写”的效果。使用Javascript隐藏输入和标签。当您收到表单提交时,如果该字段中有任何内容,请拒绝输入。

      拥有JS的用户将无法看到它并且会没事的。没有JS的用户只需遵循简单的指令即可。 Spambots会为它而堕落并露出自己。

    2. 自动仿CAPTCHA :这与上述类似。添加一个带有"Write 'Alex'"标签的输入字段(例如)。使用Javascript(并且知道大多数自动垃圾邮件机器人不会运行JS),隐藏该字段并用'Alex'填充它。如果提交的表单中没有魔术字,则忽略它。

      拥有JS的用户将无法看到它并且会没事的。没有JS的用户只需遵循简单的指令即可。 Spambots不知道该怎么做,你可以忽略他们的意见。

    3. 这将保护您免受99.9%的自动垃圾邮件机器人的攻击。它即使在最轻微的情况下也不会做什么,可以保护你免受有针对性的攻击。有人可以自定义他们的机器人以避免蜜罐或总是填写正确的值。


      关于暴力阻止:服务器端解决方案是唯一可行的方法。对于我目前的一个项目,我实施了一个非常类似于你描述的强力保护系统。它基于CakePHP的Brute Force Protection plugin

      算法相当简单,但最初有点令人困惑。

      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. 继续使用重置密码功能。
      7. 这将允许用户仅在Y分钟内尝试重置密码X次。根据需要调整这些值。 5分钟内可能有3次重置?此外,您可以为每个操作设置不同的值:对于某些内容(例如:生成PDF),您可能希望在10分钟内将其限制为10。

答案 1 :(得分:5)

  1. 是的,存储IP地址,上次访问以及在数据库中访问的次数都没问题。
  2. 建议使用CAPTCHA进行注册/恢复密码,以便不会发送垃圾邮件。也是为了阻止暴力行为。
  3. 是的,文本CAPTCHA是可能的,虽然更容易让人破解并编写脚本来自动化答案。对于免费的CAPTCHA,我建议Recaptcha
  4. 这真的取决于你对安全的关心程度。我当然建议使用CAPTCHA,因为它们很容易实现。

答案 2 :(得分:1)

不要尝试在PHP中实现所有逻辑 - 您可以实现它的堆栈中的较低层,可以更有效地处理它。

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

应该设计你的应用程序围绕这种攻击不会让攻击者访问应用程序的想法 - 在一天结束时你无法阻止DOS攻击,尽管你可以限制它的有效性。

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

e.g。跟踪每个用户登录之间的密码重置请求数。在密码重置表单中,如果用户提交了未知的电子邮件地址,则以相同的方式以完全响应(对客户端)。记录无效的电子邮件地址。

HTH

下进行。

答案 3 :(得分:0)

除了做Gazler告诉你的事情之外,你还应该有一些计算登录尝试的方法。它所有登录尝试的总数大于X然后开始使用sleep命令或只是说服务器负载很高。

答案 4 :(得分:-1)

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

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

答案 5 :(得分:-1)

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

文字验证码很容易被破解,相信我

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