用echo回避“php中的角色”

时间:2017-10-28 20:00:15

标签: php html escaping

简短的问题:

echo '<button type="button" id="add" onClick="addAsset('.$filename.');"> '.$filename.' </button>';

这会创建一个带有onClick函数的按钮addAsset(example.png); 但是我想要addAsset(“example.png”)如何逃脱“角色?”

谢谢!

3 个答案:

答案 0 :(得分:2)

您最终想要的最终结果是:

<button type="button" id="add" onClick="addAsset(&quot;example.png&quot;);"> example.png </button>

否则您将破坏HTML语法。另一种选择是无冲突的报价:

<button type="button" id="add" onClick="addAsset('example.png');"> example.png </button>

但是,如果$filename包含不受欢迎的字符,您仍然必须escape/encode your input correctlyonClick属性的值必须是有效的Javascript,有效的HTML。所以:

printf('<button type="button" id="add" onClick="%s"> %s </button>',
       htmlspecialchars(sprintf('addAsset(%s)', json_encode($filename))),
       htmlspecialchars($filename));

答案 1 :(得分:1)

使用转义单引号\'

echo '<button type="button" id="add" onClick="addAsset(\''.$filename.'\');"> '.$filename.' </button>';

答案 2 :(得分:1)

您可以尝试以下方式:

echo '<button type="button" id="add" onClick="addAsset(\''.$filename.'\');"> '.$filename.' </button>';

所以,而不是转义"双引号。我们正在逃避'单引号。在阅读html输出时哪个更清楚。

编辑:更好的方法是在php块之外编写html块,如下所示:

<?php 
//Your PHP COde
?>
<button type="button" id="add" onClick="addAsset('<?= $filename ?>');"><?= $filename ?></button>
<?php 
//More PHP COde
?>

正如您所看到的那样,它将更具可读性,并且不需要转义。正如您可能会注意到这使用了<?= $filename ?>,这只是<?php echo $filename ; ?>的缩写。在Escaping from HTML

中了解有关所有这些的更多信息

编辑2:另外,正如@deceze建议的那样,如果变量$filename可能包含引号或某些内容,您可以使用htmlentities()来保护您,它会保护您如果filename的值,则针对XSS  是来自用户的输入。你可以像下面这样使用它:

<button type="button" id="add" onClick="addAsset('<?= htmlentities($filename) ?>');"><?= htmlentities($filename) ?></button>

此外,请检查下面的@deceze's Answer,以便更好地了解如何在特定情况下保护代码免受xss的侵害。