将变量从PHP传递到JavaScript的有效方法

use*_*521 23 javascript php cakephp cakephp-2.0

我不时要将一些变量从PHP传递给JS脚本.现在我这样做了:

var js-variable = "<?php echo $php-variable; ?>";
Run Code Online (Sandbox Code Playgroud)

但这非常难看,我无法在.js文件中隐藏我的JS脚本,因为它必须由PHP解析.处理这个问题的最佳解决方案是什么?

ila*_*nco 35

如果您不想使用PHP生成javascript(并且不介意对您的Web服务器进行额外调用),请使用AJAX来获取数据.

如果您确实想使用PHP,请在输出之前使用json_encode进行编码.

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Run Code Online (Sandbox Code Playgroud)

  • 警告:这可能会导致您的网站被盗.示例:`<?php $ myVarValue ='<! - <script>'; ?>`.有关详细信息,请参阅[此问题](http://stackoverflow.com/q/20942452/1402846).解决方案:使用[`JSON_HEX_TAG`](http://www.php.net/manual/en/json.constants.php#constant.json-hex-tag)来逃避`<`和`>`(需要PHP 5.3) .0). (7认同)

bip*_*lav 8

请使用rest/rpc api并将json传递给你的js.如果您使用jquery,可以通过以下方式完成此操作:

rest.php

<?php echo "{name:biplav}" ?>
Run Code Online (Sandbox Code Playgroud)

然后从你的js拨打这样的电话:

var js_var;
$.get("rest.php", function(data) {
         js_var=data;
});
Run Code Online (Sandbox Code Playgroud)

这是我能想到的最简单的例子.


goa*_*oat 7

<?php
// filename: output-json.php
header('content-type:application/json;charset=utf-8');
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));
Run Code Online (Sandbox Code Playgroud)

json_encode是一个强大的函数,确保输出编码和格式化为有效的javascript/json.content-type标头告诉浏览器如何解释响应.

如果您的回答是真正的JSON,例如:

{"foo": 5}
Run Code Online (Sandbox Code Playgroud)

然后将其声明为content-type:application/json;charset=utf-8.与javascript相比,JSON解析速度更快,并且使用xss的可能性要小得多.但是,如果您需要在响应中使用真正的javascript,例如:

var obj = {foo: 5};
Run Code Online (Sandbox Code Playgroud)

然后将其声明为 content-type:text/javascript;charset=utf-8

您可以像文件一样链接到它:

<script src="output-json.php"></script>
Run Code Online (Sandbox Code Playgroud)

或者,可以方便地将值直接嵌入到html中,而不是单独生成http请求.这样做:

<script>
    <?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?>
</script>
Run Code Online (Sandbox Code Playgroud)

确保在JSON_HEX_TAG通过<script>标记嵌入到html中时使用,否则会冒xss注入攻击的风险.根据您使用它的上下文,还可能需要使用其他标志以获得更高的安全性:JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS.这些标志使响应的可读性降低,但通常对安全性和兼容性有好处,所以你应该只使用它们.

我真的想强调声明内容类型和可能使用JSON_HEX_TAG标志的重要性,因为它们都可以帮助缓解xss注入.

难道,除非你想吸引的XSS攻击做到这一点:

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Run Code Online (Sandbox Code Playgroud)