设计登录系统 - 正确的方法是什么?

时间:2011-11-02 03:21:25

标签: php security

我对Web开发有些新意,我需要开发一个用户系统 - 所以用户可以注册,登录等。

我最初在登录时将用户数据存储在Session变量中,但觉得需要重新构建,因为我意识到我永远无法支持“记住我”功能,并决定使用cookie。

我目前的系统是:

  • 用户登录:我根据DB

  • 中存储的值验证用户名和密码
  • 我将用户名和密码设置为自己的Cookie。用户名cookie仍然存在,因此用户重新访问时可以填充用户名字段。密码cookie在用户离开时到期。

  • 每次加载页面时,我的PHP脚本都会检查密码cookie是否存在,这意味着用户已登录。

问题是,第三步对我来说似乎有点不安全。目前,我只检查密码cookie是否存在,但每次页面加载时我都不会将其与数据库进行比较。未经授权的用户是否无法手动创建密码cookie并将其设置为某个随机字符串,并通过我的身份验证系统?他也可以通过手动设置用户cookie来模拟任何用户。我应该在每次加载页面时将密码cookie的值与我的数据库进行比较吗?

因此,如果我将session与Cookie结合使用,我想像这样做:

if (!isset($_SESSION['user']))
{
   authenticate_user_from_cookie();
   set_session('user');
}
else
{
    //user is already logged in
}

4 个答案:

答案 0 :(得分:1)

这不是特定于PHP的,但如果您是新手,我建议您阅读OWASP guide。 OWASP是安全Web开发信息的绝佳资源。 OWASP网站将覆盖的范围远远超过我们的能力。

对于更具体的PHP答案,他们有this guide。 Point 2.10更直接地解决了您的问题。

答案 1 :(得分:1)

仅检查cookie的存在绝不是验证用户身份或验证其身份的方法。所以是的,如果您坚持使用基于cookie的身份验证,那么您应该检查每个页面加载。只要查找到用户表中有索引/主键,查询就会快速提取用户的信息并检查cookie值。

更具体地说,您设置的cookie 与用户的用户名和密码一样有价值,它们几乎是同义词。因此,您还可以在发布cookie时保存有关用户的信息,例如IP和用户代理,您也可以验证这些信息以尝试确保cookie与用户匹配。

答案 2 :(得分:1)

当您致电session_start()时,它会将当前请求重新连接到会话($_SESSION),或创建新会话。 Apache将这些会话保存到磁盘(默认情况下在/tmp文件夹中)并使用名为PHPSESSID的cookie(可在PHP.INI中更改)自动重新连接到会话,该cookie已存储在第一次请求第一次请求session_start()之后。

您可以通过任何方式对用户进行身份验证,但通常您可以在数据库或永久存储中使用用户名+(加密密码 - 例如sha1($password.'salt string that only you know'))对查找,然后只需设置$_SESSION['loggedIn'] = true$_SESSION['user'] = 1$_SESSION中想要的任何标记。

您可以创建一个User类(许多框架可以做到这一点),代表您对已登录身份验证用户的所有知识,然后询问对象$_SESSION['User']->isAuthenticated()或类似的东西。

如果您希望每次实施Remember Me功能(您在进行身份验证并存储在数据库中时生成的特殊随机cookie)时都不让用户重新输入密码,那么将设​​置一个特殊的cookie他们的浏览器在会话结束时不会在有人发出未经过身份验证的请求时查看。

答案 3 :(得分:0)

还有一些提示:

1.确保您对密码和用户ID都进行输入验证,并确保您正在验证服务器端的值,因为恶意用户可以轻松绕过任何客户端验证。如果您没有在服务器上进行验证,那么您将面临各种类型的攻击,例如SQL注入,人们将能够破坏您的数据库。确保您正在逃避任何潜在的恶意字符串

2。)确保您有登录注销,这样如果人们试图输入太多错误的凭据,您就会阻止他们的IP几分钟。这将阻止暴力攻击。 确保这对于恶意用户ID和错误密码都有效,因为攻击者可以迭代(例如,他们可以保持密码相同并尝试许多用户ID)。

3。)如果您使用盐,请不要将盐存放在与密码哈希相同的位置。如果有人闯入您的数据库,您不希望它们同时具有散列和盐,因为它会使用彩虹表使散列容易破裂。

4.确保您使用SSL / TLS加密服务器和用户之间的流量流量,否则攻击者可以通过嗅探网络并以您的用户身份登录来窃取cookie。 (查看Firesheep,这对Facebook和Gmail来说是一个很大的问题......)

5.请勿执行任何自定义加密方案,仅使用受信任的加密库和算法来执行哈希。 (例如,PHP的sha1很好,对密码字符进行自己的小旋转不是。)

6。)根据建议,您应该查看OWASP,它是保护Web应用程序的最佳资源。