使用cookie进行安全Web身份验证

时间:2011-07-16 21:52:17

标签: php security web-applications authentication login

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

  • 一个用于唯一哈希字符串的cookie(30个字符)
  • 一个唯一ID的cookie(mysql数据库表的主键,包含cookie信息和用户ID)

Db表如下所示:

  • 用户( user_id ,用户名,密码)
  • Cookie( cookie_id ,user_id,hash,time,ip)

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

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

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

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

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

  • 是否有其他方法拒绝登录尝试而不阻止使用该IP的整个网络?
  • 当N个cookie检查失败时,我是否应该拒绝登录尝试?
  • 如果用户cookie被盗,我使用Cookie表中的IP来防止重复使用,因此cookie只能从与用户相同的IP中使用。这是安全还是我应该以其他方式做到这一点?

提前致谢,

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

2 个答案:

答案 0 :(得分:1)

复杂的代码无法实现安全性,但简单。您应该使用php的builtin one

,而不是发明自己的会话处理

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

您应该对CAPTCHA进行速率限制认证尝试(即密码输入),或者更好的是,不要存储密码和use OpenID。另外,只是哈希密码是不够的;确保use a salt

答案 1 :(得分:1)

  

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

如果您关心安全性您不应该自己实现身份验证,而是使用OpenID就像stackoverflow.com => 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执行此操作我可能会阻止每个用户使用它   IP

P.S:我会使用OpenID,但下面我将告诉我将如何做到这一点。

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

  

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

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