【发布时间】:2011-01-30 02:07:43
【问题描述】:
在网站中存储和检索会话数据的安全方法是什么?在意识到它为什么不起作用之前,我有一段时间相信以下方法会:
-
将所有内容存储在名称是随机生成的字符串的会话变量中:
// This will be the name of the session variable. $id = uniqid(); // $my_complex_object contains sensitive information // I don't want to transmit over the network. $_SESSION[$id] = $my_complex_object; 将那些随机生成的字符串发送给我的用户。
在客户端,使用这些随机生成的字符串作为
POST参数向我的服务器发送请求。
但后来我意识到这仅与 PHP 的会话 ID cookie(或您碰巧使用的任何语言/框架的 cookie)一样安全,我猜它是通过管道作为纯文本发送的。会话 ID 和随机生成的$id 是攻击者访问$my_complex_object 所需的一切。攻击者可以免费使用它们。
那么,谁能告诉我一种真正有效的方法?也许有一种安全的方式来设置 cookie。
注意:我没有设置 PHP 标记,因为我使用 PHP 只是偶然。如果你想给我一个你最喜欢的语言/框架的例子,请随时这样做。
编辑:看来我最初的问题还不够清楚。
假设我们要生成一个 HTML 表格,其每一行对应一个产品,并包含指向“有关此产品的更多信息”页面的超链接。因此,我将执行以下操作:
在
table.php中,我将生成一个包含 N 行的表。对于每一行,我将生成一个会话变量,其中包含有关相应产品的信息。在我的 HTTP 响应正文中的某处,我还会发送所述会话变量的名称。当用户请求有关特定产品的更多信息时,他会向
more_info.php发送POST请求,其中一个参数是对应会话变量的名称。
所以,虽然在我的 HTTP 标头中我只发送会话 ID cookie,但在我的 HTTP 正文中,我正在发送大量信息的密钥。任何花时间分析我的 HTTP 标头和正文结构的攻击者都可以完全劫持我用户的敏感信息。
【问题讨论】:
-
我不知道你为什么要在响应中发送变量名。这一定是脚本的事情。
-
那么客户端可以将它们作为参数来构造进一步的请求吗?
-
不要为此使用变量名。创建一组参数供客户端使用。使用的参数应该与代码中的变量名称无关。
-
即使我使用一组名称与会话变量不同的参数,Web 服务器也必须能够将这些参数与会话变量相关联。从某种意义上说,这些参数是用于读取/操作这些会话变量(或基于这些会话变量的表达式)的“API”。不过没关系,原来我要问的是this,这意味着每次交换敏感信息都必须使用 SSL。