Json:PHP到JavaScript安全与否?

wha*_*ore 8 php security json

据我所知,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)

(您可能希望定义一个快捷方式功能,以便更快地编写.)

  • 带有默认标志的`json_encode`会转义斜杠,所以它会给``<\/script>'`,所以这很好,因为`<\/script>`不会终止html中的脚本标记.你必须明确地使用`JSON_UNESCAPED_SLASHES`标志才能被它咬住. (12认同)
  • @bobince,这在PHP 5.4中并不新鲜.echo json_encode('</ script>')在PHP 5.2.9中输出<\/script> (9认同)
  • @zzzzBov:如果你的某个功能被覆盖,你已经完全丢失了.在JavaScript和PHP中,没有足够的封装来保护应用程序的任何部分免受其他任何部分的攻击(除非您使用不同的域进行多文档),因此通过调用函数绝对不会有任何损失.如果你因害怕它被破坏而无法召唤某个功能,你就不会得到太多(阅读:任何事情). (4认同)

Kin*_*nch 0

是和否:

是:PHP 生成有效的 JSON

否:PHP 也可能像 JSON 一样返回恶意代码。

如果您可以信任来源,或者您甚至可以完全控制它(因为它是您的),那么就没有问题。

  • 永远不要相信消息来源。尽管听起来很愚蠢,但服务器可能只是部分受到损害,并且提供的数据是恶意的。使用 JSON 解析库,如果浏览器已经有它,它们将默认使用本机 JSON 解析。 (2认同)