<?php
// filename: output-json.php
header('content-type:application/json;charset=utf-8');
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));
json_encode 是一个强大的函数,可确保输出被编码和格式化为有效的 javascript / json。 content-type 标头告诉浏览器如何解释响应。
如果您的响应是真正的 JSON,例如:
{"foo": 5}
然后将其声明为content-type:application/json;charset=utf-8。 JSON 解析速度更快,与 javascript 相比,被 xss 攻击的可能性要小得多。但是,如果您需要在响应中使用真正的 javascript,例如:
var obj = {foo: 5};
然后声明为content-type:text/javascript;charset=utf-8
您可以像文件一样链接到它:
<script src="output-json.php"></script>
或者,将值直接嵌入到您的 html 中而不是单独发出 http 请求会很方便。这样做:
<script>
<?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?>
</script>
如果通过 嵌入到您的 html 中,请确保使用 JSON_HEX_TAG,否则您将面临 xss 注入攻击的风险。根据您使用的上下文,您可能还需要使用其他标志来提高安全性:JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS。这些标志会降低响应的可读性,但通常有利于安全性和兼容性,因此您应该只使用它们。
我真的想强调声明内容类型并可能使用JSON_HEX_TAG 标志的重要性,因为它们都可以帮助缓解 xss 注入。
不要不要这样做,除非你想引诱 xss 攻击:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>