什么是 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);
}
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com