mysql_real_escape_string()做了什么,addslashes()没有?

Mic*_*rdt 20 php security sql-injection

为什么我们需要特定于数据库的函数,如mysql_real_escape_string()?它能做什么,addslashes()不是吗?

暂时忽略参数化查询的优越替代方案,是一个使用addslashes()的webapp,它仍然容易受到SQL注入的攻击,如果是,如何?

Óla*_*age 19

它添加了斜杠:

\x00, \n, \r, \, ', " and \x1a. characters.
Run Code Online (Sandbox Code Playgroud)

addslashes只添加斜杠

' \ and NUL
Run Code Online (Sandbox Code Playgroud)

伊利亚斯的文章也非常详细地介绍了它的功能


Chr*_* KL 19

在处理多字节编码字符串时,Addslashes通常不够好.

  • 任何具有以0x5c结尾的有效多字节字符的编码都可以通过`addslashes()`潜行引号.Chris Shiflett在使用GBK的博客上有一个很好的例子.http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string (5认同)

bob*_*nce 5

gs苛刻的低调回答实际上是对的.

标准SQL使用加倍来逃避文字撇号.MySQL的非标准反斜杠用于转义是默认设置,但它可以被禁用,通常是,特别是在sql_mode ANSI中.

在这种情况下,只有doubled语法才能工作,并且您使用addslashes(或其他ad-hoc转义方法)的任何应用程序都将中断.mysql_real_escape_string将使用最适合连接的sql_mode的转义方法.

如果您仍在使用那些重复使用较低128个字符的令人讨厌的东亚编码,那么多字节编码问题也很重要,但实际上您想要使用UTF-8.另一方面,由于MySQL可以完全愉快地处理声明中的原始换行符,因此无需担心.


bob*_*obo 5

mysql_real_escape_string 的作用不止于此addslashes

\n\n

addslashes 在纯 ascii 上运行,无需了解任何有关数据库的信息。它逃脱了:

\n\n
    \n
  • \'\xe2\x86\x92\\\'
  • \n
  • "\xe2\x86\x92\\"
  • \n
  • \\\xe2\x86\x92\\\\
  • \n
  • ASCII 0\xe2\x86\x92 \\0
  • \n
\n\n

mysql_real_escape_string的目的是“创建一个可以在 SQL 语句中使用的合法 SQL 字符串”。mysql_real_escape_string 考虑连接的当前字符集(这就是为什么您必须始终传递有效的 $mysql 对象)。

\n\n

它执行以下操作(摘自 MySQL C API 文档):

\n\n
    \n
  • 编码: \\\'"、 ASCII 0\\n\\r、 和Control+Z以不会引起问题的方式
  • \n
  • 确保一个0字节终止字符串(在 C api 中)
  • \n
  • 如果 $mysql 中链接的数据库使用宽字符集,则可以执行多字节 (ascii) 到宽字符的转换。
  • \n
\n\n

我真的不知道 PHP 如何在内部存储字符串,但重点是当您使用mysql_real_escape_string. 我想主要的区别是mysql_real_escape_string 考虑连接的字符集,而addslashes不能(它甚至不知道您连接到哪个数据库)。

\n