PHP json_encode和XSS

时间:2013-05-17 12:19:07

标签: php javascript xss json

这个问题已被多次询问。请参阅hereherehere

基于这些问题的答案,我做了一些测试,我不得不再次提出同样的问题,因为没有一个答案看起来是正确的(至少对我而言)。如果我对主题的理解不好,请纠正我。

我正在为一个输出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?

1 个答案:

答案 0 :(得分:9)

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

请注意,使用eval 解析 JSON字符串有点安全(假设您发送了有效的JSON) - 即使在任何具有本机{{1}的现代浏览器中都不鼓励它}。 但在您的示例中,您不使用它来解析JSON,而是执行一些随机数据串!当任何人这样做时,这意味着他希望它作为代码执行 - 所以它不是XSS而是“按预期工作”!