2010-01-29 133 views
11

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

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

    • 我肯定会需要存储的IP不会忽略的时候,他们上次访问的网页和访问的地方数 - 但它是足够有效的将其存储在一个文本文件/数据库(MySQL的)

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

    • “text”captchas是否可行? (类似于“什么是5加9减2?”)

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

回答

19

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

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

有一些替代方案,这是非常简单的,可以非常有效和完全透明的(几乎所有)用户。

  1. 蜜罐领域:一个字段添加到您的表单中包含“网站”的通用名称。在旁边,添加一个标签,说明“不要在此框中写入”的效果。使用Javascript隐藏输入和标签。当您收到表格提交时,如果现场有任何内容,请拒绝输入。

    JS用户不会看到它,并会没事的。没有JS的用户只需要遵循简单的指令。 Spambots会为此付诸流水并展现自我。

  2. 自动验证码验证码:与上述类似。添加一个标注为"Write 'Alex'"(例如)的输入字段。使用Javascript(并知道大多数自动垃圾邮件机器人不会运行JS),隐藏该字段并用'Alex'填充它。如果提交的表单在那里没有魔法字,那就忽略它。

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

这会保护你免受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. 与重置密码功能继续。

这将允许用户只能尽量沿Y分钟重置密码的X倍。如果您认为合适,请调整这些值。也许在5分钟内重置3次?另外,每个动作可以有不同的值:对于某些事情(例如:生成PDF),您可能希望在10分钟内将其限制为10。

+1

+1感谢您的支持Nick! :) – alex 2010-08-02 05:31:44

5
  1. 是,存储IP地址,最后访问,并在访问数据库的时间就可以了。
  2. 建议使用CAPTCHA进行注册/恢复密码,以便电子邮件地址不能被垃圾邮件。也为了阻止暴力强制。
  3. 是的,文字CAPTCHA是可能的,但有人可以更容易地破解和编写脚本来自动化答案。对于免费的CAPTCHA,我推荐Recaptcha
  4. 这真的取决于你对安全性的关心程度。我肯定会推荐使用CAPTCHA,因为它们很容易实现。
+0

我与你的#4的回应同意。有限的用户可能会使用它,但如果垃圾邮件发送者/攻击者发现网站存在缺陷,他们可以使用他们在上述系统中找到的任何漏洞。 – 2010-01-29 14:54:21

-1

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

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

0

除了做Gazler告诉你的,你也应该有一些统计登录尝试的方法。它的所有登录尝试的总数都比X大,然后开始使用睡眠命令或者只是说服务器负载很高。

-1

肯定的是,你的目标受众可能不是很大,但如果是在公共领域则是脆弱的,

文字验证码的很容易被破解这些天相信我

一个反垃圾邮件/防洪系统,你可以记录IP地址(MySQL优先),并添加时间限制登录重试

1

不要试图执行全部您的PHP中的逻辑 - 您的堆栈中较低的可以实现它,可以更有效地处理它。

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

应该设计围绕知道你的应用程序,这些类型的攻击不会给攻击者访问应用程序 - 在这一天到底有没有办法可以防止DOS攻击,虽然可以限制其效力。

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

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

HTH

C.