php 安全基础 第一章简介 php功能

一:php功能:
        PHP有许多适合于WEB开发的功能。一些在其它语言中很难实现的普通工作在PHP中变得易如反掌,这有好处也有坏处。有一个功能比其它功能来更引人注目,这个功能就是register_globals。

1.1.1. 全局变量注册

       如果您还能记起早期WEB应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会。当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立。它让PHP编程变得容易和方便,但同时也带来了安全隐患。

       事实上,register_globals是无辜的,它并不会产生漏洞,同时还要开发者犯错才行。可是,有两个主要原因导致了您必须在开发和布署应用时关闭register_globals:

       第一,它会增加安全漏洞的数量;

       第二,隐藏了数据的来源,与开发者需要随时跟踪数据的责任相违背。

       本书中所有例子都假定register_globals已被关闭,用超级公用数组如$_GET 和 $_POST取而代之。使用这些数组几乎与register_globals开启时的编程方法同样方便,而其中的些许不便是值得的,因为它提高了程序的安全性。

小提示

        如果您必须要开发一个在register_globals开启的环境中布署的应用时,很重要的一点是您必须要初始化所有变量并且把error_reporting 设为 E_ALL(或 E_ALL | E_STRICT)以对未初始化变量进行警告。当register_globals开启时,任何使用未初始化变量的行为几乎就意味着安全漏洞。

1.1.2. 错误报告

 

       没有不会犯错的开发者,PHP的错误报告功能将协助您确认和定位这些错误。可以PHP提供的这些详细描述也可能被恶意攻击者看到,这就不妙了。使大众看不到报错信息,这一点很重要。做到这一点很容易,只要关闭display_errors,当然如果您希望得到出错信息,可以打开log_errors选项,并在error_log选项中设置出错日志文件的保存路径。

       由于出错报告的级别设定可以导致有些错误无法发现,您至少需要把error_reporting设为E_ALL(E_ALL | E_STRICT 是最高的设置, 提供向下兼容的建议, 如不建议使用的提示).

       所有的出错报告级别可以在任意级别进行修改,所以您如果使用的是共享的主机,没有权限对php.ini, httpd.conf, 或 .htaccess等配置文件进行更改时,您可以在程序中运行出错报告级别配置语句:

 

CODE:

 

  <?php

 

  ini_set('error_reporting', E_ALL | E_STRICT);

  ini_set('display_errors', 'Off');

  ini_set('log_errors', 'On');

  ini_set('error_log', '/usr/local/apache/logs/error_log');

 

  ?>

 

小提示

http://php.net/manual/ini.php 对php.ini的选项配置作了详尽的说明。

 

       PHP还允许您通过 set_error_handler( ) 函数指定您自已的出错处理函数:

 

CODE:

 

 <?php

 

  set_error_handler('my_error_handler');

 

  ?>

 

       上面程序指定了您自已的出错处理函数my_error_handler( ); 下面是一个实际使用的示例:

 

CODE:

 

  <?php

 

  function my_error_handler($number, $string, $file, $line, $context)

  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

 

    error_log($error, 3, '/usr/local/apache/logs/error_log');

  }

 

  ?>

 

小提示

       PHP 5还允许向set_error_handler( )传递第二个参数以限定在什么出错情况下执行出定义的出错处理函数。比如,现在建立一个处理告警级别(warning)错误的函数:

 

CODE:

 

 <?php

  set_error_handler('my_warning_handler', E_WARNING);

  ?>

 

    PHP5还提供了异常处理机制,详见http://php.net/exceptions

 

posted @ 2008-03-31 13:18  曹振华  阅读(501)  评论(0编辑  收藏  举报