根据这些问题的答案,我做了一些测试,我不得不再次问同样的问题,因为没有一个答案似乎是正确的(至少对我来说)。如果我对主题的理解不好,请纠正我。
我正在为输出 JSON 响应的 Web 应用程序开发 API。服务器端响应由json_encode
PHP 处理。因为,这将是一个公共 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);
这立即导致执行字符串 in bad_key
。我知道使用eval
是不好的,应该避免。但是,这是我所知道的,无法确保其他开发人员遵循相同的做法。为了避免这种情况,一种解决方案是执行服务器端编码。为此,假设我使用htmlspecialchars
.
header("Content-Type: application/json", true);
$bad = array('bad_key' => htmlspecialchars('alert("hi");'));
echo json_encode($bad);
虽然它不执行alert("hi");
客户端,但由于存在&
. 使用此处建议json_encode
的选项也无济于事。JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS
那么在这种情况下如何防止 XSS 呢?