关于php的register_globals和magic_quotes_gpc参数配置

来源:互联网 发布:linux更改文件权限例子 编辑:程序博客网 时间:2024/05/17 05:57

在与php相关的争议中,过去争议最大的莫过于register_globals的设置。当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML 表单的请求变量。这就容易引发一些安全层面的问题,比如下面的一个例子:

<?phpif(authenticated_user()){    $authorized = true;}if($authorized){    require "some files";}

当register_globals开启时,用户完全可以通过url传参的方式(example.php?authorized=1),获得本该进过认证之后的用户才有的权限。
笔者之前一直知道有这么一回事,但是一直没把这个问题当回事,这次既然再一次看到了,就把它记录下来。不过该选项配置自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除,目前市面上的php版本大多已经升级到5.4以上,个人觉得这不会是一个什么大问题。

与register_globals类似,还有一个关于magic_quotes_gpc的配置选项,主要涉及如下三个选项配置:

  • magic_quotes_gpc
    当 magic_quotes 为 on,所有的 ’ (单引号)、” (双引号)、\(反斜杠)和 NUL’s 被一个反斜杠自动转义。magic_quotes_gpc的设定值将会影响通过GET、POST 和 COOKIE获得的数据。
  • magic_quotes_sybase
    如果指令 magic_quotes_sybase 为 ON,它会完全覆盖 magic_quotes_gpc。 所以即使 get_magic_quotes_gpc() 返回 TRUE,双引号、反斜杠或 NUL 都不会被转义。 只有单引号会被转义。 这种情况下它们看上去像:”
  • magic_quotes_runtime
    如果启用了 magic_quotes_runtime,大多数返回任何形式外部数据的函数,包括数据库和文本段将会用反斜线转义引号。 如果启用了 magic_quotes_sybase,单引号会被单引号转义而不是反斜线。magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据。
    同样magic_quotes_gpc的配置项已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
    之前一直不明白为什么这个配置会被移除,因为在笔者看来,这个配置可以提高代码的安全性,不过其实关于这一点php的官方文档中其实早就给出了答案:
  • 可移植性
    编程时认为其打开或并闭都会影响到移植性。可以用 get_magic_quotes_gpc() 来检查是否打开,并据此编程。
  • 性能
    由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。在运行时调用转义函数(如 addslashes())更有效率。 尽管 php.ini-dist 默认打开了这个选项,但是 php.ini-recommended 默认却关闭了它,主要是出于性能的考虑。
  • 不便
    由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \’。针对这个问题,可以使用 stripslashes() 函数处理。
0 0