【发布时间】:2013-05-17 12:19:07
【问题描述】:
根据这些问题的答案,我做了一些测试,但我不得不再次问同样的问题,因为没有一个答案似乎是正确的(至少对我来说)。如果我对主题的理解不好,请纠正我。
我正在开发一个用于输出 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 呢?
【问题讨论】:
标签: php javascript xss json