说一说魔术引号(Magic Quote)

学习笔记 马富天 2016-07-21 15:03:44 82 0

【摘要】魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。而我们最好在编码时不要转义而在运行时根据需要而转义。

注意:本特性(魔术引号)已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。

当打开时,所有的 '(单引号),"(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。

当magic_quotes_gpc = On时,系统会自动处理单引号等问题,用不用addslashes()和stripslashes()都没关系,但是如果添加数据时用了addslashes(),那么显示数据时必须要stripslashes()。

当magic_quotes_gpc = Off时,系统不会处理单引号等问题,所以插入数据时必须要使用addslashes(),显示数据时则不需要使用stripslashes()。

一共有三个魔术引号指令:

magic_quotes_gpc 影响到 HTTP 请求数据(GET,POST 和 COOKIE)。不能在运行时改变。在 PHP 中默认值为 on。 参见 get_magic_quotes_gpc()。

magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off。 参见 set_magic_quotes_runtime() 和 get_magic_quotes_runtime()。

magic_quotes_sybase 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ''。而双引号、反斜线 和 NULL 字符将不会进行转义。 如何取得其值参见 ini_get()。

为什么要用魔术引号?

没有理由再使用魔术引号,因为它不再是 PHP 支持的一部分。 不过它帮助了新手在不知不觉中写出了更好(更安全)的代码。 但是在处理代码的时候,最好是更改你的代码而不是依赖于魔术引号的开启。 为什么这个功能存在?是为了阻止SQL 注入。 在今天,开发者能够更好得意识到了安全问题,并最终使用数据库转移机制或者 prepared 语句来取代魔术引号功能。

为什么不用魔术引号?

可移植性 编程时认为其打开或并闭都会影响到移植性。可以用 get_magic_quotes_gpc() 来检查是否打开,并据此编程。

性能由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。

在运行时调用转义函数(如 addslashes())更有效率。 尽管 php.ini-dist 默认打开了这个选项,但是 php.ini-recommended 默认却关闭了它,主要是出于性能的考虑。

不便由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。针对这个问题,可以使用 stripslashes() 函数处理。

关闭魔术引号

下面是一个通过 php.ini 文件把这些选项设为 Off 的范例。(记住了PHP5.4.0以上已经移除了,所以PHP5.4.0以上的版本的php.ini是没有下面内容的)

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

如果不能修改服务器端的配置文件,使用 .htaccess 也可以。范例如下:

  1. php_flag magic_quotes_gpc Off

为了能写出移植性较强的代码(可以运行于任何环境),例如不能修改服务器配置的情况,下面的例子可以在运行时关闭 magic_quotes_gpc。但是这样做比较低效,适当的修改配置才是更好的办法。

  1. if (get_magic_quotes_gpc()) {
  2.     function stripslashes_deep($value)
  3.     {
  4.         $value = is_array($value) ?
  5.                     array_map('stripslashes_deep', $value) :
  6.                     stripslashes($value);
  7.         return $value;
  8.     }
  9.     $_POST = array_map('stripslashes_deep', $_POST);
  10.     $_GET = array_map('stripslashes_deep', $_GET);
  11.     $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
  12.     $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
  13. }

版权归 马富天PHP博客 所有

本文标题:《说一说魔术引号(Magic Quote)》

本文链接地址:http://www.mafutian.net/166.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

0

0

上一篇《 Hadoop入门经典运行wordcount 》 下一篇《 ThinkPHP3.2中出现重复反斜线转义以及解决方法 》
分享到:

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码