当magic_quotes_gpc = on时,从外部post、get、cooki过来的数据都会在预定义字符之前添加”\“。

比如:

程序中var_dump($_GET[‘id’]);

phpgpcphp中有关操作数据库平安的几个函数总结干货 SQL

输出的结果为:

string(3) “1\’”

预定义的字符为:

单引号(‘) 双引号(”) 反斜杠(\) NULL

当magic_quotes_gpc=off时,写入数据库的字符串未经由任何过滤处理,从数据库中读出的字符串也未作任何处理。
如何这样设置这个开关,并且没有其他对字符串进行处理的操作,那么可能会给数据库的读写带来问题,例如:

将数据:$data = “insert_data’”to_mysal”;(data和to之间是一个单引号,一个双引号)

若将字符串$data写入数据库中,则会涌现sql语句缺点,写入数据失落败。

那么如果不该用这个“开关”就没有办法办理这个问题了吗?答案是否定的。

我们可以利用以下方法:

利用addslashes() 函数

函数原型:

string addslashes ( string $str )

参数:要转义的字符串

返回值:返回转义后的字符串

浸染:将要转义的字符串中的预定义字符转义,即在预定义字符前面加上反斜杠。

php中还有一个函数能转义sql语句中利用的字符串中分外的字符,该函数的原型如下:

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )

本函数将 unescaped_string 中的分外字符转义,并计及连接确当前字符集,因此可以安全用于 mysql_query()。

现在向数据库中插入数据的可能会引起sql语句被污染的问题已经办理了,可是如果现在想要把刚才添加到数据库中的元素读取出来的话,会创造读出的数据中每个预定义的字符前面都多了一个反斜杠,这时反斜杠并不是我们想要的,那么有没有办法将每个预定义字符前面的反斜杠去掉呢?

php中也供应了具有该功能的函数:

函数原型为:

string stripslashes ( string $str );

函数返回值:返回一个去掉转义反斜杠的字符串,即去掉addslashes()函数添加的字符串。

其余tp中自定义了一个函数:

function stripslashes_deep($value)

{

$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);

return $value;

}

这个函数也能去除预定义字符前的反斜杠。

现在还有一个问题:在访问做事器之前,我们并不知道“邪术开关”的状态是打开还是关闭,如果已经处于打开状态,再利用addslashes()函数进行转义,就会使预定义前面有两个反斜杠,从而使的写入数据库的数据发生改变。

办理办法:

可以利用函数get_magic_quotes_gpc()进行考验“邪术开关”是否打开。

$data = get_magic_quotes_gpc() ? $data : addslashes($data);