编写不受魔术引号影响的php应用

原创作品author流水孟春,转载请注明出处lib.cublog.cn

阅读前提:你必须看过php手册上的"第IV部分安全"的"第10章魔术引号"。如果没看过,也没问题,现在马上花10分钟先看一下php手册上的这东西。

魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程

你可能想让你的程序兼容多个数据库,但你使用的不同的数据库可能使用不同的转义符,而我们的程序又有可能运行在不同的php.ini配置的主机上,关于magic_quotes的配置又可能不一样,所以编写不受魔术引号影响的php应用是高兼容性的php应用所必须的。

php.ini中有三个魔术引号配置选项:

  魔术引号配置选项   描述  运行时改变 在 PHP中的默认值为 
  magic_quotes_gpc 如果打开的话,影响到 HTTP 请求数据(GET,POST 和 COOKIE)。  不能  On
 magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。(前提是magic_quotes_gpc = On)  能  Off
 magic_quotes_sybase
当关闭时,所有的 ‘(单引号),"(双引号),/(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。
    如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ‘‘。而双引号、反斜线 和 NULL 字符将不会进行转义。 
(前提是magic_quotes_gpc = On)

 能  Off

    但是要处理外部传来的全局变量就比较麻烦了。

要 处理外部超级变量,我们要看magic_quotes_gpc是否已经打开(如果magic_quotes_gpc没打开,而 magic_quotes_sybase打开,magic_quotes_sybase也不起作用),还要看magic_quotes_sybase是否 打开,再看我们的程序需要对外部变量用addslashes转义方式还是使用magic_quotes_sybase式的转义方式。下面的代码是一个具体 的实现。

    有人可能说,当magic_quotes_gpc设成On,而magic_quotes_sybase设成Off,那么直接用 ini_set(‘magic_quotes_sybase‘, 1);就能让系统用‘来对addslashes式的转义进行覆盖。这样是不行的。你用ini_get(‘magic_quotes_sybase‘)输出 看下配置,magic_quotes_sybase的确被改变了,但是你的代码就是不能用‘转义符覆盖addslashes式的自动转义。这是因为系统获 取外部变量的时候,是在你的ini_set(‘magic_quotes_sybase‘, 1);之前完成的。

<?php
/**
 * 解决不受magic_quotes影响的php应用
 *
 * 使用这个处理办法需要配置是否使用magic_quotes_sybase, 以适应不同的DBMS
 *
 * 设置方法:
 * $useQuotesSybase[数据库名] = 1;
 * 如:使用sqlite,则定义并初始化 $useQuotesSybase[‘sqlite‘] = 1;
 * 如果使用mysql,可以定义并初始化 $useQuotesSybase[‘sqlite‘] = 0; 也可以不定义
 *
 * CONFIG_DB_DBMS 为所用的DBMS的常量, 在别处定义。比如 define(‘CONFIG_DB_DBMS‘, ‘mysql‘);
 *
 * @author 流水孟春 cmpan(at)qq.com
 * @link http://lib.cublog.cn
 * $date 2007.11.18
 */
error_reporting(E_ALL);
set_magic_quotes_runtime(0);
define(‘CONFIG_DB_DBMS‘, ‘sqlite‘); // 测试用

// 使用 ‘ 做转义符的数据库
$useQuotesSybase = array();
$useQuotesSybase[‘sqlite‘] = 1;
$useQuotesSybase[‘sybase‘] = 1;

if(!empty($_POST)) $_POST = array_map(‘quotesOuterVars‘, $_POST);
if(!empty($_GET)) $_GET = array_map(‘quotesOuterVars‘, $_GET);
$_COOKIE = array_map(‘quotesOuterVars‘, $_COOKIE);
$_REQUEST = array_map(‘quotesOuterVars‘, $_REQUEST);

function quotesOuterVars($var) {
    if (is_array($var)) {
        return array_map(‘quotesOuterVars‘,$var);
    } else {
        if (get_magic_quotes_gpc()) {
            if (isset($GLOBALS[‘useQuotesSybase‘][CONFIG_DB_DBMS]) && $GLOBALS[‘useQuotesSybase‘][CONFIG_DB_DBMS]) {
                // 当前需要以 ‘ 为转义符
                // 如果 magic_quotes_sybase = Off, 系统将把外部变量 addslashes, 我们得先 stripslashes
                // 否则系统自动把 ‘ 换成 ‘‘,
                if (!ini_get(‘magic_quotes_sybase‘)) {
                    $var = stripslashes($var);
                    $var = str_replace("‘", "‘‘", $var);
                }
            } else {
                // 当前需要以 / 为转义符
                // 如果 magic_quotes_sybase = On, 我们先把 ‘‘ 替换成 ‘, 然后在 addslashes
                // 否则系统自动quotes
                if (ini_get(‘magic_quotes_sybase‘)) {
                    $var = str_replace("‘", "‘‘", $var);
                    $var = addslashes($var);
                }
            }
        } else{
            if (isset($GLOBALS[‘useQuotesSybase‘][CONFIG_DB_DBMS]) && $GLOBALS[‘useQuotesSybase‘][CONFIG_DB_DBMS]) {
                $var = str_replace("‘", "‘‘", $var);
            } else {
                $var = addslashes($var);
            }
        }

        return trim($var);
    }
}


    从上面的表我们可以看出,对于magic_quotes_runtime,我在程序中用 ini_set(‘magic_quotes_runtime‘, 0);就可以把它关掉,然后可以用自己的方法来处理来自数据库或文件的数据。

时间: 2024-10-18 09:43:30

编写不受魔术引号影响的php应用的相关文章

PHP 魔术引号

1.魔术引号的作用是什么? ? 魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号.双引号.反斜线.NULL加上一个一个反斜线进行转义,这个的作用跟addslashes()的作用完全相同. 2.转义的作用? ? 正确地接收和读取数据,从而正确地执行SQL语句.比如从前台接收一个参数,假定为$para,后台接收到参数后要执行一条查询的SQL语句,拼接sql语句时,把参数传进入,类似于 "SELECT * FROMTABLEWHEREFIELD1= $para ANDF

TIOBE 2014年11月编程语言排行榜:R受大数据影响跃至12位

TIOBE发布了11月份编程语言排行榜,前三甲依然为C.Java.Objective-C.受大数据影响,本月R语言上升至12位,上个月排名第15位,看其走势下个月有望进前十. 得益于大数据炒作,还有些语言包括Julia (#126), LabView (#63),Mathematica (#80), MATLAB (#24),S (#84),SAS (#21),SPSS (#104) 以及 Stata (#110)份额均有所上升. 编程语言排行榜TOP 20榜单: 前10名编程语言长期走势图: 

过狗菜刀原理以及绕过魔术引号的配置

本文作者:i春秋签约作家--凉风 首先感谢@我是salf给我的灵感 我之前发了一个帖子:过了D盾扫描的一句话木马. 里面分析了一句话木马的原理,以及过狗.D盾的木马的编写. 传送门: https://bbs.ichunqiu.com/thread-25644-1-1.html tips:下文需要知道一句话木马的原理,可看上面说的帖子 tips2:还是在这里简单的说一下吧,例如木马 assert($_POST[XYZ]),会把用户post的 XYZ=asdfasdf中的asdfasdf作为php代

php之魔术引号

什么是魔术引号?当sql句中含有单引号,双引号,反斜杠和NUL时,这时候如果不对这些符号进行转义,写入数据库时就会出错,而魔术引号magic_quotes_gpc()就是对这些符号进行转义以便能把数据正确写入数据库. get_magic_quotes_gpc()获取当前magic_quotes_gpc配置选项设置,如果magic_quotes_gpc处于on,则返回1,magic_quotes_gpc处于off,则返回0,在PHP5.4.0起将始终返回false. magic_quotes_gp

受台风“威马逊”影响 广西沿海将迎来大暴雨

气象部门预计,今年第9号台风“威马逊”最大可能7月18日凌晨到中午在海南登陆,随后进入北部湾海面,中心附近最大风力有12级.从17日晚起,桂南和北部湾将开始受到台风影响,18-20日,我区将出现一次较强风雨天气过程. 广西气象台总工程师林开平分析认为,查阅历史资料,可以发现1982年第17号台风的路径跟“威马逊”预报的路径十分吻合,当年这个台风带来的降水十分可观,广西南部和网络pos机西部的降水都在暴雨以上,特别是沿海一带降雨均达到特大暴雨量级.具体预报如下: 17日晚到19日,玉林.贵港.北海

受Note 7影响 三星在声誉排名中已从第三跌至第四十九

The Verge 中文站 2 月 20 日报道 去年,由于 Note 7 燃损事故,三星在美国消费者心目中的声誉受到了巨大打击.著名的哈里斯民意调查最新数据显示,三星在民众心中的声誉排名已经跌至第 49 名,而在上次的评比中,三星排名比苹果和谷歌都高,列在榜单第三位. 在本次民调中,亚马逊再次夺魁,紧随其后的是 Wegmans 和 Publix 两个超市品牌.其他科技公司中,进入前十的还有苹果.谷歌和特斯拉.此外,Netflix 和微软分别排名第 18 和第 20,Facebook 则排在第

计算机基础课程对编写代码有多大影响

相信很多计算机专业刚步入社会开始编程工作的同学都有一个疑惑,大学四年学的计算机基础课程对编程来说几乎用不上,远远没有C/C++.Java.Java Web.sql有用.我当时也有这样的疑惑,因为大部分程序员刚开始工作的任务仅仅只是在别人搭好的框架下,在合适的地方添加上合适的代码,实现某个功能.在这个阶段有这样的疑惑是可以理解的,因为只是在山脚下看问题,不知庐山真面目.在这个阶段有些有心的同学可能会在编码过程中考虑下性能(方法级别的性能),合理使用集合类,合理采用一些算法,减少循环次数和时间复杂度

“妖股”唯品会股价跌破200美元 将受阿里IPO影响

腾讯科技 雷建平 8月30日报道 曾一路股价高涨的电商网站唯品会 近日频频遭遇颓势,股价一路下跌,自发布第二季度财报以来,股价从最高229美元跌到如今的196.63美元. 唯品会昨日开盘股价210.55美元,最高211.60美元,最低193.68美元,最终唯品会股价下跌12.33美元,跌幅达到5.9%,这是唯品会股价攀升到200美元以来首次跌破这一价格. 今年8月14日,唯品会发布2014年第二季度财报.财报显示,唯品会第二季度净营收8.294亿美元,较上年同期增136.1%:归属于唯品会净利润

Excel催化剂开源第44波-窗体在Show模式下受Excel操作影响变为最小化解决方式

在Excel催化剂的许多功能中,都会开发窗体用于给用户更友好的交互使用,但有一个问题,困扰许久,在窗体上运行某些代码后,中途弹出下MessageBox对话框给用户做一些简单的提示或交互时,发现程序运行结束后,窗体本来是显示在前端最顶层的,却变为最小化在任务栏中. 这个问题带来非常不好的用户体验,弄到最后,都不太敢向用户发出MessageBox对话框之类的提示,或者干脆使用ShowDialog的模式显示,总之非常不爽. 最近,尝试着一个简单的处理,程序结束后,通过先Hide隐藏窗体,再重新Show