据我所知,eval(json_str)客户端上的使用容易受到恶意代码的攻击.我的问题是,如果json_str是由PHP函数构造的数组json_encode,我会安全吗?
例如,
json_str = json_encode(array(record1,
record2,
record3));
Run Code Online (Sandbox Code Playgroud)
现在eval(json_str)在客户端代码中使用是否完全安全?
bob*_*nce 19
就纯JavaScript来说,是的,你是安全的:输出json_encode永远不会包含任何东西,除了静态值,传递给没有意外的一面eval.(尽管通常()在使用时必须包围JSON字符串eval,以避免将对象文字表达式误解为语句块.)
除此之外:所有JSON编码器都不一定如此,因为有些字符可以在JSON字符串中包含raw,这些字符串在JavaScript中无效.最值得注意的是,U + 2028和U + 2029不能在JavaScript字符串文字中转义,因为它们构成换行符.但是,PHP的编码器会编码所有非ASCII字符(例如as "\u2028"),所以这里没有问题.
对于嵌入另一种语言(通常是HTML)的JavaScript而言,您不一定安全.例如:
<script type="text/javascript">
var v= <?php echo json_encode($value); ?>;
</script>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,如果value包含带有字符序列的字符串,该</script怎么办?这将允许值过早地结束脚本块,从而转移到HTML标记中,然后它可以注入其他恶意脚本.
为避免此问题,在HTML中包含JSON内容时,始终使用符合JSON的术语将<字符串编码为字符串文字.为了与XHTML非CDATA脚本块兼容,也要这样做.为了与事件处理程序属性中的JS兼容,也要做引号.\x3C\u003C&
PHP将使用正确的选项为您执行此操作json_encode():
var v= <?php echo json_encode($value, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>;
Run Code Online (Sandbox Code Playgroud)
(您可能希望定义一个快捷方式功能,以便更快地编写.)
是和否:
是:PHP 生成有效的 JSON
否:PHP 也可能像 JSON 一样返回恶意代码。
如果您可以信任来源,或者您甚至可以完全控制它(因为它是您的),那么就没有问题。