让我们想象一下表单编辑器,它可以编辑可用的值。如果数据包含"
字符(双引号),则“破坏”HTML代码。我的意思是,让我们检查代码:所以我生成HTML:
onclick="var a = prompt('New value: ', '<?php echo addslashes($rec[$i]); ?>'); if (a != null)....
,结果是
onclick="var a = prompt('New value: ', 'aaaa\"aaa'); if (a != null) { v....
这使得JS无法工作,因此它会破坏代码。使用单个qoute '
,它可以正常工作。 mysql real escape
也是如此。
如何转义任何字符串,以免它破坏javascript?
json_encode看起来不错,但我一定做错了,它仍然很糟糕:继续看看Firefox如何看待它 - 它插入了一个“糟糕”的双引号!这个值只是一个简单的数字:
http://img402.imageshack.us/img402/5577/aaaahf.gif
我确实使用过:
('Ird be az új nevet:', <?php echo json_encode($rec['NAME']); ?>); if (a) {
答案 0 :(得分:23)
onclick
属性的值应与其他任何HTML属性一样使用htmlspecialchars()
进行转义。代码中的实际Javascript字符串应使用json_encode()
进行编码。例如:
<?php
$message = 'Some \' problematic \\ chars " ...';
$jscode = 'alert('.json_encode($message).');';
echo '<a onclick="' . htmlspecialchars($jscode) . '">Click me</a>';
据说... onclick(或任何其他事件)属性是如此2005年。帮自己一个忙,将你的javascript代码从你的html代码中分离出来,最好是外部文件,并使用DOM函数(或jQuery)附加事件,很好地包装了它)
答案 1 :(得分:1)
onclick="var a = prompt('New value: ', 'aaaa\"aaa'); if (a != null) { v....
您的问题以粗体突出显示。 您不能引用变量声明 因为它在单引号内,所以一旦删除它就不需要转义双引号。 应该看起来像这样 -
onclick="newFunc();"
<script>
function newFunc() {
var a = prompt('New value: ', 'aaaa"aaa');
if (a != null) { v....
}
</script>
答案 2 :(得分:1)
...onclick="new_func();"...
<script>
function new_func() {
var a = prompt('new value:','<?php code; ?>');
if (a) { <!--javascript code--> } else { <!--javascript code--> }
}
</script>
答案 3 :(得分:0)
我真的只是在重写@Marshall House在这里说的话,但是:
在HTML中,双引号(“)将总是结束一个属性,无论反斜杠如何 - 所以它看到:onclick="var a = prompt('New value: ', 'aaaa\"
。@ Marshall提供的解决方案是分离你的代码输出到一个函数。这样你可以毫无问题地将转义的PHP打印到它中。
E.g:
<script>
// This is a function, wrapping your code to be called onclick.
function doOnClickStuff() {
// You should no longer need to escape your string. E.g.:
//var a = prompt('new value:','<?php echo $rec[$i]; ?>');
// Although the following could be safer
var a = prompt('new value:',<?php json_encode($rec[$i]); ?>);
if (a) { <!--javascript code--> }
else { <!--javascript code--> }
}
</script>
<someelement onclick="doOnClickStuff();"> <!-- this calls the javascript function doOnClickStuff, defined above -->