使用cookie而不是会话存储用户名和密码错误?

时间:2015-03-17 07:30:57

标签: php session cookies

我自己开始学习PHP,在开始时,我经常会选择最简单的方法来完成任务,而不是最好的方式。既然我正在开发需要100%安全的重要网站,我就会遇到这个困境,

我在主页上使用Cookie来存储登录会话。基本上,用户名和散列密码存储在cookie中,并在用户访问mustbeloggedin页面时随时加载并检查数据库。对于我的主页,我使用的是md5。不是因为我想,而是因为我必须这样做。我知道这会给用户带来很大的安全风险,因为键盘攻击基本上可以自由地获取他的密码。

在这个新网站上,我将使用sha256,所以这不应该成为一个问题。 以下是我的问题:将此类数据存储在Cookie中而非会话姿势中存在哪些其他安全问题?

这是我的:

  • 任何对计算机具有物理访问权限的人都可以通过手动设置他的cookie来获取用户的哈希并将其存储起来供以后使用。

  • 任何受感染的计算机都与上述

  • 相同
  • 每次加载都会加载,解析和检查数据(不是安全问题,但仍然是优化问题,但不是很好,但我不介意)

    < / LI>

还有别的吗?

cookie中的域变量是否足够安全,不被任何其他站点读取?

编辑::我还读到有人拦截从客户端发送到服务器的数据。会话与此有何不同?如果我存储会话,标识符cookie是否仍然被其他人劫持和使用?还会在cookie中添加一个ip地址,然后在验证cookie时,还要检查IP地址,如果它不同,那么再次打印登录表单帮助吗?

4 个答案:

答案 0 :(得分:3)

看来你正试图做一些改进,但还不够。

永远不需要将密码存储在cookie,会话,数组或其他任何内容中 密码应该在数据库中,并且不会被取出以进一步访问它,或以某种方式操纵数据持有者。

否则,您的高度安全的数据库中包含密码的哈希值和盐,只能与您存储密码的框架/脚本和变量或cookie一样安全(这比上述数据库设置更不安全)!

来自你的评论:

  

您的问题和陈述毫无意义,您正在描述登录信息   页面,我描述了网站如何知道您已登录。   cookie具有用户名和散列密码,而不是纯文本   密码

因此,您将Bob的密码存储在cookie中,并使用哈希等 我窃取了Bob的密码cookie。它已经散播,所以安全吗?

好的,所以我(詹姆斯)在你的网站上使用它。你如何知道我是詹姆斯,而不是鲍勃?它不能 它会检查我偷走的cookie,并且密码哈希/盐/你做的任何事情在你的支票中匹配(否则它对于Bob来说也不会没用)。
它认为我是鲍勃。

所以现在你开始检查其他的东西,如果我有另一个cookie,也许是用户名。
我已经偷了那个。
所以现在你的网站查看我的cookie,查看用户名和密码,检查它们,并说“欢迎鲍勃,这里是你的个人/敏感细节,按你的意愿行事......”#34;。

密码保留在数据库中!

您可以尝试检查用户代理,IP和其他可能少于有用/有时有用的东西等的负载,但这些是您可以做的事情&#34;以及#34;密码+有+盐,同时在密码或会话中存储密码 如果阻止黑客使用被盗的 golden 密码cookie(哈希是否加密)的唯一方法是检查用户代理,IP以及其他可以轻易伪造的内容,那么您的网站就不安全了。

此外,只要用户需要更改密码或电子邮件地址,或检查您网站上的任何敏感数据,您就会要求他们重新输入密码。

可能会重置存储在数据库中的 cookies / hash / hash + salt,但实际上取决于场景。

编辑{
使用cookie存储Session引用以及会话中的任何敏感数据 同样,你应该在会话中存储什么取决于它是什么数据,如果你运行自己的服务器,或共享等等。共享主机可能有错误的配置,打开其他安全问题,甚至扩展会话安全问题。
(信息在下面的链接中 - 如评论中所述,阅读是您的朋友ATM - 然后进行一些评估和考虑您的具体需求)
}

以下是您的一些认真读物:

首先,您的MD5甚至SHA256不安全:
http://php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

  

哈希算法,如MD5,SHA1和SHA256被设计为   非常快速和有效。用现代技术和计算机   设备,它已成为蛮力&#34;蛮力&#34;这些的输出   算法,以确定原始输入。

     

由于现代计算机能够以多快的速度反转&#34;这些哈希   算法,许多安全专业人士强烈反对他们的   用于密码哈希。

另请阅读该引文的链接 - 关于应如何哈希的内容,以及有关盐的位。
此外,重要的是,阅读有关如何正确存储盐和哈希。那里有很多不好的建议,如果你刚刚使用MD5,那么你最终几乎没有更多的安全性。 使用散列密码将盐存储在数据库中是好的,也可以使用独特的盐等(链接中的所有内容,关于mcrypt / blowfish等)


必须读取,即使您只从中获取位数(即使您忽略了我的其余答案): The definitive guide to form-based website authentication

Faking Session/Cookies?

更多阅读:
What is the best way to prevent session hijacking?

另请阅读:

会话固定;会话侧面劫持;跨站脚本;


再次,鉴于你说明了这一点:

  

现在我正在开发需要100%安全的重要网站

你应该花很多时间阅读所有这些事情 Cookie /会话劫持是真实的,通常很简单(脚本小子的东西)。 如果你想制作安全的网站和应用程序,你真的需要了解很多攻击方法,预防措施等。

最好的方法是阅读我给出的链接,然后是任何&#34;分支&#34;这也源于对它们的了解。
最终,您将对广泛的安全问题有一个更大的了解并解决它们。

答案 1 :(得分:1)

一些饼干的外卖。

您希望限制保存在其中的任何敏感信息,因为它不安全。

Cookie非常适合会话ID,您可以使用它来查询数据库并检查它是否已过期,匹配ip,匹配用户代理以及您在路由到relogin之前要执行的任何其他安全/验证检查恢复会议。

  

http://php.net/manual/en/features.cookies.php

您提到了用户身份验证。大多数加密协议可以通过使用来打破,并且md5此时被认为是“已损坏”,因为具有所有哈希值的查找表的完整性以及哈希值之间的轻微变化。

  

How can I make MD5 more secure? Or is it really necessary?

对你的哈希进行盐化是至关重要的,它增加了另一层安全性,以及阻止/限制暴力攻击的额外cdn / server限制:

  

https://crackstation.net/hashing-security.htm

     

http://www.cs.virginia.edu/~csadmin/gen_support/brute_force.php

如果一个人过于偏执,你可以实施双因素身份验证(费用昂贵吗?):

  

https://isc.sans.edu/forums/diary/Implementing+two+Factor+Authentication+on+the+Cheap/9580/   http://www.twilio.com/docs/howto/two-factor-authentication

答案 2 :(得分:1)

不要在Cookie中存储任何凭据。有会话cookie,这就足够了。在您的数据库中,您可以创建一个表,您将PHP会话ID与用户ID一起存储。只需在日志记录中检查用户的登录名和密码即可建立会话。

我的做法和你一样:在cookie中存储登录名,密码和会话ID并遇到很多问题 - 有时由于未知原因浏览器没有删除其中一个cookie,或者我遇到了这些cookie的路径问题。我必须开发非常复杂的方法来确保这些cookie被正确设置并且所有这些都在特定时刻出现 - 我修改了在浏览器中手动删除和添加这些cookie并且必须提出新的方法来防止这些活动引起的问题,但我总是能够找到打破这种活动的新方法,并不得不提出新的机制来防止这种情况发生。

当我最终决定只留下一个cookie时,所有这些混乱都停止了 - 会话ID,我在每次session_start()调用之前进行身份验证 - 您可以检查这样的会话是否存在,甚至将当前浏览器足迹与先前保存的内容进行比较一。然后很容易预见到糟糕的情况 - 当有人删除这个cookie时,会话结束,垃圾收集将清理它。如果有人更改它或添加假的 - 您可以将它与会话表进行比较,而不是启动会话。要更好地控制会话,请使用session_set_save_handler功能。

答案 3 :(得分:0)

您选择的实施方案存在很多问题。

  

用户名和散列密码存储在cookie中

不要那样做。您应该考虑cookie的内容不安全。

  

并在用户访问mustbeloggedin页面时随时加载并检查数据库

如果您知道用户已经登录(会话),则根本不需要这样做。

  

我正在使用md5

使用md5完全排除了任何安全性。

  

在这个新网站上,我将使用sha256

如果凭据仍然存储在cookie中,这几乎没有区别。

那你该怎么办?

  1. 当用户对自己进行身份验证在会话中存储用户信息。任何时候您需要检查当前访问者是否已经过身份验证检查会话数据。会话的数据存储在服务器上 - 它是安全的。如果用户的数据存储在会话中,则无需调用数据库来查明每个页面加载用户的位置。
  2. 如果您存储了存储在数据库中的密码哈希,请不要使用cookie来存储用户凭据,尤其是
  3. 不要使用md5 - 如果您被“强迫”这样做,请在第一时间进行更改。