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

lam*_*mas 11 php security spam brute-force flooding

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

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

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

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

    • "文本"验证码是否可行?(比如"什么是5加9减2?")

    • 该页面将不被那么多用户(100-200)使用,我实际上是否必须实现所有这些东西?

nic*_*ckf 20

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

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

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

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

    拥有JS的用户将无法看到它并且会很好.没有JS的用户只需遵循简单的指令即可.Spambots将为它而堕落并揭示自己.

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

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

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


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

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

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

    SELECT COUNT(*) FROM brute_force 
    WHERE action = 'passwordReset'
    AND ip = <their ip address>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果计数大于X那么告诉他们等一会儿.
  5. 否则,运行:

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

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


Gaz*_*ler 5

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