MySQL 数据库包含编码和未编码的引号,它正在中断 javascript

MySQL database contains quotes encoded and unencoded and it's breaking javascript

示例数据库值为 '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\'')

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

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

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

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

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

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