pg_escape_string或mysql_escape_string是否足以清理字符串?

时间:2010-04-29 10:23:57

标签: php

pg_escape_string或mysql_escape_string是否足以在将数据插入数据库表之前清理字符串?

5 个答案:

答案 0 :(得分:3)

“消毒”这个词非常值得怀疑。它暗示了某些角色“不好”并且必须在源头过滤的世界观。这是错误的。

以适当的格式获取文本以进入SQL查询是关于将带外字符转义为其SQL文字形式,而不是删除“坏”字符。如果您想在输入应用程序时验证用户输入(例如,验证电话号码中没有字母,或者删除不需要的控制字符),那就没问题了。但这是一个特定于应用程序的验证问题,与SQL转义或HTML转义有关的问题完全不同。这些是输出阶段的问题。

mysql_escape_string可能不足以安全地转义文本以包含在SQL字符串文字中。在可能使用某些东亚字符集作为编码的连接或某些非默认SQL语法选项上,它将生成可以允许SQL注入的格式错误的字符串。 mysql_real_escape_string更好。但是,参数化查询可以避免此问题,并且在可用的情况下首选。

pg_escape_string使用连接,就像mysql_real_escape_string一样,所以我希望它是安全的。但仍然是参数!在pg_中,您获得pg_query_params,因此没有理由不使用它们。

答案 1 :(得分:1)

对于数据 - 是的。只是不要忘记将它括在引号中。

但参数化查询被认为更好,因为对于普通的PHP程序员来说,转义规则似乎太复杂了。

请注意,转义或参数与标识符或运算符无关。比如,字段名称根本无法清理。转义也无法帮助LIMIT参数。

答案 2 :(得分:0)

没有

盲目调用mysql_real_escape_string是不够的,以防止SQL注入攻击。从手册:

  

mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,该函数将反斜杠添加到以下字符:\ x00,\ n,\ r,\,',“和\ x1a。

     

注意:mysql_real_escape_string()不会转义%和_。如果与LIKE,GRANT或REVOKE结合使用,这些是MySQL中的通配符。

答案 3 :(得分:-2)

(见其他地方的评论)

答案 4 :(得分:-3)

不。对于xss攻击,您还可以使用HTML Purifier http://htmlpurifier.org/清理输入。