基于这些问题的答案,我做了一些测试,我不得不再次提出同样的问题,因为没有一个答案看起来是正确的(至少对我而言)。如果我对主题的理解不好,请纠正我。
我正在为一个输出JSON响应的Web应用程序开发API。服务器端响应由PHP中的json_encode
处理。因为,这将是一个公共API,我希望防止由于使用API的开发者不正确的客户端实现而导致的任何XSS。
对于我的测试,我在服务器端执行了以下操作:
header("Content-Type: application/json", true);
$bad = array('bad_key' => 'alert("hi");');
echo json_encode($bad);
在客户端,我使用jQuery AJAX自动解析收到的JSON。最初这似乎没有显示任何XSS问题。然后我将response.bad_key
传递给eval()
。
eval(response.bad_key);
这立即导致bad_key
中的字符串执行。我知道使用eval
是不好的,应该避免。但是,这是我所知道的,并不能确保其他开发人员遵循相同的做法。为了避免这种情况,解决方案是执行服务器端编码。为此,我假设我使用htmlspecialchars
。
header("Content-Type: application/json", true);
$bad = array('bad_key' => htmlspecialchars('alert("hi");'));
echo json_encode($bad);
虽然它没有执行alert("hi");
客户端,但由于存在&
而破坏了JS代码。使用json_encode
选项的JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS
here无效。
那么如何在这种情况下阻止XSS?
答案 0 :(得分:9)
在这种情况下,您无需阻止“XSS”。如果有人愚蠢到可以执行一些随机数据,那么你就把它作为JavaScript发送给你,你无法对付它。实际上,如果你确实逃脱了某些东西以防止它,他可能会将其转移以使其再次起作用。
请注意,使用eval
解析 JSON字符串有点安全(假设您发送了有效的JSON) - 即使在任何具有本机{{1}的现代浏览器中都不鼓励它}。
但在您的示例中,您不使用它来解析JSON,而是执行一些随机数据串!当任何人这样做时,这意味着他希望它作为代码执行 - 所以它不是XSS而是“按预期工作”!