php magic_quotes_gpc的一点认识与分析


Posted in PHP onAugust 18, 2008

blankyao 说“学习的过程就是不断的发现错误,不断的改正错误”;

先看下手册上怎么说的吧!

对一般人来说看下前两段就可以了

Magic Quotes

代码:
Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed.
What are Magic Quotes

代码:
When on, all ' (single-quote), " (double quote), \ (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.

There are three magic quote directives:
magic_quotes_gpc

代码:
Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP.
magic_quotes_runtime

代码:
If enabled, most functions that return data from an external source, including databases and text files, will have quotes escaped with a backslash. Can be set at runtime, and defaults to off in PHP.
magic_quotes_sybase

代码:
If enabled, a single-quote is escaped with a single-quote instead of a backslash. If on, it completely overrides magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ''. Double quotes, backslashes and NULL's will remain untouched and unescaped.
Why use Magic Quotes

1 Useful for beginners

Magic quotes are implemented in PHP to help code written by beginners from being dangerous. Although SQL Injection is still possible with magic quotes on, the risk is reduced.

2Convenience

For inserting data into a database, magic quotes essentially runs addslashes() on all Get, Post, and Cookie data, and does so automagically.

Why not to use Magic Quotes

1 Portability

代码:
Assuming it to be on, or off, affects portability. Use get_magic_quotes_gpc() to check for this, and code accordingly.
2 Performance

代码:
Because not every piece of escaped data is inserted into a database, there is a performance loss for escaping all this data. Simply calling on the escaping functions (like addslashes()) at runtime is more efficient.

Although php.ini-dist enables these directives by default, php.ini-recommended disables it. This recommendation is mainly due to performance reasons.
3 Inconvenience

代码:
Because not all data needs escaping, it's often annoying to see escaped data where it shouldn't be. For example, emailing from a form, and seeing a bunch of \' within the email. To fix, this may require excessive use of stripslashes().
这些英文实在是需要像我这类人有足够的耐心啊(不是说我有耐心,而是我英语烂),刚才也说了,对于一般人只看下前两段就可以了,特别是我用红色标出来的字!!!

另外,特别注意的是,魔术引用发生作用是在传递$_GET,$_POST,$_COOKIE时

下面是案例

代码:
1.
条件: magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。

数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow''''sun" 写入数据库,

结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

数据库保存格式:无数据。

输出数据格式:无数据。

说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。

代码:
2.
条件: magic_quotes_gpc=off
写入数据库的字符串经过函数addslashes()处理。从数据库读出的字符串未作任何处理。

数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow''''sun" 写入数据库,

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow''''sun (和输入一样)

输出数据格式:snow''''sun (和输入一样)

说明: addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据存入数据库,数据库保存的是snow''''sun 而并不是我们想象的snow\'\'\'\'sun

代码:
3.
条件: magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。

数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow''''sun" 写入数据库,

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow''''sun (和输入一样)

输出数据格式:snow''''sun (和输入一样)

说明: magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据入数据库,数据库保存的是snow''''sun而并不是我们想象的snow\'\'\'\'sun。

代码:
4.
条件: magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据:  $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:"snow''''sun" 写入数据库,

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\'\'\'\'sun (添加了转义字符)

输出数据格式:snow\'\'\'\'sun (添加了转义字符)

说明: magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为\',后者的转换被作为数据写入
数据库,数据库保存的是snow\'\'\'\'sun
总结如下:

1. 对于magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:

magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据

PHP 相关文章推荐
Php注入点构造代码
Jun 14 PHP
PHP 源代码压缩小工具
Dec 22 PHP
php date与gmdate的获取日期的区别
Feb 08 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php数组应用之比较两个时间的相减排序
Aug 18 #PHP
php中的数组操作函数整理
Aug 18 #PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 #PHP
删除数组元素实用的PHP数组函数
Aug 18 #PHP
PHP 数组实例说明
Aug 18 #PHP
PHP获取网站域名和地址的代码
Aug 17 #PHP
php二分法在IP地址查询中的应用
Aug 12 #PHP
You might like
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
Node 代理访问的实现
2019/09/19 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现跨文件全局变量的方法
2014/07/07 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python从子线程中获得返回值的方法
2019/01/30 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python通过http下载文件的方法详解
2019/07/26 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
python中封包建立过程实例
2021/02/18 Python
物理教育专业毕业生推荐信
2013/11/03 职场文书
在职人员函授期间自我评价分享
2013/11/08 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
学校岗位设置方案
2014/01/16 职场文书
详解TypeScript的基础类型
2022/02/18 Javascript