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);
}
页:
[1]