您的位置:首页 > 其它

magic_quotes_gpc和magic_quotes_runtime的区别和用法详解

2016-07-20 09:57 411 查看
当你的数据中有一些 " '

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

中国地大物博"哈哈"

中国\地大物博"哈哈"

可以使用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,代码如下:

$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系统)

$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()函数。

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

ini_set("magic_quotes_runtime", 0);



if (phpversion() < '5.3.0') {
set_magic_quotes_runtime(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: