【问题标题】:htmlspecialchars + addslashes, makes any sense?htmlspecialchars + addlashes,有什么意义吗?
【发布时间】:2012-11-01 12:34:02
【问题描述】:

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

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

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

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

【问题讨论】:

标签: php security htmlspecialchars addslashes


【解决方案1】:

你完全错了。 addslashes()没有数据库转义功能,使用你的数据库访问扩展自带的,比如mysqli_real_escape_string()

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • addslashes() 并不是为了避免 SQL 注入,它只是看起来像是在做。根据使用的编码之类的参数,它可能会错过一堆更奇特的字符。
    • 避免SQL注入是意思,只是避免SQL注入的方法。 (像mysql_real_escape_string() 这样的特定于数据库的转义函数更好,但当然 PDO 绑定参数更好。)
    猜你喜欢
    • 2016-09-16
    • 2010-09-23
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2011-05-04
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多