在会话中存储数据有哪些风险?
What are the risks in storing data in session?
我听说过跨站点脚本,人们可以通过不正当的方式访问 cookie。所以我希望有人能围绕这些回答一些问题。我想举个例子,以最纯粹的方式在会话中存储一些东西,但是使用像 Drupal 这样的 CMS。假设我们有这个:
$data = $fancyWebService->getSuperSecureDataThatOnlyTheCurrentlyLoggedInUserCanSee();
$_SESSION['basic_variable'] = $data;
- 如果用户现在从 mysite.com 旅行到迂回的 site.com,是否有人可以从 "basic_variable" 获取数据,只要知道变量是叫那个?
- 有没有什么方法可以让当前用户看到 $_SERVER 变量的输出并实际看到其中存储的所有内容?
- 我在某处读到会话或 cookie 中的数据应该是 "encrypted"。在上面的示例中,我相当确定数据存储在会话中,并且该会话是安全的。是这种情况,还是仅在启用 HTTPS 时才安全?
- Drupal 将一些信息存储在 cookie 中,如果您选择使用 cookie 而不是 "session",这对上述情况有何影响?
更新
关于问题 2。我的意思是,如果我在 php 文件中键入以下内容:
print '<pre>';
print_r($_SESSION);
die();
(或者只是 vardump 会话变量)...
我最终得到了我存储在那里的所有信息,未加密。我的问题是,用户是否可以通过某种方式找到一种方法来访问会话变量(而不是通过我公开它),这会使不加密值成为一个坏主意?
Cookie 只能由 Cookie 来源的存储域访问。劫持依赖于网络。
会话 ID 存储在客户端 cookie 中,没有其他域可以访问其他域的 cookie,并且相同的两个服务器(两个网站)不能看到彼此的会话(直到您将其存储在共享服务器中)
1:用一般的方法是不可能的,但是有一种方法——为了让你的会话在不同的网站上可用,你必须将会话存储在公共服务器上,并且必须按照 GET/POST 传输你的会话 ID变种。
编写您自己的 session_save_handler 并将会话存储在数据库中。可以从多个 Web 服务器访问数据库,您就完成了。
2:问题不清楚
3:是的 https 可以保护您免受会话劫持。
4: 问题有点不清楚,按照这个 url 来了解 session 和 cookie 之间的区别/相关性
用户 grom 在这里有一个很好的答案,其中提到了在 PHP 中帮助保护您的会话的方法:
首先我想说 PHP,尤其是 5.x.x 版本,在安全方面取得了长足的进步;但是,由于会话数据不断在服务器和客户端之间传递,因此您的会话数据仍有许多潜在的可能性。让我们分别解决您的 4 个问题:
'Should the user now travel from mysite.com, to devious-site.com, is
there any way that someone can get the data from "basic_variable",
just by knowing that the variable is called that?'
本质上,没有。您的变量和变量名称存储在您的服务器上,并且由于代码在发送到客户端之前被处理成 HTML 视图,因此您的 PHP 代码永远不会到达客户端。存储在变量中的数据不会以其他方式传递给客户端,在您的服务器上 是安全的 ,前提是有人无法访问您的服务器或以某种方式损害您服务器的安全性。如果给定变量中的数据存储在通过 wire/network 传输到客户端的会话或 cookie 中,则它有可能被拦截。默认情况下,此流量未加密,除非您已通过 SSL 证书或类似加密方案实施 OpenSSH。
'Is there any way that the current user can see a print out of the
$_SERVER variable and actually see all the contents stored in it?'
如果您 'echo' 它,或以其他方式对您的 PHP 进行编程以公开存储在其中的数据。同样,如果变量曾经被放置在发送给客户端的某个地方,并且在发送 HTTP 响应之前没有被处理成 HTML 或以其他方式处理,那么它就有风险。
'I read somewhere that data in the session or in cookies should be
"encrypted". In the above example, I'm fairly sure the data is being
stored in the session, and that this session is secure. Is this the
case, or is it only secure if HTTPS is enabled?'
是的,必须启用 HTTPS,并且您必须有 SSL 证书来加密数据,否则未加密的 HTTP requests/response 中的所有内容都会受到嗅探、跨站点脚本攻击、域伪造、重定向攻击,名单还在继续。 SSL 绝对有助于防止这种情况的发生。
'Drupal stores some info in cookies, if you choose to use cookies as
apposed to "session", how does that affect the above?'
Cookie 存储在用户的机器上。 cookie 中的数据可以由您的服务器加密或散列,以便安全地存储在客户端,但一切皆有可能。如果潜在的黑客伪造了您的域,他们就可以访问 cookie 和其中的所有内容。如果 cookie 链接到活动会话,则他们只是欺骗了自己的身份并通过受害者的会话获得了对您网站的访问权限。噗。身份盗窃、用户内容的恶意编辑等。Drupal 肯定已经存在了足够长的时间,并有适当的机制来帮助防止这种情况发生;但是,我不是 Drupal 专家。
希望这能说明一些问题。最佳实践 IMO,不要在会话中存储敏感数据!如果您在 cookie 中存储识别信息,请确保您有某种类型的实施来防止跨站点伪造,例如在 ASP.NET MVC 中,我使用框架中提供的防伪令牌。您想要一种方法来确保通过 cookie 声称自己是谁的人有另一种方法来验证使用所述 cookie 的请求来自您的 SITE/DOMAIN,而不是另一个。
是的,您可以将数据存储在 session.However 中,您必须将易受攻击的可能性降至最低
数据并仅存储最少的信息,以便您可以识别用户,例如,
通过 ID 号,最终它将起作用。总的来说,使用会话数据不是
推荐。
我听说过跨站点脚本,人们可以通过不正当的方式访问 cookie。所以我希望有人能围绕这些回答一些问题。我想举个例子,以最纯粹的方式在会话中存储一些东西,但是使用像 Drupal 这样的 CMS。假设我们有这个:
$data = $fancyWebService->getSuperSecureDataThatOnlyTheCurrentlyLoggedInUserCanSee();
$_SESSION['basic_variable'] = $data;
- 如果用户现在从 mysite.com 旅行到迂回的 site.com,是否有人可以从 "basic_variable" 获取数据,只要知道变量是叫那个?
- 有没有什么方法可以让当前用户看到 $_SERVER 变量的输出并实际看到其中存储的所有内容?
- 我在某处读到会话或 cookie 中的数据应该是 "encrypted"。在上面的示例中,我相当确定数据存储在会话中,并且该会话是安全的。是这种情况,还是仅在启用 HTTPS 时才安全?
- Drupal 将一些信息存储在 cookie 中,如果您选择使用 cookie 而不是 "session",这对上述情况有何影响?
更新
关于问题 2。我的意思是,如果我在 php 文件中键入以下内容:
print '<pre>';
print_r($_SESSION);
die();
(或者只是 vardump 会话变量)...
我最终得到了我存储在那里的所有信息,未加密。我的问题是,用户是否可以通过某种方式找到一种方法来访问会话变量(而不是通过我公开它),这会使不加密值成为一个坏主意?
Cookie 只能由 Cookie 来源的存储域访问。劫持依赖于网络。
会话 ID 存储在客户端 cookie 中,没有其他域可以访问其他域的 cookie,并且相同的两个服务器(两个网站)不能看到彼此的会话(直到您将其存储在共享服务器中)
1:用一般的方法是不可能的,但是有一种方法——为了让你的会话在不同的网站上可用,你必须将会话存储在公共服务器上,并且必须按照 GET/POST 传输你的会话 ID变种。 编写您自己的 session_save_handler 并将会话存储在数据库中。可以从多个 Web 服务器访问数据库,您就完成了。
2:问题不清楚
3:是的 https 可以保护您免受会话劫持。
4: 问题有点不清楚,按照这个 url 来了解 session 和 cookie 之间的区别/相关性
用户 grom 在这里有一个很好的答案,其中提到了在 PHP 中帮助保护您的会话的方法:
首先我想说 PHP,尤其是 5.x.x 版本,在安全方面取得了长足的进步;但是,由于会话数据不断在服务器和客户端之间传递,因此您的会话数据仍有许多潜在的可能性。让我们分别解决您的 4 个问题:
'Should the user now travel from mysite.com, to devious-site.com, is there any way that someone can get the data from "basic_variable", just by knowing that the variable is called that?'
本质上,没有。您的变量和变量名称存储在您的服务器上,并且由于代码在发送到客户端之前被处理成 HTML 视图,因此您的 PHP 代码永远不会到达客户端。存储在变量中的数据不会以其他方式传递给客户端,在您的服务器上 是安全的 ,前提是有人无法访问您的服务器或以某种方式损害您服务器的安全性。如果给定变量中的数据存储在通过 wire/network 传输到客户端的会话或 cookie 中,则它有可能被拦截。默认情况下,此流量未加密,除非您已通过 SSL 证书或类似加密方案实施 OpenSSH。
'Is there any way that the current user can see a print out of the $_SERVER variable and actually see all the contents stored in it?'
如果您 'echo' 它,或以其他方式对您的 PHP 进行编程以公开存储在其中的数据。同样,如果变量曾经被放置在发送给客户端的某个地方,并且在发送 HTTP 响应之前没有被处理成 HTML 或以其他方式处理,那么它就有风险。
'I read somewhere that data in the session or in cookies should be "encrypted". In the above example, I'm fairly sure the data is being stored in the session, and that this session is secure. Is this the case, or is it only secure if HTTPS is enabled?'
是的,必须启用 HTTPS,并且您必须有 SSL 证书来加密数据,否则未加密的 HTTP requests/response 中的所有内容都会受到嗅探、跨站点脚本攻击、域伪造、重定向攻击,名单还在继续。 SSL 绝对有助于防止这种情况的发生。
'Drupal stores some info in cookies, if you choose to use cookies as apposed to "session", how does that affect the above?'
Cookie 存储在用户的机器上。 cookie 中的数据可以由您的服务器加密或散列,以便安全地存储在客户端,但一切皆有可能。如果潜在的黑客伪造了您的域,他们就可以访问 cookie 和其中的所有内容。如果 cookie 链接到活动会话,则他们只是欺骗了自己的身份并通过受害者的会话获得了对您网站的访问权限。噗。身份盗窃、用户内容的恶意编辑等。Drupal 肯定已经存在了足够长的时间,并有适当的机制来帮助防止这种情况发生;但是,我不是 Drupal 专家。
希望这能说明一些问题。最佳实践 IMO,不要在会话中存储敏感数据!如果您在 cookie 中存储识别信息,请确保您有某种类型的实施来防止跨站点伪造,例如在 ASP.NET MVC 中,我使用框架中提供的防伪令牌。您想要一种方法来确保通过 cookie 声称自己是谁的人有另一种方法来验证使用所述 cookie 的请求来自您的 SITE/DOMAIN,而不是另一个。
是的,您可以将数据存储在 session.However 中,您必须将易受攻击的可能性降至最低 数据并仅存储最少的信息,以便您可以识别用户,例如, 通过 ID 号,最终它将起作用。总的来说,使用会话数据不是 推荐。