mysql_real_escape_string VS addslashes

chi*_*007 40 php mysql

有人可以从PHP手册中了解这两个函数之间的差异

addslashes:在需要在数据库查询中引用的字符之前返回带反斜杠的字符串.这些字符是单引号('),双引号("),反斜杠()和NUL(NULL字节).

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

从我收集到的主要区别是\ x00,\n\r\x1a,其中addlashes无法逃脱,你能告诉我这是什么意义吗?

谢谢

zne*_*eak 51

你引用的可能来自文档,但据我所知,它不一定是真的.

addslashes将斜杠添加到通常令人不安的字符中.mysql_real_escape_string逃避MySQL需要转义的任何内容.这可能比所addslashes照顾的更多或更少的字符.

此外,mysql_real_escape_string不一定要添加斜杠来逃避.虽然我认为如果你这样做是有效的,但是最新版本的MySQL通过将两个放在一起而不是在它之前放一个斜杠来逃避引用.

我相信你应该总是使用你的数据提供者的转义函数,而不是addslashes因为addslashes你使用它可能会做太多或不够的工作.另一方面,mysql_real_escape_string 知道如何准备字符串以将其嵌入查询中.即使规格改变了如何逃避的东西,突然间你不再使用反斜杠了,你的代码仍然有用,因为mysql_real_escape_string它会意识到它.

  • ANSI SQL指定单引号可以由一行中的两个单引号表示,但mysql_real_escape_string()不会这样做 - 它总是使用反斜杠转义,就我所见.如果你有一个MySQL版本的例子,通过加倍引号字符来逃避,我会有兴趣看到这个例子. (3认同)
  • @ BillKarwin,PHP的“ mysql_real_escape_string”调用MySQL的[`mysql_real_escape_string`](http://dev.mysql.com/doc/refman/4.1/en/mysql-real-escape-string.html),该脚本可以执行任何操作逃脱字符串。PHP文档现在说它使用黑斜杠,但是MySQL文档对此没有说明。我确实记得在某些时候它会用`''而不是\来转义,也许不再是这种情况了,或者它需要特定的连接设置(mysql_real_escape_string需要一个连接参数,以便它可以在以后检查它们所有)。 (2认同)
  • 啊哈,我进行了测试,发现如果您设置了SQL_MODE = NO_BACKSLASH_ESCAPES,它的行为就像您描述的那样。我的困惑是因为即使设置了sql模式,`mysqldump`仍然不执行双引号字符。这意味着您可以创建一个不能在生成它的服务器上重新导入的转储文件! (2认同)

Bil*_*win 15

mysql_real_escape_string()还会考虑当前连接到数据库使用的字符集.

PHP函数mysql_real_escape_string()使用同名的MySQL C API函数:http://dev.mysql.com/doc/refman/5.1/en/mysql-real-escape-string.html

另外,由着名的PHP安全专家Chris Shiflett 阅读addslashes()和mysql_real_escape_string(),以证明即使使用addslashes()也可以获得SQL注入攻击.


其他人建议使用查询参数,然后您不必进行任何动态值的转义.我也推荐这个,但在PHP中你必须切换到PDO或ext/mysqli,因为普通的ext/mysql API不支持查询参数.

此外,可能存在一些不能将查询参数用于动态字符串值的极端情况,例如全文搜索中的搜索模式.

  • +1用于阅读材料。很高兴得知这些主题。 (2认同)
  • “必须切换到 PDO”听起来对我来说是一个好处! (2认同)