我实际上正在开发一个 PHP 项目,该项目将具有用户系统(登录,注册,将丢失的密码发送到电子邮件,..),我认为这可能非常容易受到暴力攻击和/或垃圾邮件(发送某人电子邮件的密码,例如 1000 次等。请使用您的幻想)
。
关于验证码:我建议不要使用验证码,除非您确实需要它。为什么?
- 它很丑。
- 这对你的用户来说很烦人。您不应该让他们不辞辛苦地使用您的网站。
There are some alternatives which are very simple, can be very effective and are entirely transparent to (almost all) users.
-
蜜罐领域:在表单中添加一个具有通用名称(如“网站”)的字段。在它旁边,添加一个标签,说明“不要在此框中写入”。使用 Javascript 隐藏输入和标签。当您收到表单提交时,如果字段中有任何内容,请拒绝输入。
使用 JS 的用户看不到它,不会有什么问题。没有 JS 的用户只需遵循简单的说明即可。垃圾邮件机器人会上当并暴露自己。
-
自动假验证码: 和上面的类似。添加一个带有标签的输入字段“写下‘亚历克斯’” http://www.alexanderdickson.com/blog/2009/11/the-success-of-my-anti-spam-measure/(例如)。使用 Javascript(并且知道大多数自动垃圾邮件机器人不会运行 JS),隐藏该字段并用“Alex”填充它。如果提交的表单没有魔法词,则忽略它。
使用 JS 的用户看不到它,不会有什么问题。没有 JS 的用户只需遵循简单的说明即可。垃圾邮件机器人不知道该怎么做,您可以忽略他们的输入。
这将保护您免受 99.9% 的自动垃圾邮件机器人的侵害。它无法保护您免受有针对性的攻击,哪怕只有一点点。有人可以自定义他们的机器人以避免蜜罐或始终填写正确的值。
关于暴力破解:显然,服务器端解决方案是实现这一目标的唯一可行方法。对于我当前的一个项目,我实现了一种与您所描述的非常相似的强力保护系统。正是基于此暴力保护插件 http://bakery.cakephp.org/articles/view/brute-force-protection对于 CakePHP。
该算法相当简单,但一开始有点令人困惑。
- 用户请求某些操作(例如重置密码)
- Run:
DELETE * FROM brute_force WHERE expires < NOW()
-
Run:
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 个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)