会话 cookie VS 安全中的身份验证

autentication in Session cookie VS security

我有一个关于安全和会话 cookie 的问题。 我目前正在建设的网站使用以下内容:

当用户正确登录时,我给会话一个 cookie 'authenticate'。 在脚本中,我正在使用这个 cookie。 喜欢:

if ($_SESSION['authenticate'] === 'fail'){do something}
else if ($_SESSION['authenticate'] === 'pass'){do something else}

但现在的问题是…… 由于安全原因,我的直觉说:不安全!!!.... 有没有更安全的方法来执行此 whitout 会话 cookie? 这是完全安全的方式吗?

thnx 进阶。

您需要了解 PHP session 和 cookie 之间的区别。

Cookie 是由服务器发送到浏览器的字符串,浏览器必须在每次后续请求时将其发回服务器,直到 cookie 过期。
例如,如果服务器以 [​​=52=] Set-Cookie: foo=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT 的请求响应,则在 2012 年 6 月 9 日之前的每个后续请求中,浏览器必须发送 request header Cookie: foo=abc123.
在 PHP 脚本中,$_COOKIE['foo'] 将是 abc123.

PHP sessions 基于 cookie,但它们不将值存储在 cookie 中。
如果您存储 $_SESSION['foo'] = 'abc123',服务器不会将 foo=abc123 作为 cookie 发送给客户端,而是会创建一个 session 存储在服务器上 并且将仅作为 cookie 发送 session.
的 ID 所以,当你调用 session_start(), PHP generates a new session on the server, with an auto-generated id (if you're interested, you can read the id with session_id()) 时。然后它会(自动)向客户端发送一个类似于 phpsessid=PHP_SESSION_ID_HERE 的 cookie。所有这些都由 PHP 自动完成,您无需担心。

在这个故事的结尾,是的,您的代码是安全的。那是因为你没有设置 cookie authenticated=pass(这将是不安全的,因为客户端可以很容易地覆盖 cookie),而是将该值存储在 PHP session 存储中客户端只能看到 session id。

PS:您可能希望在 session 中存储更多有用的信息,而不是仅仅存储一个布尔值 'authenticated',例如数据库中经过身份验证的用户的用户 ID或任何其他有意义的东西。

PS2:PHP sessions 对未启用 cookie 的浏览器具有传统支持,但在 2015 年这毫无意义(我想知道谁仍然禁用 cookie! - 如果你这样做,90% 的网站将停止工作)。因此,您应该确保拥有这两个 ini 设置:(文档:http://php.net/manual/en/session.configuration.php#ini.session.use-cookies

session.use_cookies 1
session.use_only_cookies 1