27

后来我问如何正确注销用户,现在我发现仅使用 cookie 来保持用户登录根本不安全。

将密码保存在 cookie 中并不是一种安全的方法,所以我的问题是,在我的网站上创建(登录/保持用户登录)的正确方法是什么?

目前我存储的用户 ID 与显示 X 用户配置文件所需的 url 相同,电子邮件和密码在 MD5 中加密。

Setcookie 是我在成功登录时使用的唯一函数。我只使用会话来存储随机数以避免重复提交表单。隐藏字段。

• 你能告诉我正确和安全的方法吗?
• 你的方法是什么?

仅限 PHP。两个月的php,都从你的回答中学到了。谢谢

4

5 回答 5

36

First, let me tell you this. Nothing is 100% secure. Nothing is air tight, and nothing is sacred. If motivated enough, an attacker will break every server-side defense you may put (unless you are using HTTPS, which is a different story).

You may use cookies, but cookies are highly exposed and easily modified. Never store private data, or access levels in a cookie. As it is easily stolen/modified by an attacker.

Sessions are not 100% safe either. The session ID, which the server uses to identify the client, is sent by one of 2 ways. a $_GET variable (bad), or a cookie (better, but still pretty bad). Meaning, if you are logged in as the administrator, over an unsecured WiFi, a skilled attacker (and by skilled I mean a pr0 haxx0r that downloaded a simple HTTP sniffer) can easily steal your SESSION ID. And while not getting your password, the server will wrongly identify the attacker as you, and grant him any access you may have/had.

So what to do? Sessions are on most cases safe. Advise your users to not log in under an unsecured network (buses, internet cafes, etc.). If you want to allow your user authorization to persist over time, a cookie is required. I usually use a 2 cookie system if I need that:

userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)

Then I have something to match against, and the user's details weren't revealed.


But like I said, in the end of the day, if you really REALLY wanted to secure your users, in above to everything else written in this answer, get yourself HTTPS.

于 2012-05-12T20:25:46.320 回答
9

我会使用会话。

为了在安全方面有所帮助,一旦验证了用户凭据,请使用session_regenerate_id - 因为会话 id 是在 cookie 中传递的内容,如果有人在处理登录时四处嗅探,这很重要。

不要在会话中存储与访问凭据有关的任何信息 - userId 通常就足够了;我个人构建了一个存储在会话中的用户对象(这些对象在请求之间自动序列化/反序列化 - 但您可以独立阅读)。

如果您希望设置一个 cookie,以便用户在下次访问时不必登录,则可以存储 userId 和一个自动生成的令牌,可以在数据库(或类似的)中进行检查 - 我也会在检查中添加额外内容 -就像将最后一个 ipaddress 与要检查的令牌一起存储一样,如果它们不匹配,则再次要求登录。

有很多方法可以采用——我不提供全部/“最好的”——让 php 社区中的人审查你的代码——这样你会学到更多。

于 2012-05-12T20:17:44.343 回答
5

如果某人有登录名和密码,则可以在他们的浏览器中将其设置为 cookie,这样他们就不必每次访问您的网站时都重新登录。您几乎可以在浏览器 cookie 中存储任何内容。问题是用户可以随时阻止或删除cookies。例如,如果您网站的购物车使用了 cookie,并且有人将浏览器设置为阻止它们,那么他们就无法在您的网站上购物。

当您在 cookie 中存储数据时,您必须绝对确定用户不会以任何方式篡改数据。没有办法阻止用户更改 cookie 中的数据;这太容易了。因此,为了确保您的网站不接受包含更改数据的 cookie,您需要加密 cookie 值或使用允许您验证其完整性的哈希对其进行签名。

于 2012-05-12T20:49:25.530 回答
3

最佳实践是使用 PHP 会话。

PHP 会话是通过让浏览器在会话期间每次发出请求时返回一个称为会话 ID的加密安全(即,下一个有效值不可猜测)字符串来维护的。最好和最安全的方法是给浏览器一个会话 cookie,然后它将随每个请求一起发送。

使用会话 cookie的另一种方法是将 PHP 会话 ID 作为 GET 变量包含在请求 URL 本身中。示例 URL 可能类似于:

https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

这不如使用 cookie 安全,因为 URL 可能会意外地被共享或通过其他方式被盗。

安全性是多层的,就像洋葱一样(就像常见的例子一样)。你做的东西越安全,确保它安全所需的努力就越多,使用起来就越不方便。这是一个成本效益的权衡。所以你必须问,你的数据有多重要,你的用户的隐私和安全等。

对我来说,基本级别是使用 PHP 会话,其会话 ID 强制位于 cookie 中(阻止禁用 cookie 的用户),始终对数据和 cookie 进行 SSL 加密,并确保各种 PHP 设置影响会话的安全性设置为最佳、最安全的设置。您需要阅读这些页面和子页面上的所有内容:

于 2017-04-28T05:32:48.390 回答
2

正如@Madara 所说,没有什么是 100% 安全和正确的,但从开发人员的角度来看,我会说每种保留用户会话数据的方法都有其自身的优点和缺点。

Cookie 中的用户数据与会话

如果您将用户的会话数据保存在 cookie 中,它将消耗更少的服务器 RAM 内存和处理,因为您不必将登录的用户信息保存到 RAM 中。此外,如果用户增加,则建议将用户会话数据保存在 cookie 中而不是会话中,因为保持会话会消耗服务器资源,并且您的应用程序有时可能会变慢且无响应。好像您将用户的登录数据保留在会话中它比 cookie 更安全,但它会消耗更多的服务器资源。

最后一点: 如果您的应用程序使用的是 HTTPS 协议,那么这两种方法在其自己的实现中都是正确的,那么安全性不应该成为问题。所以我建议根据应用程序和业务模型的要求使用保留用户会话数据的方法。

于 2016-04-18T05:52:20.960 回答