mysql_real_escape_string VS addslashes

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

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

mysql_real_escape_string:mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它将反斜杠预置为以下字符:\ x00,\ n,\ r,\,',“和\ x1a。

从我收集的主要区别是\ x00,\ n \ r \ x1a哪些addslashes不逃脱,你能告诉我什么意思是?

谢谢

你所引用的内容大概来自文档,但据我所知这不一定是真的。

addslashes为通常令人不安的字符添加斜杠。 mysql_real_escape_string转义任何MySQL需要转义。 这可能是或多或less的字符比addslashes照顾。

此外, mysql_real_escape_string不一定会添加斜杠来转义。 虽然我认为它的工作方式,如果你这样做,最近版本的MySQL通过将其中的两个放在一起而不是通过在它之前放置一个斜杠来脱离引号。

我相信你应该总是使用你的数据提供者的转义函数而不是addslashes ,因为addslashes可能会做太多或没有足够的工作来达到你使用它的目的。 另一方面, mysql_real_escape_string 知道如何准备将stringembedded到查询中。 即使规范改变了如何逃避东西,突然它不是反斜线,你应该再次使用,你的代码仍然会工作,因为mysql_real_escape_string会意识到它。

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

还请阅读addslashes()与指定的PHP安全性专家Chris Shiflett的mysql_real_escape_string() ,以获得即使使用addslashes()也可以获得SQL注入漏洞的演示。


其他人build议使用查询参数,然后你不必做任何转义的dynamic值。 我也推荐这样做,但是在PHP中,您必须切换到PDO或ext / mysqli,因为普通的ext / mysql API不支持查询参数。

此外,可能会出现一些不能使用dynamicstring值的查询参数的情况,例如全文search中的search模式。

有一堆mysql_escape_stringmysql_real_escape_string的历史。 他们都试图提供一个“通用”转义机制,以尽量减lessSQL注入攻击的可能性。

mysql_real_escape_stringaddslashes是好的,如果他们是你真正需要的 – 但他们可能不是。

正如@afrazier所说,你应该使用准备好的语句

而不是使用PDO准备查询,你可以在你的应用程序使用MySQLi时使用它(注意!“i”和Mysql)

 $nick = $connect->real_escape_string($nick); $nick= addcslashes($nick, '%_'); $pass = $connect->real_escape_string($pass); $pass = addcslashes($pass, '%_'); 

忽略这两个参数化查询。 当然,除非你喜欢注射攻击。