[转]PHP的自动加反斜杠转义,magic_quotes_gpc和magic_quotes_runtime

magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误 。

在magic_quotes_gpc=On的情况下,如果输入的数据有

单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在magic_quotes_gpc=Off下 进行了。(这个特性在PHP5.3.0中已经废弃并且在5.4.0中已经移除了(This feature has been DEPRECATED as of PHP 5.3.0 andREMOVED as of PHP 5.4.0.)(引发的思考:更换PHP版本需注意转义的变化和处理)在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖 这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。

当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1

当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0

因此可以看出这个get_magic_quotes_gpc()函数的作用就是得到环境变量magic_quotes_gpc的值。既然在PHP6中删除了magic_quotes_gpc这个选项,那么在PHP6中这个函数我想也已经不复存在了。

php 判断是否开启get_magic_quotes_gpc功能了,以方便我们是否决定使用addslashes这个函数了。

function SQLString($c, $t){

$c=(!get_magic_quotes_gpc())?addslashes($c):$c;

switch($t){

case 'text':

$c=($c!='')?"'".$c."'":'NULL';

break;

case 'search':

$c="'%%".$c."%%'";

break;

case 'int':

$c=($c!='')?intval($c):'0';

break;

}

return $c;

}

预防数据库攻击的正确做法

function check_input($value)

{

// 去除斜杠

if (get_magic_quotes_gpc())

{

$value = stripslashes($value);

}

// 如果不是数字则加引号

if (!is_numeric($value))

{

$value = “‘” . mysql_real_escape_string($value) . “‘”;

}

return $value;

}

$con = mysql_connect(“localhost”, “hello”, “321″);

if (!$con)

{

die(‘Could not connect: ‘ . mysql_error());

}

// 进行安全的 SQL

$user = check_input($_POST['user']);

$pwd = check_input($_POST['pwd']);

$sql = “SELECT * FROM users WHERE

user=$user AND password=$pwd”;

mysql_query($sql);

mysql_close($con);

http://www.php100.com/html/php/hanshu/2013/0905/4689.html

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠

htmlspecialchars

把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体。

strip_tags()

函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

也可以获取配置项判断:

ini_get('magic_quotes_gpc')

特殊字符在SQL中将报错,需要\转义,转义后才能存储该特殊字符,比如'要存入必须\’转义后才能正常执行存储,存储后数据库中是'而不是\',输出也是 '。如下:

------------------------------------------------------

http://www.jb51.net/article/38990.htm

PHP magic_quotes_gpc主要是作用在WEB客户服务端的,它的作用时间是从请求开始,接下来我们将具体的为大家讲解它的使用方式。

AD:

我们今天要向大家介绍的是PHP magic_quotes_gpc的具体使用方法。大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发生作用。

•PHP函数preg_split的正确使用方法

•解读PHP函数explode()的具体使用方法

•PHP函数implode()与explode()函数的不同

•PHP类CMS如何自动获取关键字

•探讨PHP函数split()如何使用正则表达式切

1.

条件:PHP magic_quotes_gpc=off

写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

数据库保存格式:无数据。

输出数据格式:无数据。

说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。

2.

条件:PHP magic_quotes_gpc=off

写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow”''sun (和输入一样)

输出数据格式:snow”''sun (和输入一样)

说明: addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行,

但\'并未作为数据存入数据库,数据库保存的是snow”''sun 而并不是我们想象的snow\'\'\'\'sun

3.

条件:PHP magic_quotes_gpc=on

写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow”''sun (和输入一样)

输出数据格式:snow”''sun (和输入一样)

说明: PHP magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,

但\'并未作为数据入数据库,数据库保存的是snow”''sun而并不是我们想象的snow\'\'\'\'sun。

4.

条件:PHP magic_quotes_gpc=on

写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\'\'\'\'sun (添加了转义字符)

输出数据格式:snow\'\'\'\'sun (添加了转义字符)

说明: PHP magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,

addslashes又将即将写入数据库的单引号转换为\',后者的转换被作为数据写入

数据库,数据库保存的是snow\'\'\'\'sun

-------------(综上,magic_quotes_gpc布置对传输数据POST,GET,COOKIE有效对 执行SQL语句入库 的 数据也有效

总结如下:

1. 对于PHP magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作

addslashes()和stripslashes()的操作,数据也会正常显示。-------(处理对POST,GET,COOKIE自动处理还对 插入数据库的数据自动转义,注意是数据不是整个SQL语句)

如果此时你对输入的数据作了addslashes()处理,

那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于PHP magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出

因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:

PHP magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.

magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据

这个特性在PHP5.3.0中已经废弃并且在5.4.0中已经移除了(This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.)。所以没有理由再使用魔术引号,因为它不再是 PHP 支持的一部分。 不过它帮助了新手在不知不觉中写出了更好(更安全)的代码。 但是在处理代码的时候,最好是更改你的代码而不是依赖于魔术引号的开启。

----------------------------------

http://www.jb51.net/article/35868.htm

当你的数据中有一些 \

这样的字符要写入到数据库里面,又想不被过滤掉的时候,它就很有用,会在这些字符前自动加上\,如

中国\地大物博”哈哈”

中国\\地大物博\”哈哈\”

可以使用set_maginc_quotes_runtime(0)关闭掉,当然你也可以直接在php.ini中设置。

get_magic_quotes_runtime() 取得 PHP 环境变量 magic_quotes_runtime 的值。

magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

两者不同

set_magic_quotes_runtime() 可以让程序员在代码中动态开启或关闭 magic_quotes_runtime,

set_magic_quotes_runtime(1) 表示开启,set_magic_quotes_runtime(0) 则表示关闭。当set_magic_quotes_runtime(1) 时,从数据库或通过fread之类的函数读取的文本,将自动对' “和\自动加上反斜杠\进行转义,防止溢出。这在对数据库的数据进行转移的时候非常有用。但在一般情况下,应当将其关闭,否则从数据库读取出来的数据单引 号、双引号和反斜杠都会被加上\,导致显示不正常。像Discuz,PHPWind都在公共文件的头部加上一句 set_magic_quotes_runtime(0); 强制关闭 magic_quotes_runtime 。

magic_quotes_gpc

作用范围是:WEB客户服务端;

作用时间:请求开始是,例如当脚本运行时.

magic_quotes_runtime

作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;

作用时间:每次当脚本访问运行状态中产生的数据.

所以

magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据,

magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据,

magic_quotes_gpc 是对通过GET、POST、COOKIE传递的数据进行转义,一般在数据入库前要先进行转义,

magic_quotes_gpc不能在代码中动态开启或关闭,需要到php.ini将magic_quotes_gpc设置为on或off,

代码中可以用get_magic_quotes_gpc获取magic_quotes_gpc的状态。

当magic_quotes_gpc为off时,需要手工对数据进行addslashes,代码如下:

复制代码 代码如下:

if (!get_magic_quotes_gpc()) {

new_addslashes($_GET);

new_addslashes($_POST);

new_addslashes($_COOKIE);

}

function new_addslashes($string) {

if (is_array($string)) {

foreach ($string as $key => $value) {

$string[$key] = new_addslashes($value);

}

} else {

$string = addslashes($string);

}

return $string;

}

另一示例:

复制代码 代码如下:

$data1 = $_POST['aaa'];

$data2 = implode(file('1.txt'));

if (get_magic_quotes_gpc()) {

//把数据$data1直接写入数据库

} else {

$data1 = addslashes($data1);

//把数据$data1写入数据库

}

if (get_magic_quotes_runtime()){

//把数据$data2直接写入数据库

//从数据库读出的数据要经过一次stripslashes()之后输出 (由于打开,输出时自动再加反斜杠要去除回去)

} else {

$data2 = addslashes($data2);

//把数据$data2写入数据库

//从数据库读出的数据直接输出

}

++++++++++++++++++++++++++++++++++++++++++++++++++++++

经验总结:

一、对于GPC,不管系统有没有开启magic_quotes_gpc(即php.ini中magic_quotes_gpc = On),我们统一开启 magic_quotes_gpc,对get、post、cookie的内容进行转义。操作如下:

(摘自uchome系统)

复制代码 代码如下:

function saddslashes($string) {

if (is_array($string)) {

foreach ($string as $key => $val) {

$string[$key] = saddslashes($val);

}

} else {

$string = addslashes($string);

}

return $string;

}

//GPC过滤

$magic_quote = get_magic_quotes_gpc();

if(empty($magic_quote)) {

$_GET = saddslashes($_GET);

$_POST = saddslashes($_POST);

}

//COOKIE,给cookie值转义

$prelength = strlen($_SC['cookiepre']);

foreach ($_COOKIE as $key => $val) {

if(substr($key, 0, $prelength) == $_SC['cookiepre']) {

$_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val;

}

}

二、 对于magic_quotes_runtime,我们统一关闭它,即set_magic_quotes_runtime(0);不让从数据库读取出来的数 据的单引号、双引号和反斜杠都自动被加上\。这样,对数据库的操作如下:添加数据到数据库之前,我们手动对数据进行addslashes(),而从数据库 取出数据时,则作相反操作,即stripslashes()。--这里晕了,自动一次不需要相反啊??

三、对于要序列化的内容,要保持裸数据,即要去掉转义,stripslashes(),然后在把序列化过的内容保存到数据库当中(注意,序列化过的内容是不带单引号(')、双引号(”)、反斜线(\)的),示例如下:

$feedarr['body_data'] = serialize(stripslashes($body_data));

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

出现Function set_magic_quotes_runtime() is deprecated 问题?

在安装 PHPCMS出现Deprecated: Function set_magic_quotes_runtime() is deprecated 错误,查了一下网络及资料发现是PHP5.3和PHP6.0之后移除了set_magic_quotes_runtime()函数。

我可以使用如下方案替代:

view sourceprint?

@set_magic_quotes_runtime(0);

view sourceprint?

ini_set("magic_quotes_runtime", 0);

view sourceprint?

if (phpversion() < '5.3.0') {

set_magic_quotes_runtime(0);

}

http://blog.csdn.net/yw5201314/article/details/9425457

总结如下:

1. 对于magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作

addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,

那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出

因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。