对输出到JavaScript变量的PHP字符串进行编码的最简单方法是什么?
我有一个包含引号和换行符的PHP字符串。我需要将此字符串的内容放入JavaScript变量中。
通常,我只是在PHP文件中构建我的JavaScript,àla:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
但是,当$myVarValue
包含引号或换行符时,这不起作用。
答案 0 :(得分:497)
扩大别人的答案:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
使用json_encode()要求:
$myVarValue
编码为UTF-8(当然是US-ASCII)由于UTF-8支持完整的Unicode,因此动态转换应该是安全的。
请注意,因为json_encode
会转义正斜杠,所以即使包含</script>
的字符串也会安全转义,以便使用脚本块进行打印。
答案 1 :(得分:26)
用JSON编码它
答案 2 :(得分:21)
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
答案 3 :(得分:20)
我遇到了类似的问题,并了解以下是最佳解决方案:
<script>
var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>
然而,micahwittman发布的link表明存在一些较小的编码差异。 PHP的rawurlencode()
函数应该符合RFC 1738,而Javascript的decodeURIComponent()
似乎没有这样的努力。
答案 4 :(得分:10)
偏执狂版本:Escaping every single character。
function javascript_escape($str) {
$new_str = '';
$str_len = strlen($str);
for($i = 0; $i < $str_len; $i++) {
$new_str .= '\\x' . sprintf('%02x', ord(substr($str, $i, 1)));
}
return $new_str;
}
编辑:json_encode()
可能不合适的原因是,有时您需要阻止生成"
,例如
<div onclick="alert(???)" />
答案 5 :(得分:6)
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
或
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
答案 6 :(得分:5)
Micah的解决方案对我有用,因为我必须定制的网站不是UTF-8,所以我不能使用json;我投了票,但我的代表不够高。
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
答案 7 :(得分:3)
您可以将其插入隐藏的DIV中,然后将DIV的innerHTML分配给您的JavaScript变量。你不必担心逃避任何事情。请确保不要将破坏的HTML放在那里。
答案 8 :(得分:3)
你可以尝试
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
答案 9 :(得分:3)
不要通过addslashes()
运行它;如果您在HTML页面的上下文中,HTML解析器仍然可以看到</script>
标记,甚至是中间字符串,并假设它是JavaScript的结尾:
<?php
$value = 'XXX</script><script>alert(document.cookie);</script>';
?>
<script type="text/javascript">
var foo = <?= json_encode($value) ?>; // Use this
var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
答案 10 :(得分:3)
别。使用Ajax,将其放入HTML中的data-*
属性或其他有意义的属性。使用内联脚本会使您的网页更大,could be insecure or still allow users to ruin layout,除非......
...你做了一个更安全的功能:
function inline_json_encode($obj) {
return str_replace('<!--', '<\!--', json_encode($obj));
}
答案 11 :(得分:2)
用htmlspecialchars
描述
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示。此函数返回一个字符串,其中包含一些转换;所做的翻译是对日常网络编程最有用的翻译。如果您需要翻译所有HTML字符实体,请改用htmlentities()。
此功能可用于防止用户提供的文本包含HTML标记,例如在留言板或留言簿应用程序中。
执行的翻译是:
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
答案 12 :(得分:-1)
如果您使用模板引擎构建HTML,那么您可以随意填写它!
结帐XTemplates。 这是一个很好的,开源的,轻量级的模板引擎。
你的HTML / JS看起来像这样:
<script>
var myvar = {$MyVarValue};
</script>
答案 13 :(得分:-1)
我不确定这是不好的做法还是不行,但我和我的团队一直在使用混合的html,JS和php解决方案。我们从我们想要引入JS变量的PHP字符串开始,让我们调用它:
$someString
接下来,我们使用页内隐藏表单元素,并将其值设置为字符串:
<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>
然后通过document.getElementById:
定义一个JS var很简单<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
现在,您可以在任何想要获取PHP字符串值的地方使用JS变量“moonUnitAlpha”。 这对我们来说似乎非常有效。我们将看看它是否能够持续使用。