Session cookie VS安全性中的身份验证

时间:2015-03-17 14:24:42

标签: php session cookies

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

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

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

但现在问题是...... 由于安全原因,我的直觉感觉:不安全!!! .... 是否有更安全的方法来执行此会议的会话cookie? 矿石是完全安全的方式吗?

先进的thnx。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

PS2:PHP会话对没有启用cookie的浏览器提供遗留支持,但在2015年没有意义(我想知道谁仍然禁用cookie! - 如果你这样做,90%的网站将停止工作)。因此,您应确保拥有以下两种ini设置:(docs:http://php.net/manual/en/session.configuration.php#ini.session.use-cookies

session.use_cookies 1
session.use_only_cookies 1