基于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写的MySQL数据库用户认证系统代码
Mar 22 PHP
php性能优化分析工具XDebug 大型网站调试工具
May 22 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
php格式化金额函数分享
Feb 02 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
php常用日期时间函数实例小结
Jul 04 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
用文本作数据处理
2006/10/09 PHP
实用函数9
2007/11/08 PHP
php+mysql写的简单留言本实例代码
2008/07/25 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
js跳转页面方法总结
2014/01/29 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
9种python web 程序的部署方式小结
2014/06/30 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
Python+Opencv识别两张相似图片
2020/03/23 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python 导入文件过程图解
2019/10/15 Python
倡议书格式及范文
2015/04/29 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
社区低保工作总结2015
2015/07/23 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL