2012-02-25 64 views
0

我想将PHP变量传递给Javascript,而不触发任何新的http请求(又名:直接插入标记)。但我想要的内容(没有任何可能改变我的价值的消毒,即使它们在标记本身)。当然,我也想保持安全。这会有什么副作用吗?

我已经想出了迄今为止最好的方法包括JSON + BASE64_ENCODE +数据URI方案:

<script type="text/javascript" src="data:text/javascript;base64,<?php echo base64_encode('var thing = '.json_encode($thing)); ?>"></script> 

我的问题是:将这个有什么副作用?我可以安全地使用这个吗?

+4

有一件事情是它不会在IE 7和8中工作,甚至可能不是9。然后我真的不明白这个练习的重点?这实现了什么,简单地插入纯文本JavaScript不? – 2012-02-25 21:48:04

+0

我做了一些非常相似的事情(JSON/base64),在我的情况下,它是用一个URL参数发送复杂的数据客户端 - >服务器。它运行良好。 – 2012-02-25 21:49:25

+0

但是对于你的情况,如果你的JSON编码字符串,你应该能够直接将它放入标记中,它不需要编码或转义(JSON编码实际上为你逃脱任何字符串)。 – 2012-02-25 21:50:37

回答

2

我当然不会这样做。您正在引入不必要的兼容性问题(IE)。通过base64编码,你膨胀了你的JSON的大小~37%

<script type="text/javascript">var thing = <?php echo json_encode($thing); ?></script> 

实际上,你可能会在运行的唯一的问题是,如果$thing在字符串中的“</script>”的地方。(它看起来像json_encode()居然逃脱所有斜杠/,所以这不是一个问题。) HTML解析器会忽略其他任何看起来像标记的<script>块。

如果你的页面不是UTF-8,你必须注意文本编码。

+2

+1,但为了完整性,可能遇到的另一个问题是输出JSON UTF-8)在ISO-8859-1或其他非UTF-8上下文中。 – 2012-02-25 22:07:29

+0

实际上,我测试@ Pekka的解决方案,包含一个包含''字符串的数组,并且工作得很好。 – 2012-02-25 22:08:12

+0

json_encode让我的脚本标记为' <\/script>'。nice(: – 2012-02-25 22:12:41