基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍


Posted in PHP onApril 22, 2013

当你的数据中有一些   \  ”  ‘
这样的字符要写入到数据库里面,又想不被过滤掉的时候,它就很有用,会在这些字符前自动加上\,如
中国\地大物博”哈哈”
中国\\地大物博\”哈哈\”
可以使用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); 
 }

PHP 相关文章推荐
一个好用的分页函数
Nov 16 PHP
php 表单数据的获取代码
Mar 10 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
解析php类的注册与自动加载
Jul 05 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
php绘制圆形的方法
Jan 24 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
Apr 22 #PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 #PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 #PHP
php多文件上传功能实现原理及代码
Apr 18 #PHP
php实现多张图片上传加水印技巧
Apr 18 #PHP
基于initPHP的框架介绍
Apr 18 #PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 #PHP
You might like
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
vue分页器组件编写方法详解
2019/06/28 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python双向循环链表实现方法分析
2018/07/30 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python urllib3软件包的使用说明
2020/11/18 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
长江三峡导游词
2015/01/31 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
交通事故协议书范本
2016/03/19 职场文书
导游词之山东红叶谷
2019/10/31 职场文书