搜索
首页后端开发php教程编写不受魔术引号影响的php应用

阅读前提:你必须看过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);之前完成的。

 

/**
 * 解决不受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);就可以把它关掉,然后可以用自己的方法来处理来自数据库或文件的数据。


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP电子邮件:分步发送指南PHP电子邮件:分步发送指南May 09, 2025 am 12:14 AM

phpisusedforsendendemailsduetoitsignegrationwithservermailservicesand andexternalsmtpproviders,自动化notifications andMarketingCampaigns.1)设置设置yourphpenvironcormentswironmentswithaweberswithawebserverserverserverandphp,确保themailfunctionisenabled.2)useabasicscruct

如何通过PHP发送电子邮件:示例和代码如何通过PHP发送电子邮件:示例和代码May 09, 2025 am 12:13 AM

发送电子邮件的最佳方法是使用PHPMailer库。1)使用mail()函数简单但不可靠,可能导致邮件进入垃圾邮件或无法送达。2)PHPMailer提供更好的控制和可靠性,支持HTML邮件、附件和SMTP认证。3)确保正确配置SMTP设置并使用加密(如STARTTLS或SSL/TLS)以增强安全性。4)对于大量邮件,考虑使用邮件队列系统来优化性能。

高级PHP电子邮件:自定义标题和功能高级PHP电子邮件:自定义标题和功能May 09, 2025 am 12:13 AM

CustomHeadersheadersandAdvancedFeaturesInphpeMailenHanceFunctionalityAndreliability.1)CustomHeadersheadersheadersaddmetadatatatatataatafortrackingandCategorization.2)htmlemailsallowformattingandttinganditive.3)attachmentscanmentscanmentscanbesmentscanbestmentscanbesentscanbesentingslibrarieslibrarieslibrariesliblarikelikephpmailer.4)smtppapapairatienticationaltication enterticationallimpr

使用PHP和SMTP发送电子邮件的指南使用PHP和SMTP发送电子邮件的指南May 09, 2025 am 12:06 AM

使用PHP和SMTP发送邮件可以通过PHPMailer库实现。1)安装并配置PHPMailer,2)设置SMTP服务器细节,3)定义邮件内容,4)发送邮件并处理错误。使用此方法可以确保邮件的可靠性和安全性。

使用PHP发送电子邮件的最佳方法是什么?使用PHP发送电子邮件的最佳方法是什么?May 08, 2025 am 12:21 AM

ThebestapproachforsendingemailsinPHPisusingthePHPMailerlibraryduetoitsreliability,featurerichness,andeaseofuse.PHPMailersupportsSMTP,providesdetailederrorhandling,allowssendingHTMLandplaintextemails,supportsattachments,andenhancessecurity.Foroptimalu

PHP中依赖注入的最佳实践PHP中依赖注入的最佳实践May 08, 2025 am 12:21 AM

使用依赖注入(DI)的原因是它促进了代码的松耦合、可测试性和可维护性。1)使用构造函数注入依赖,2)避免使用服务定位器,3)利用依赖注入容器管理依赖,4)通过注入依赖提高测试性,5)避免过度注入依赖,6)考虑DI对性能的影响。

PHP性能调整技巧和技巧PHP性能调整技巧和技巧May 08, 2025 am 12:20 AM

phperformancetuningiscialbecapeitenhancesspeedandeffice,whatevitalforwebapplications.1)cachingwithapcureduccureducesdatabaseloadprovesrovesponsemetimes.2)优化

PHP电子邮件安全性:发送电子邮件的最佳实践PHP电子邮件安全性:发送电子邮件的最佳实践May 08, 2025 am 12:16 AM

ThebestpracticesforsendingemailssecurelyinPHPinclude:1)UsingsecureconfigurationswithSMTPandSTARTTLSencryption,2)Validatingandsanitizinginputstopreventinjectionattacks,3)EncryptingsensitivedatawithinemailsusingOpenSSL,4)Properlyhandlingemailheaderstoa

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具