代码之家  ›  专栏  ›  技术社区  ›  lamas

php:防洪水/垃圾邮件系统

  •  11
  • lamas  · 技术社区  · 15 年前

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

    • 今天的web服务器(apache,iis)是否有某种针对暴力的内置防御机制?
    • 如果希望一个页面每分钟不能被调用超过两次,而另一个页面每分钟最多可以被调用100次,那么实现反垃圾邮件/洪水系统的最佳方法是什么?

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

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

      • “文本”验证码可行吗?(比如“5加9减2等于多少?”)

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

    6 回复  |  直到 14 年前
        1
  •  19
  •   nickf    15 年前

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

    1. 太难看了。
    2. 这让你的用户很恼火。你不应该让他们跳出圈来使用你的网站。

    有一些选择非常简单,非常有效,并且完全透明于 (几乎所有) 用户。

    1. 蜜罐田 :在表单中添加一个公共名称为“website”的字段。在它旁边,添加一个标签,上面写着“不要写在这个盒子里”。使用javascript隐藏输入和标签。收到表单提交时,如果字段中有任何内容,请拒绝输入。

      使用js的用户不会看到它,也不会有问题。没有js的用户只需遵循简单的指令。空荡荡的人会爱上它并显露自己。

    2. 自动假验证码 :与上述类似。添加带有标签的输入字段 "Write 'Alex'" (例如)。使用javascript(并且知道大多数自动垃圾邮件机器人不会运行js),隐藏该字段并用alex填充它。如果提交的表单没有神奇的单词,那么忽略它。

      使用js的用户不会看到它,也不会有问题。没有js的用户只需遵循简单的指令。Spambot不知道该怎么做,您可以忽略它们的输入。

    这将保护你免受99.9%的自动垃圾邮件机器人的攻击。它不能做的,哪怕是一点点,都是保护你免受有针对性的攻击。有人可以定制他们的机器人,以避免蜜罐或总是填写正确的价值。


    关于蛮力阻挡: 显然,服务器端解决方案是唯一可行的方法。在我当前的一个项目中,我实现了一个与您描述的非常类似的暴力保护系统。是基于这个 Brute Force Protection plugin 对于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。

        2
  •  5
  •   cgp    15 年前
    1. 是的,在数据库中存储一个IP地址、最后一次访问和访问次数是可以的。
    2. 建议使用captchas来注册/恢复密码,这样电子邮件地址就不会垃圾邮件。也为了阻止暴力。
    3. 是的,文本字幕是可能的,尽管对某人来说破解和编写脚本来自动回答要容易得多。我建议你给我一个免费的验证码 Recaptcha .
    4. 这真的取决于你有多在乎安全。我当然建议使用验证码,因为它们很容易实现。
        3
  •  1
  •   symcbean    15 年前

    不要试图实施 全部的 php中的逻辑——栈越低,实现它的效率就越高。

    大多数防火墙(包括bsd/linux上的iptable)都有连接限制。另外,请查看mod_security for ddos/brute force攻击预防。

    应该 设计你的应用程序时,要考虑到这些攻击不会让攻击者访问应用程序-归根结底,你无法阻止DoS攻击,尽管你可以限制其有效性。

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

    例如,跟踪每个用户登录之间的密码重置请求数。在密码重置表单中,在 确切地 同样,如果用户提交了未知的电子邮件地址。记录无效的电子邮件地址。

    高温高压

    C.

        4
  •  0
  •   AntonioCS    15 年前

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

        5
  •  -1
  •   stef    15 年前

    存储IP地址对于登录和跟踪是很好的做法,但我认为只要验证码就能阻止垃圾邮件、暴力攻击和洪水泛滥。

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

        6
  •  -1
  •   Digital Craft Studios    15 年前

    当然,你的目标受众可能不多,但如果是在公共领域,那么就很脆弱,

    现在短信验证码很容易破解相信我

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

    推荐文章