繁体   English   中英

PHP json_encode和XSS

[英]PHP json_encode and XSS

这个问题已经问了很多遍了。 看到这里这里这里

根据这些问题的答案,我进行了一些测试,由于没有一个答案似乎是正确的(对我而言至少如此),我被迫再次提出相同的问题。 如果我对主题的理解不好,请纠正我。

我正在为输出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);

在客户端,我使用的是自动解析收到的JSON的jQuery AJAX。 最初,这似乎没有显示任何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的建议在这里没有帮助的。

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

在这种情况下,您无需阻止“ XSS”。 如果某人愚蠢到可以执行一些随机数据,则您以JavaScript的形式发送给他,则您无能为力。 实际上,如果您确实逃避了某种阻止,他可能会取消逃避它以使其再次起作用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM