1

这个问题已经被问过很多次了。看这里这里这里

根据这些问题的答案,我做了一些测试,我不得不再次问同样的问题,因为没有一个答案似乎是正确的(至少对我来说)。如果我对主题的理解不好,请纠正我。

我正在为输出 JSON 响应的 Web 应用程序开发 API。服务器端响应由json_encodePHP 处理。因为,这将是一个公共 API,所以我希望防止由于使用 API 的开发人员执行不正确的客户端实现而导致的任何 XSS。

对于我的测试,我在服务器端执行了以下操作:

header("Content-Type: application/json", true);
$bad = array('bad_key' => 'alert("hi");');
echo json_encode($bad);

在客户端,我使用自动解析收到的 JSON 的 jQuery AJAX。最初,这似乎没有显示任何 XSS 问题。然后我传递response.bad_keyeval().

eval(response.bad_key);

这立即导致执行字符串 in bad_key。我知道使用eval是不好的,应该避免。但是,这是我所知道的,无法确保其他开发人员遵循相同的做法。为了避免这种情况,一种解决方案是执行服务器端编码。为此,假设我使用htmlspecialchars.

header("Content-Type: application/json", true);
$bad = array('bad_key' => htmlspecialchars('alert("hi");'));
echo json_encode($bad);

虽然它不执行alert("hi");客户端,但由于存在&. 使用此处建议json_encode的选项也无济于事。JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS

那么在这种情况下如何防止 XSS 呢?

4

1 回答 1

9

在这种情况下,您不需要阻止“XSS”。如果有人愚蠢到执行一些你作为 JavaScript 发送给他的随机数据,那么你对它无能为力。实际上,如果您确实逃脱了某些东西以防止它发生,他可能会取消它以使其再次起作用。

请注意,使用eval解析JSON字符串在一定程度上是安全的(假设您发送有效的 JSON)——即使在任何具有本机JSON.parse(). 但是在您的示例中,您不使用它来解析 JSON,而是使用它来执行一些随机的数据字符串!当任何人这样做时,这意味着他希望它作为代码执行 - 所以它不是 XSS,而是“按预期工作”!

于 2013-05-17T12:20:27.050 回答