htmlspecialchars + addslashes,有道理吗?

时间:2012-11-01 12:34:02

标签: php security htmlspecialchars addslashes

我正在尝试清理要保存在数据库中的字符串。 我采取的第一步是使用addslashes(),但后来我意识到它没有解决许多安全问题,所以我添加了htmlspecialchars(),现在我有了这行代码:

$val=htmlspecialchars(addslashes(trim($val)));

但后来我想知道在addslashes()处理的字符串上使用htmlspecialchars()是否有意义,因为后者将“删除”任何会导致问题的元素,如果我没弄错的话。

特别是,我想知道这是否会使服务器工作两次而没有任何实际需要。

2 个答案:

答案 0 :(得分:9)

你错了。 addslashes()不是数据库转义函数,使用数据库访问扩展附带的函数,如mysqli_real_escape_string()

htmlspecialchars()完整在这里没有意义。只有当你想在HTML中放置一个字符串时才使用它 - 这应该是在输出内容时,而不是在将其存储在数据库中时。

答案 1 :(得分:1)

将字符串保存到数据库时,我不会使用其中任何一种。

  • addslashes()仅转义引号字符和反斜杠字符(\)。它不足以避免SQL注入,因为DBMS可能会使用其他必须转义的特殊字符。避免SQL注入的最佳方法是使用PHP data objects及其对绑定参数的支持,这样可以将参数值完全保留在SQL字符串之外。如果由于某种原因PDO不是一个选项,那么至少应该使用特定于数据库的转义函数,例如: mysqli_real_escape_string如果您使用的是MySQL,请确保转义所有必需的字符。
  • htmlspecialchars()用于将非HTML字符串合并到HTML页面中;它会转义对Web浏览器很重要的字符,例如尖括号,并且与数据库无关。假设您没有在数据库中生成和存储完整的HTML文档,那么在将它们放入数据库之前,不应该在值上调用此函数。存储用户实际输入的内容,并在从数据库中检索值时调用htmlspecialchars(),并且您实际上将其放入某些HTML输出中。