不确定我所说的是否有意义......但我是否可以从目标 PHP 脚本外部更改 $_SESSION 变量?
我们的脚本之一使用 $_SESSION 变量,我不确定它是否容易受到外部操纵,因为 $_POST 变量是......
不确定我所说的是否有意义......但我是否可以从目标 PHP 脚本外部更改 $_SESSION 变量?
我们的脚本之一使用 $_SESSION 变量,我不确定它是否容易受到外部操纵,因为 $_POST 变量是......
对此的答案取决于您的应用程序是否使用 GET 或 POST 数据来填充 SESSION 数据。
例如,当用户像这样登录时填充 $_SESSION['username'] :
$_SESSION['username'] = $_GET['login-username']
由于 XSS 拥有您的客户端,他还可以修改 login-username 变量的内容,从而控制会话变量。
然而,重要的是要知道 $_SESSION 全局变量数组只能在服务器端修改。
$_SESSION变量永远不会发送给客户端。它专门存储在服务器上。用户只得到一个 ID,PHP 用它来加载相应的$_SESSION变量。
所以不,通过专门使用 XSS,您无法更改$_SESSION变量。
如果$_SESSION['password'] = $var在您的代码中找不到类似的行,则 XSS 无法更改$_SESSION['password'].
迈克有一个很好的答案。我不知道他为什么被否决(所以我投票支持他)。我刚加入,所以无法发表评论,但我想尝试解释迈克的推理,因为他的观点很好。
原来的问题是:
我们的脚本之一使用 $_SESSION 变量,我不确定它是否容易受到外部操纵,因为 $_POST 变量是......
我将其解释为:“用户是否能够像使用 $_COOKIE、$_POST 和 $_GET 一样直接从 HTTP 请求中操作 $_SESSION?”
换句话说,PHP 将从字面上获取请求标头或正文中的用户数据,并将其存储到这三个超全局变量中。但它会为 $_SESSION 做同样的事情吗?
答案是(在大多数情况下)绝对不会。PHP 中的默认会话存储是“文件”,这意味着会话被序列化并写入本地文件系统上的文件。用户无法直接操作会话的内容。
现在,正如其他人在上面指出的那样,如果您执行以下操作:
$_SESSION['foo'] = $_POST['bar'];
然后用户现在可以通过影响 $_POST 来间接影响 $_SESSION!当然这是真的,但我不认为这是问题的重点。如果您不清理用户输入,用户可能会影响任何事情。关键是要知道哪些输入没有被清理,并知道如何在使用它们之前对其进行清理。
卡拉克斯上面的批评是:
如果 XSS 更改了客户端上的值,然后在会话变量中使用,则您已使用 XSS 成功更改了 $_SESSIOn。
当然这是真的,但这不是问题的重点。按照你的逻辑,我们也可以说,“恶意用户输入可以向月球发射火箭”。如果 NASA 的某个人忘记清理他们在火箭控制应用程序中的用户输入,这是一个真实的陈述,但这是 NASA 软件的问题,而不是 PHP 的固有风险。
不幸的是,PHP 并没有明确指出哪些超全局变量是未污染的,哪些是被污染的。理解这种区别需要对 HTTP 协议以及 PHP 运行时如何处理 HTTP 请求和响应周期有中级理解。