【发布时间】:2011-10-06 22:08:01
【问题描述】:
我正在开发一个 PHP Web 应用程序,该应用程序的主要重点是安全性。到目前为止,我已将身份验证数据存储到 2 个 cookie 中:
- 一个用于唯一哈希字符串(30 个字符)的 cookie
- 一个 cookie 用于唯一 id(保存 cookie 信息和用户 id 的 mysql 数据库表的主键)
Db 表如下所示:
- 用户(user_id、用户名、密码)
- Cookie(cookie_id、user_id、哈希、时间、ip)
当用户访问页面时,应用程序会检查客户端上的现有 cookie(cookie 检查)并将它们与数据库表 Cookies 进行比较。如果哈希字符串和 id 匹配,则扩展会话,如果不匹配,则销毁会话(如果存在)并提示用户登录。它还通过将当前时间戳与上次活动的时间戳进行比较来检查会话是否过期。
当用户登录时生成一个哈希字符串并存储在数据库中(当前时间戳和IP也被存储)。然后将新生成的行的主 ID 和哈希字符串存储到两个 cookie 中并用于身份验证。
我想通过限制登录和 cookie 检查尝试来实施额外的安全措施,以防止字典或暴力攻击。我想实现当用户 N 次登录失败或验证 cookie 时他被阻止 20 分钟。但是,如果我使用 IP 执行此操作,我可能会阻止使用该 IP 的每个用户。
当失败尝试超过 X 次时,我可以锁定特定用户帐户,但问题是当攻击者未提供有效用户名时(因此我必须将整个 IP 阻止 N 分钟)。
登录表单也有验证码检查,但这只会减缓攻击速度(与拒绝登录尝试 X 分钟相比没什么)。
- 是否有任何其他方法可以拒绝登录尝试而不阻止使用该 IP 的整个网络?
- 当有 N 次 cookie 检查失败时,我是否应该拒绝登录尝试?
- 如果用户 cookie 被盗,我使用 Cookie 表中的 IP 来防止重复使用它,因此 cookie 只能从与用户相同的 IP 使用。这是安全的还是我应该以其他方式做到这一点?
提前致谢,
PS:数据库中的所有密码都经过哈希处理,cookie 值在用于 db 查询之前已编码(因此无法注入)。
【问题讨论】:
标签: php security web-applications authentication login