我实际上正在开发一个以用户系统为特色的 PHP 项目(登录、注册、将丢失的密码发送到电子邮件等),我认为这可能非常容易受到暴力攻击和/或垃圾邮件(将密码发送到某人的电子邮件 1000 次等。使用您的幻想) .
- 当今的网络服务器(Apache、IIS)是否具有某种针对暴力破解的内置防御措施?
实现反垃圾邮件/洪水攻击系统的最佳方式是什么,例如:希望一个页面不能在一分钟内被调用超过两次,但是另一个页面可能被调用最多每分钟 100 次左右。
我肯定需要存储 IP 地址、他们上次访问页面的时间以及某处的访问次数 - 但将其存储在文本文件/数据库 (MySQL) 中是否足够有效
我应该使用验证码来注册/找回丢失的密码吗?
“文本”验证码是否可行? (类似于“5 加 9 减 2 是多少?”)
页面不会被那么多用户(100-200)使用,我真的必须实现所有这些东西吗?
最佳答案
关于验证码:我建议不要使用验证码,除非您真的需要它。为什么?
- 它很丑。
- 这对您的用户来说很烦人。您不应该让他们跳过重重障碍来使用您的网站。
有一些非常简单、非常有效并且对(几乎所有) 用户完全透明的替代方案。
蜜 jar 字段:向您的表单添加一个通用名称(如“网站”)的字段。在它旁边,添加一个标签,上面写着“不要在这个盒子里写”的效果。使用 Javascript 隐藏输入和标签。当您收到表单提交时,如果该字段中有任何内容,则拒绝输入。
使用 JS 的用户不会看到它并且会没事。没有 JS 的用户只需遵循简单的说明即可。垃圾邮件机器人会上当并暴露自己。
Automatic faux-CAPTCHA:这与上面类似。添加一个带有标签的输入字段 "Write 'Alex'" (例如)。使用 Javascript(并且知道大多数自动垃圾邮件机器人不会运行 JS),隐藏该字段并用“Alex”填充它。如果提交的表单没有魔法词,则忽略它。
使用 JS 的用户不会看到它并且会没事。没有 JS 的用户只需遵循简单的说明即可。垃圾邮件机器人不知道该怎么做,您可以忽略他们的输入。
这将保护您免受 99.9% 的自动垃圾邮件机器人的侵害。它不会做的,即使是最轻微的,也不会保护您免受有针对性的攻击。有人可以自定义他们的机器人以避免蜜 jar 或始终填写正确的值。
关于暴力破解:显然,服务器端解决方案是唯一可行的方法。对于我当前的一个项目,我实现了一个与您描述的非常相似的暴力保护系统。它是基于这个 Brute Force Protection plugin用于 CakePHP。
该算法相当简单,但一开始有点令人困惑。
- 用户请求一些操作(例如重置密码)
- 运行:
DELETE * FROM brute_force WHERE expires < NOW()
运行:
SELECT COUNT(*) FROM brute_force WHERE action = 'passwordReset' AND ip = <their ip address>
- 如果计数大于
X
然后让他们稍等片刻。 否则,运行:
INSERT INTO brute_force (ip, action, expires) VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)
- 继续使用重置密码功能。
这将允许用户在 Y 分钟内仅尝试重置密码 X 次。根据需要调整这些值。也许 5 分钟内重置 3 次?此外,您可以为每个操作设置不同的值:对于某些操作(例如:生成 PDF),您可能希望将其限制为 10 分钟内 10 个。
关于PHP:反洪水/垃圾邮件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2162502/