在会话中存储数据有哪些风险?

cod*_*ama 7 session drupal

我听说过跨站点脚本,人们可以访问cookie和狡猾的方式.所以我希望有人可以回答几个问题.我想以最纯粹的方式存储会话中的内容,但使用像Drupal这样的CMS.假设我们有这个:

$data = $fancyWebService->getSuperSecureDataThatOnlyTheCurrentlyLoggedInUserCanSee();
$_SESSION['basic_variable'] = $data;
Run Code Online (Sandbox Code Playgroud)
  1. 如果用户现在从mysite.com旅行到devious-site.com,是否有人可以从"basic_variable"获取数据,只要知道该变量被称为?
  2. 有没有办法让当前用户可以看到$ _SERVER变量的打印并实际看到存储在其中的所有内容?
  3. 我在某处读到会话或cookie中的数据应该"加密".在上面的示例中,我非常确定数据存储在会话中,并且此会话是安全的.是这种情况,还是仅在启用HTTPS时才安全?
  4. Drupal在cookie中存储了一些信息,如果您选择使用cookie作为"会话",这对上述情况有何影响?

UPDATE

关于问题2.我的意思是,如果我在php文件中键入以下内容:

print '<pre>';
print_r($_SESSION);
die();
Run Code Online (Sandbox Code Playgroud)

(或只是vardump会话变量)...

我最终得到了我存储在那里的所有信息,未加密.我的问题是,用户是否可以通过某种方式找到一种方法来访问会话变量(除了通过我公开它),这会使得保留未加密的值是一个坏主意?

Tyl*_*den 6

用户grom在这里提供了一个很好的答案,提到了用PHP来保护会话的方法:https://stackoverflow.com/a/7488/3874219

我想首先说PHP,特别是5.xx版本,在安全方面已经走了很长一段路; 但是,会话数据可能会发生很多潜在的事情,因为它会在服务器和客户端之间不断传递.让我们分别处理你的4分:

"如果用户现在从mysite.com旅行到devious-site.com,是否有人可以从"basic_variable"获取数据,只要知道该变量被称为?

天生就没有.您的变量和变量名称存储在您的服务器上,并且由于代码在发送到客户端之前被处理为HTML视图,因此您的PHP代码永远不会到达客户端.存储在未传递给客户端的变量中的数据在您的服务器上是安全的,授予某人无法访问您的服务器或以某种方式损害您的服务器的安全性.如果给定变量中的数据存储在通过有线/网络传输到客户端的会话或cookie中,则可能会被截获.默认情况下,此流量未加密,除非您已通过SSL证书或类似加密方案实施OpenSSH.

'当前用户是否有任何方式可以看到$ _SERVER变量的打印并实际看到存储在其中的所有内容?

如果您"回应"它,或以其他方式编程您的PHP以暴露其中存储的数据.同样,如果变量被放置在发送到客户端的某个地方,而不是在发送HTTP响应之前被处理成HTML或以其他方式处理,那么它就有风险.

'我在某处读到会话或cookie中的数据应该"加密".在上面的示例中,我非常确定数据存储在会话中,并且此会话是安全的.是这种情况,还是仅在启用HTTPS时才安全?

是的,必须启用HTTPS,并且您必须具有SSL证书才能加密数据,否则未加密的HTTP请求/响应中的所有内容都会受到嗅探,跨站点脚本攻击,域伪造,重定向攻击,并且列表会继续.SSL绝对有助于防止这种情况发生.

'Drupal在cookie中存储了一些信息,如果你选择使用cookie作为"会话",这对上述情况有何影响?

Cookie存储在用户的计算机上.cookie中的数据可以由您的服务器加密或散列,以便安全地存储在客户端,但一切皆有可能.如果潜在的黑客伪造您的域名,他们就可以访问Cookie及其中的所有内容.如果cookie链接到活动会话,他们只是欺骗了他们的身份,并通过受害者的会话访问了您的网站.噗.身份盗窃,恶意编辑用户内容等等.Dupupal一直存在足够长的时间,以便有机制来帮助防止这种情况发生; 但是,我不是Drupal专家.

希望这会有所启发.最佳实践IMO,不要在会话中存储敏感数据!如果要在cookie中存储标识信息,请确保您具有某种类型的实现以防止跨站点伪造,例如在ASP.NET MVC中,我使用框架中提供的Anti-Forgery标记.您想要一种方法来确保声称自己是谁的人通过cookie有另一种方式来验证请求,所述cookie源自您的网站/域名,而不是另一个.