跨境电商
经验交流分享

魔术引号,addslashes与mysql_real_escape_string

之前一直对这些问题不是很清楚,今天把这部分内容给拿下。虽然魔术引号在现在的PHP版本中已经基本删去。但是出于对老版本的代码学习,还是搞清楚其基本概念为好。

mysql_real_escape_string()与addslashes()
首先明确下基本定义:
mysql_real_escape_string
Escapes special characters in a string for use in an SQL statement
mysql_real_escape_string() calls MySQL’s library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ‘, ” and \x1a. This function must always (with few exceptions) be used to make data safe before sending a query to MySQL.
它是用来转义在SQL语句中使用的字符串中的特殊字符。它调用MySQL的这个函数,对上述的一些字符前边添加反斜杠进行转移。在对MySQL进行查询之前,这个函数必须用于保证数据的安全。

下边是一个典型的数据库注入攻击。
[PHP]
// We didn’t check $_POST[‘password’], it could be anything the user wanted! For example:
$_POST[‘username’] = ‘aidan’;
$_POST[‘password’] = “‘ OR ”='”;

// Query database to check if there are any matching users
$query = “SELECT * FROM users WHERE user='{$_POST[‘username’]}’ AND password='{$_POST[‘password’]}'”;
mysql_query($query);

// This means the query sent to MySQL would be:
echo $query;
[/PHP]

addslashes
Quote string with slashes
Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote (‘), double quote (“), backslash (\) and NUL (the NULL byte).
返回字符串,如果该字符串中有字符需要转移,则在这些字符之前加上反斜杠。需要进行转移的字符包括单引号,双引号,反斜杠,NUL。

An example use of addslashes() is when you’re entering data into a database. For example, to insert the name O’reilly into a database, you will need to escape it. It’s highly recommended to use DBMS specific escape function (e.g. mysqli_real_escape_string() for MySQL or pg_escape_string() for PostgreSQL), but if the DBMS you’re using doesn’t have an escape function and the DBMS uses \ to escape special chars, you can use this function. This would only be to get the data into the database, the extra \ will not be inserted. Having the PHP directive magic_quotes_sybase set to on will mean ‘ is instead escaped with another ‘.
使用addslashes函数的一个例子,插入数据到数据库中的时候。比如,当插入o’reilly到数据库的时候,必须对它进行转义。强烈建议使用DBMS特有的转义函数,比如MySQL的mysqli_real_escape_string或者是PostgreSQL的pg_escape_string函数,如果该DBMS没有自己的转义函数并且其转义时使用反斜杠,你可以使用addslashes()对其进行转义。转义的步骤实际上只是插入数据到数据库中,转义中多余的反斜杠并不会被插入。如果magic_quotes_sybase配置开启,将完全不同。看下边的魔术引号配置。

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you’ll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.
PHP的magic_quotes_gpc配置默认是关闭的(5.3就是),如果默认开启,PHP会对GPC数据进行自动转义。开启状态下,不需要使用addslashes()对已经被自动转义的字符串继续转义。否则会造成双重转义。可以使用get_magic_quotes_gpc()来查看当前系统是否开启了magic_quotes_gpc配置。

下边进行一些实验,准备在MySQL数据库中插入数据o’relly字符串:
在magic_quotes_gpc魔术引号关闭的情况下:
如果使用了mysql_real_escape_string()或者addslashes()函数对输入数据过滤。则可以顺利插入到数据库中。
如果不使用mysql_real_escape_string()或者addslashes()过滤数据,则插入数据失败。

在magic_quotes_gpc魔术引号开启的情况下:
不需要转义即可直接将数据插入数据库。原因如下,
When on, all ‘ (single-quote), ” (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.
今天实际研究中,开启magic_quotes_gpc的情况下,表单中提交的o’realy会自动被转义为o\’realy。关闭的时候不会自动转义,直接显示o’realy。另外需要注意的地方是,实际上无论是开启Magic Quotes自动转义或者关闭时使用addslashes()和mysql_real_escape_string()转义,都不会将转义后加入的反斜杠\插入到数据库内,只是在本地输出的时候会有反斜杠转义相关字符。

影响PHP魔术引号配置的指令有三个.
– magic_quotes_gpc
  Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP.
  mygic_quotes_gpc 影响当前HTTP请求数据,GET,POST和COOKIE。无法再运行时设置这个值。在PHP中默认开启这个值。注意:在PHP5.3版本之后,该配置是默认为off。至少当前使用版本是这样的。get_magic_quotes_gpc()可以查看当前系统是否开启了Magic Quotes。

– magic_quotes_runtime
  If enabled, most functions that return data from an external source, including databases and text files, will have quotes escaped with a backslash. Can be set at runtime, and defaults to off in PHP. See also set_magic_quotes_runtime() and get_magic_quotes_runtime().
  如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off。 参见 set_magic_quotes_runtime() 和 get_magic_quotes_runtime()。

– magic_quotes_sybase
  If enabled, a single-quote is escaped with a single-quote instead of a backslash. If on, it completely overrides magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ”. Double quotes, backslashes and NULL’s will remain untouched and unescaped. See also ini_get() for retrieving its value.
  如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ”。而双引号、反斜线 和 NULL 字符将不会进行转义。

赞(0)
未经允许不得转载:锐想 » 魔术引号,addslashes与mysql_real_escape_string
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

锐想电商 - 跨境电商经验交流分享

锐想无限