基于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 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
初次接触php抽象工厂模式(Elgg)
Mar 21 PHP
php allow_url_include的应用和解释
Apr 22 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
PHP使用逆波兰式计算工资的方法
Jul 29 PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
js验证表单第二部分
2006/11/25 Javascript
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
Javascript中Eval函数的使用说明
2008/10/11 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python服务器与android客户端socket通信实例
2014/11/12 Python
Python中的pprint折腾记
2015/01/21 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python函数式编程实例详解
2020/01/17 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
基于Python实现粒子滤波效果
2020/12/01 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
颐和园导游词400字
2015/01/30 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书