基于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 相关文章推荐
一个php作的文本留言本的例子(六)
Oct 09 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
PHP extract 将数组拆分成多个变量的函数
Jun 30 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 PHP
php实现图片等比例缩放代码
Jul 23 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
php post换行的方法
2020/02/03 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
js仿360开机效果
2019/12/26 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
Python实现截屏的函数
2015/07/26 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
python的unittest测试类代码实例
2017/12/07 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
毕业生面试求职信
2014/06/23 职场文书
运动会报道稿300字
2014/10/02 职场文书
欠条格式范本
2015/07/03 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle