【问题标题】:autentication in Session cookie VS security会话 cookie VS 安全中的身份验证
【发布时间】:2015-03-17 14:24:41
【问题描述】:

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

当用户正确登录时,我会为会话提供一个 cookie“身份验证”。 在脚本的后面,我使用了这个 cookie。 喜欢:

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

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

thnx 在高级。

【问题讨论】:

  • 在我看来它是安全的。

标签: php session cookies


【解决方案1】:

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

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

PHP 会话基于 cookie,但它们不会将值存储在 cookie 中。
如果您存储$_SESSION['foo'] = 'abc123',服务器将不会将foo=abc123 作为cookie 发送给客户端,而是会创建一个会话存储在服务器上,并且仅将会话ID 作为cookie 发送。
因此,当您调用session_start() 时,PHP 会在服务器上生成一个新会话,并带有一个自动生成的 id(如果您有兴趣,可以使用session_id() 读取 id)。然后它会(自动)向客户端发送一个类似于phpsessid=PHP_SESSION_ID_HERE 的cookie。所有这些都是 PHP 自动完成的,您无需担心。

在这个故事的最后,是的,您的代码是安全的。这是因为您没有设置 cookie authenticated=pass(这将是不安全的,因为客户端可以轻松覆盖 cookie),而是将该值存储在 PHP 会话存储中,而客户端只能看到会话 ID。

PS:您可能希望在会话中存储更多有用的信息,例如数据库中经过身份验证的用户的用户 ID 或其他任何有意义的信息,而不是仅存储布尔值“已验证”。

PS2:PHP 会话对未启用 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

【讨论】:

  • 应该注意(虽然有些偏离主题,因为它假设应用程序的其余部分不安全)您应该将session_id() 绑定到客户端 IP。这将有助于防止会话劫持和 cookie 窃取。 +1 来自我,很好的解释。
  • @ʰᵈˑ 谢谢 :) 说到将会话绑定到 IP……有些人可能会争辩说它不是 100% 可靠的,因为(至少在过去)有相同的情况用户可能正在连接不同的 IP,即使在不同的类(例如公司)中。另一个好主意是将会话绑定到浏览器的用户代理,因为会话的长度肯定不会改变。
  • 哦,是的,我同意。我的意思是检查session_id() 是否对IP 有效,而不是通过传入IP 得到session_id()。这样,如果有人劫持了您的 cookie 并获取了您的 PHPSESSID,他们将不得不在同一个网络上,或者欺骗他们的 IP(?) - 使劫持变得更加困难,是的,但不可能?不确定。
  • 是的,我明白你的意思。就像将 IP(和/或用户代理)存储在 $_SESSION 中并在每个页面上验证它一样简单。
  • 实际上,我相信@Qualcuno 解释了 cookie 和会话之间的区别,并且很好地触及了安全方面以保证接受的答案 - 但这取决于你 :)
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多