会话 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
我有一个关于安全和会话 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