PHP中 Magic quotes

 

什么是 Magic Quotes?

Magic Quotes 就是把用户输入的敏感字符自动进行转义的一个操作选项,它会根据需要对敏感字符进行转义。当 Magic Quotes 打开的时候,所有的'(单引号),"(双引号),\(反斜杠)和NULL字符都会被添加反斜杠进行转义,这样产生效果就相当于使用addslashes()函数。

 

一共有三个 magic quote 选项:

 

magic_quotes_gpc:作用于 HTTP 请求所发送的数据(GET, POST, COOKIE),运行时不能被改变,在 PHP 中默认值为on。 PHP函数 get_magic_quotes_gpc() 可以用来查看 magic_quotes_gpc 配置。返回1,则magic_quotes_gpc=on;返回0, magic_quotes_gpc=off。 magic_quotes_gpc 默认设置为on,这样PHP引擎自动的转义Get Post Cookie数据中的敏感字符,等价于手工调用addslashes()。主要是为了方便PHP初学者,以应对日益严重的sql注入攻击。但是设置为on 有性能上的缺点,另外有些情况下,我们不需要对特殊字符转义,设置为on反而是帮了倒忙。综合利弊,在实际应用中,应该设置 magic_quotes_gpc 为on。

 

magic_quotes_runtime:如果打开的话,大部份内部函数,包括数据库和文本文件,所返回的数据都会被反斜杠进行转义。该选项能在运行的时候被改变,在 PHP 中的默认值为off。 PHP函数set_magic_quotes_runtime(int new_setting),get_magic_quotes_runtime() 分别用来设置和获取magic_quotes_runtime选项值。 magic_quotes_runtime 应该在 php.ini 设置为off,在特殊情况下,可以手工调用set_magic_quotes_runtime(1) 打开选项。

 

magic_quotes_sysbase:如果打开的话,将会使用单引号对单引号进行转义而非反斜框。这时magic_quotes_gpc将会被忽略。换而言之,如果同时打开两个选项的话,单引号将会被转义成''。 而双引号、反斜杠、 NULL 字符将不会进行转义。 magic_qutoes_sysbase 应该在 php.ini 设置为off。

 

 

 

为什么使用 Magic quotes

 

方便快捷

PHP 的设计者在设计之初的构想就是能够快速方便的编程。例如插入数据库时,Magic quotes 会自动将数据转义,这很方便。

 

对初学者有利

Magic quotes 可以从一定程度上,让初学者带离脚本的安全风险。例如在没有任何保护措施的代码下,开启了 Magic quotes 后会少很多的风险,例如注入问题。当然,单一使用此方法,并不能完全阻止此类安全问题。

“我没有权限去关闭”

很显然你已经可能意识到了这个问题,但是主机空间并非完全由自己控制。

为什么不使用 Magic quotes

 

可移植性

无论此功能是否开启,它都会影响脚本的可移植性,因为它影响我们后续过滤数据的操作。

 

性能问题

在获取所有的外部数据之前都会被转义,这无疑会增加运行时的花销(而且并不是所有的数据都需要转义)。

 

造成困惑

 

正如上述所言,并非所有的数据都需要被转义。有可能出现的一种情况,就是当你为了获取未被转义的数据,而“疯狂的”使用 stripslashes 函数。

 

PHP6 已经不支持

PHP 的设计者显然已经意识到了自己的“错误”,所以在 PHP6 中已经将其废弃。

如何禁用 Magic quotes

按照本人观点,使用 php.ini 配置文件全局禁用 Magic quotes 是最靠谱的。参考下面的代码

 

 

; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off

然而线上的主机可能无法让你修改 php.ini 文件,那么可以使用 .htaccess 文件禁用,加入下面的代码

php_flag magic_quotes_gpc Off

上述可移植的代码而言,无论是否禁用 magic_quotes,数据必须保持一致。那么下面的代码可以帮助您

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value) {
        $value = is_array($value) ?
            array_map('stripslashes_deep', $value) :
            stripslashes($value);
        return $value;
    }

    $_GET     = array_map('stripslashes_deep', $_GET);
    $_POST    = array_map('stripslashes_deep', $_POST);
    $_COOKIE  = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值