这个问题已被问了很多次。见here,here和herePHP json_encode和XSS
基于对这些问题我做了一些测试,我被迫再次问同样的问题没有答案的答案似乎是正确的(在 - 至少对我来说)。如果我对主题的理解不好,请纠正我。
我正在为输出JSON响应的Web应用程序开发API。服务器端响应由PHP中的json_encode
处理。因为,这将是一个公共API,我想阻止任何XSS,因为使用API的发动机不正确的客户端实现。
对于我的测试,我做了服务器端执行以下操作:我使用jQuery AJAX能够自动解析JSON收到
header("Content-Type: application/json", true);
$bad = array('bad_key' => 'alert("hi");');
echo json_encode($bad);
在客户端。最初这似乎没有显示任何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你无法保护人们免于自己的愚蠢。消除任何和所有*潜在的*“危险”字符串,根本没有内容。 – deceze
@thiefmaster是的,这是一个灰色的地方,我实在无法做一些事情来防止由于其他人执行不当而导致错误。我想可能是我错过了一些东西。感谢您的澄清。 – John
它甚至不是“糟糕的实现” - 它需要其他用户主动执行一些数据作为JavaScript代码。 – ThiefMaster