mysql_real_escape_string和mysql_escape_string有什么本质的区别,有什么用处,为什么被弃用?
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/48
mysql_real_escape_string和mysql_escape_string有什么本质的区别,有什么用处,为什么被弃用?
1.官方说明:
1.1 mysql_real_escape_string
(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
Warning
本扩展自 PHP 5.5.0 起已废弃,并在自 PHP 7.0.0 开始被移除。应使用 MySQLi或 PDO_MySQL扩展来替换之。参见 [MySQL:选择 API]) 指南以及相关 FAQ 来获取更多信息。用以替代本函数的有:
-
mysqli_real_escape_string()
-
PDO::quote()
mysql_real_escape_string( string $unescaped_string
[, resource $link_identifier
= NULL ] ) : string
本函数将 unescaped_string
中的特殊字符转义,并接收连接的当前字符集,因此可以安全用于 mysql_query()
mysql_real_escape_string() 调用mysql库的函数mysql_real_escape_string, 在以下字符前添加反斜杠: \x00, \n, \r, **, ', " 和 \x1a.
为了安全起见,在像MySQL传送查询前,必须调用这个函数(除了少数例外情况)。
参数说明
unescaped_string
The string that is to be escaped.
link_identifier
MySQL 连接。如不指定连接标识,则使用由 mysql_connect() 最近打开的连接。如果没有找到该连接,会尝试不带参数调用 mysql_connect() 来创建。如没有找到连接或无法建立连接,则会生成 E_WARNING
级别的错误
1.2 mysql_escape_string
(PHP 4 >= 4.0.3, PHP 5)
mysql_escape_string — 转义一个字符串用于 mysql_query
说明
mysql_escape_string ( string $unescaped_string
) : string
本函数将 unescaped_string
转义,使之可以安全用于mysql_query()。
Note: mysql_escape_string() 并不转义%* 和 _。 本函数和mysql_real_escape_string() 完全一样,除了 mysql_real_escape_string() 接受的是一个连接句柄并根据当前字符集转义字符串。mysql_escape_string() 并不接受连接参数,也不管当前字符集设定。
2.用处及区别
通过上面的说明,我们可以知道两者都是为了防止sql注入,对传递的字符串进行转义处理,但两者有一些区别
2.1mysql_real_escape_string:
1.该函数有两个参数,其中第二个参数是MySQL 连接,为选填参数,默认为上一个数据库链接connection
2.使用之前要先连接上数据库,否则会出错
3.在转义字符串的时候,会考虑当前链接connection字符集。
2.2 mysql_escapte_string
mysql_escapte_string仅仅是对字符串进行转义处理,不考虑mysql链接及字符集问题。
请记住,任何转义操作都不一定能避免sql注入的问题,所有转义都永远不足以保护数据库,因为这种转义操作是一种反应式防御机制,它仅修复数据库中非常有限且已知的漏洞
所以适当且唯一(实际上)的防御是一种主动:使用准备好的语句。对准备好的语句的设计要格外小心,以便仅执行有效的和已编程的SQL。如果正确完成,则会大大降低执行意外SQL的可能性。比如PDO msyql 扩展
4.为什么被废弃
其实从官方文档也能得出,主要原因还是涉及到安全的问题,会造成sql注入。
5.拓展:mysql与mysqli的区别
mysqli连接是永久连接,而mysql是非永久连接。
mysqli的面向过程的使用,mysqli的面向对象的使用
mysql连接:每当第二次使用的时候,都会重新打开一个新的进程。 mysqli连接:一直都只使用同一个进程。 mysqli好处可以很大程度的减轻服务器端压力。 当然,如果mysql也需要永久连接的话,就可以使用mysql_pconnect()这个函数
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/48