MySQL数据库包含编码和未编码的引号,它打破了javascript

时间:2017-10-13 10:51:19

标签: javascript php html mysql html-entities

示例数据库值为'12345',它分配给PHP变量$name

此值用于javacript onclick事件,例如:

onclick="assign('<?php echo $name;?>')

处理此问题的最佳方法是什么?

onclick="assign('<?php echo $name;?>')
// output: onclick="assign(''12345'')

onclick="assign('<?php echo htmlspecialchars($name);?>')
// output: onclick="assign('&#39;12345'')

onclick="assign('<?php echo addslashes($name);?>')
// output: onclick="assign(''12345\'')

onclick="assign('<?php echo htmlspecialchars(addslashes($name));?>')
// output: onclick="assign('&#39;12345\'')

最后一个版本有效,但我认为必须有更好的方法。

1 个答案:

答案 0 :(得分:2)

您应该尽可能使用语言感知的转义例程。 addslashes几乎不是正确的选择。

在这种情况下,json_encode将完成工作,因为JSON是描述文字的JavaScript位的子集。请注意,它还会添加引号以指示它是一个字符串。

一旦您确保JavaScript安全,您现有的htmlspecialchars选项就是使JavaScript安全嵌入HTML属性值的正确选择。

onclick="assign(<?php echo htmlspecialchars(json_encode($name));?>)

您还可以考虑使用data-属性存储数据,然后将事件处理程序与addEventListener绑定。