使用 Cookie 进行安全网络身份验证


secure web authentication using cookies

我正在开发一个PHP Web应用程序,该应用程序的主要重点是安全性。到目前为止,我已经将身份验证数据存储到 2 个 cookie 中:

  • 一个用于唯一哈希字符串的 cookie(30 个字符(
  • 一个用于唯一 ID 的 cookie(MySQL 数据库表的主键,用于保存 cookie 信息和用户 ID(

Db表如下所示:

  • 用户(user_id、用户名、密码(
  • 饼干(cookie_id、user_id、哈希、时间、知识产权(

当用户访问该页面时,应用程序会检查客户端上的现有 Cookie(cookie 检查(,并将其与数据库表 Cookie 进行比较。如果哈希字符串和 id 匹配,则会话将延长,如果不匹配,会话将被销毁(如果存在(,并提示用户登录。它还通过将当前时间戳与上一个活动的时间戳进行比较来检查会话是否已过期。

当用户登录时,哈希字符串将生成并存储在数据库中(当前时间戳和 IP 也会存储(。然后,新生成的行的主 ID 和哈希字符串将存储到两个 cookie 中并用于身份验证。

我想通过限制登录和 cookie 检查尝试来实施额外的安全性以防止字典或暴力攻击。我想实现的是,当用户无法登录或验证 cookie N 次时,他会被阻止 20 分钟。但是,如果我使用 IP 执行此操作,我可能会阻止使用该 IP 的每个用户。

当有超过 X 次失败尝试时,我可以锁定特定用户帐户,但问题是当攻击者没有提供有效的用户名时(所以我必须阻止整个 IP N 分钟(。

登录

表单也有一个验证码检查,但这只会减慢攻击速度(与拒绝登录尝试 X 分钟相比,没有什么(。

  • 有没有其他方法可以在不阻止使用该 IP 的整个网络的情况下拒绝登录尝试?
  • 当有 N 个失败的 cookie 检查时,我应该费心拒绝登录尝试吗?
  • 如果用户的 cookie 被盗,我会使用 Cookie 表中的 IP 以防止重复使用它,因此 cookie 只能从与用户相同的 IP 中使用。这是安全的还是我应该以某种方式做?

提前感谢,

PS:数据库中的所有密码都经过哈希处理,cookie值在用于数据库查询之前进行编码(因此无法注入(。

我正在开发一个PHP网络应用程序,该应用程序的主要重点是 安全

如果您关心安全性,则不应自己实现身份验证,而应像 stackoverflow.com 一样使用OpenID => http://www.codinghorror.com/blog/2008/05/openid-does-the-world-really-need-yet-another-username-and-password.html

LightOpenID是一个非常好/简单的openID库=> http://gitorious.org/lightopenid

我想实现额外的安全性以防止字典或 暴力攻击,通过限制登录和会话检查 尝试。我想在用户登录失败 N 次时实现这一点 或者验证他被阻止 20 分钟的 cookie。但是如果我 使用 IP 执行此操作,我可能会阻止每个用户使用它 知识产权。

PS:我会使用OpenID,但下面我将说明我将如何做到这一点。

IP

的阻止就像你说的那样很糟糕,因为很多用户通过NAT共享相同的IP。 但是当您怀疑暴力攻击(来自IP(时,我只会让他们仅在正确输入验证码时才进行身份验证。这样,NAT背后的用户仍然可以在黑客被拒之门外时登录。

登录表单也有一个验证码检查,但这只会减慢 攻击(与拒绝 X 分钟的登录尝试相比,没有什么(。

当您使用验证码保护您的网站时,如果密码长度足够长,则几乎不可能入侵您的网站(您应该强制执行(。因为假设您可以在 5 秒内解决一个验证码,即每分钟 12 个验证码。您可以做的是在尝试多次时锁定帐户。您向用户帐户发送了一个很长的字符串,他可以使用该字符串来设置新密码

安全性不是通过复杂的代码来实现的,而是通过简单来实现的。与其发明自己的会话处理,不如使用 php 的内置处理。

此外,没有理由将用户名存储在 cookie 中,这样做只会使您的应用程序容易受到用户和会话不匹配导致的各种漏洞。相反,请在每个会话条目中存储用户的 ID。

您应该限制身份验证尝试(即密码条目(的速率,可能使用 CAPTCHA,或者更好的是,根本不存储密码并使用 OpenID。此外,仅散列密码是不够的;确保使用盐。