多数大学生出来选择的工作和专业无关
首页 > 专业知识

解读php.ini的基本概念和配置方法

时间:2019-01-22 20:58:05 [来源]:郑州PHP培训学校

   解读php.ini的基本概念和配置方法

  php.ini的配置需要涉及到许多参数,比如:register_globals;magic_quotes_gpc;display_errors;safe_mode;open_basedir等等。
  我们在学习PHP语言的时候也许对php.ini的相关知识还是比较陌生。那么今天我们就为新手们详细解读php.ini的基本概念还顶级配置方法,方便我们学习PHP语言。我们首先来了解一些php.ini的基本概念性。空白字符和以分号开始的行被简单地忽略。设置指令的格式如下:directive = value 指令名(directive)是大小写敏感的!所以”foo=bar”不同于”FOO=bar”。值(value)可以是:
  1. 用引号界定的字符串(如:”foo”)
  2. 一个数字(整数或浮点数,如:0,1,34,-1,33.55)3. 一个PHP常量(如:E_ALL,M_PI)
  4. 一个INI常量(On,Off,none)
  5. 一个表达式(如:E_ALL & ~E_NOTICE)
  还有另外一个是设置布尔值,1为On就是开启,0为Off就是关闭。php.ini分了很多部分,例如:模块部分,PHP全局配置,数据库配置,等等。了解了基本的概念以后我们就可以开始变态配置之旅。
  第一个重要的参数是register_globals. 这个配置影响到PHP如何接收传递过来的参数,说白了register_globals的意思就是注册为全局变量,所以当该参数为值On的时候,传递过来 的值会被直接的注册为全局变量直接使用,而当该参数值为Off的时候,我们需要到从特定的数组里去得到它。从www.milw0rm.com很多的PHP漏洞来看一大部分是因为Register_Globals为On的时候被利用的,所以强烈推荐将这个参数修改成Off,PHP目前的最高版中此参数都是默 认是Off的,没啥说的了,如果你用的版本比较老的话一定要修改这里。
  第二个重要的参数是magic_quotes_gpc。如果你把magic_quotes_gpc设置成了Off,那么PHP就不会对4种字符 ‘ (单引号), ” (双引号), (反斜线) 和 空字符进行转义,那这样的话就会造成服务器可能会被非法注入的可能。但是如果你把Magic_quotes_gpc设置成On的话,PHP就会 给$_POST,$_GET,$_COOKIE提交的变量中如果有上面四种字符的话就会加上反斜扛.这样就会大大地提高PHP的安全性。强烈推荐将 Magic_quotes_gpc设置为On。
  第三个比较重要的是display_errors。为什么说这个参数重要呢,因为没有不会犯错误的开发者,PHP的 display_errors参数就是帮助开发者定位和确定这些错误的。可是如果PHP提供的这些信息被黑客了解到的话,这就不妙了。比如某国库的网站,因为对display_errors没有进行设置,导致web目录泄露。这对于黑客来说可是非常重要的信息,因为很多时候的渗透都需要知道web 目录,例如webshell的写入等等。所以我们强烈推荐大家把这个参数设置成Off。
  第四个重要的参数就是safe_mode,就是我们常说的安全模式。PHP的安全模式是个非常重要的内嵌的安全机制,能够控制一些PHP中的函 数,比如system()等函数,同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的访问,比如/etc/passwd,但是默认的 php.ini是没有打开安全模式的,我们把它打开。safe_mode = on。
  第五个参数是open_basedir,使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问 不应该访问的文件,一定程度上限制了webshell的危害,我们一般可以设置为只能访问网站目录(假设网站目录为 E:test):open_basedir = E:test 第六个参数是disable_functions,使用disable_functions可以限制一些对于系统来说威胁很大的函数。
  例如,我们在第一部分中看到的有PHPinfo()函数的网页中可以看到关于PHP的环境变量等。还有可以利用system,exec等函数来 执行系统命令等等。这里我们推荐过滤的函数如下。disable_functions = PHPinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server。 大家如果对某个函数不了解的话,可以google搜索得到函数的作用,然后来决定您自己的服务器是否禁止掉。
  第七个参数是Com组件。Windows平台下的PHP脚本平台存在一个安全漏洞,使得PHP设置即使在安全模式下(safe_mode),仍 旧允许攻击者使用COM()函数来创建系统组件来执行任意命令。漏洞出现的原因是由于在安全模式下的PHP平台虽然system();pathru()函 数被禁止,但是com.allow_dcom的设置依旧是为true。以至于攻击者可以使用COM()函数创建系统组件对象来运行系统命令。
  如果是默认的Apache设置或者Web服务器以Loacalsystem权限或Administrators权限运行,攻击者可以使用这个漏 洞来提升权限。所以我们必须要关闭掉com.allow_dcom这个参数默认是True,我们需要吧这个参数修改成 com.allow_dcom=false。第八个参数是expose_PHP。这个参数决定是否暴露 PHP 被安装在服务器上。如果这个参数设置为On的话就会把PHP的版本等泄露出来了。我们的推荐值是Off。
  基本上的参数我们就介绍完了,当然php.ini还需要配置,大部分设置跟安全是没有关系的,很大一部分都跟PHP运行的效果(例如优化)等有 关系,如果大家有兴趣的话可以自己参考一下PHP的官方手册来具体了解一下。注意:修改完php.ini以后,必须重新启动IIS,不然你设置的内容不会 即时生效。
  PHP文件系统相关函数的功能详解
  PHP文件系统相关函数可以帮助我们实现目录内容的显示,移动文件等,很多人都开始用这些函数开发基于互联网的文件资源管理器。
  我们通过对PHP的学习,知道其中很多函数都有很重要的作用,其中就有与文件系统有关的函数。我们今天就为大家介绍PHP文件系统相关函数的具体功能体现,以了解PHP与文件系统之间的联系。这些函数不仅可以打开文件,还可以显示目录中的内容、移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器。
  关于文件路径的解释:在Windows中,可以在路径中使用/和符号,而在其他的操作系统中只能使用/符号。出于一致性的缘故,我们统一使用/符号。
  下面的PHP文件系统相关函数脚本样例可以显示一个目录清单,注释已经包含在代码中:
  <? /*把要读取的目录的全路径名存入一个名字为$dir_name的变量中。 */$dir_name = "/home/me/";
  /* 创建一个句柄,其值是打开一个给定目录的结果*/$dir = opendir($dir_name);
  /* 建立一个文字块,用以放置列表元素(文件名字)*/$file_list = "<ul>";
  /* 使用一个while语句,读取已经打开的目录中的所有元素,如果文件的名字不是“.”或“..”,则显示列表中的名字*/while ($file_name = readdir($dir)) {
  if (($file_name != ".") && ($file_name != "..")) {$file_list .= "<li>$file_name";
  }
  }
  $file_list .= "</ul>";
  /*关闭打开的目录,结束PHP模块*/
  closedir($dir);
  ?>
  <!-- Start your HTML -->
  <HTML>
  <HEAD>
  <TITLE>Directory Listing</TITLE>
  </HEAD>
  <BODY>
  <!-- Use PHP to print the name of the directory you read -->
  <P>Files in: <? echo "$dir_name"; ?></p>
  <!-- Use PHP to print the directory listing -->
  <? echo "$file_list"; ?>
  </BODY>
  </HTML>
  好了,我们已经得到了一个目录清单。需要注意的是,要读取一个文件(稍后我们将进行讲解)或目录的内容,PHP运行的系统上的用户必须至少有读取文件的权限。
  下面是一个如何拷贝文件的PHP文件系统相关函数例子:
  <? /*把你要拷贝的原文件的全路径赋给一个名字为$original的变量中,把拷贝的文件的全路径赋予一个名字为$copied的变量中*/$original = "/home/me/mydatabasedump";
  $copied = "/archive/mydatabasedumo_1010";/* 使用copy()函数拷贝原始文件,如果拷贝没有完成则会显示一个错误信息*/@copy($original, $copied) or die("Couldn't copy file.");?>
  这个PHP文件系统相关函数的例子是一个文件备份系统的原型。在这段脚本运行时,它把文件拷贝到一个不同的位置进行保存。稍微修改一下守护程序,就可以在一天中你指定的时刻执行它,而无需用户的干预。
  假定你在系统上安装了Lynx,可以创建一个守护程序的条目访问这个文件,访问这个文件会运行这个脚本并建立一个拷贝文件,下面的例子将在上午5点钟运行这个脚本,然后关闭Lynx:
  0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1如果运行的是CGI版本的PHP,可以跳过Lynx部分,而直接调用二进制文件:
  0 5 * * * [username] php /path/to/copyfile.php 1>/dev/null 2>&1PHP函数include()的重要性分析
  PHP函数include()会首先对PHP引擎中的编译代码进行计算,它更多的是用于动态元素中,我们经常会在文件中使用PHP函数include()来控制许多的函数。
  在我们开发一个网站的时候,必须要考虑到代码重用的问题, 不管你的网站规模的大小,也不管你维护和更新的次数,这一问题都是非常麻烦的。我们今天就向大家介绍这方面的解决办法,那就是PHP函数include()的具体应用。
  在PHP中,至少有几个函数可以帮助你实现代码重用的目的,所使用的函数取决于你所重用的代码,主要的函数有:
  * include() and include_once()
  * require() and require_once()
  PHP函数include()包含并对给定的文件进行计算,例如:
  include('/home/me/myfile');
  在include文件中的任何代码都在PHP函数include()出现的代码范围内执行,你可以通过联合使用include()和fopen()在自己的服务器上包含静态文件,在另一台服务器上包含目标文件。
  include_once()的功能与include()相同,二者之间的区别在于它会检查一个文件中的代码是否已经包含在现有的脚本中,如果代码已经存在,则不会再次包含它。
  require()函数用给定文件的内容取代它本身,这一代替过程发生在PHP引擎编译代码期间,而不是在执行期间进行,它不象PHP函数include()那样会首先进行计算。require()函数更多地用在静态元素中,而include()更多地用于动态元素中。与include_once()类似的是,require_once()将首先检查是否已经插入给定的代码,如果代码已经存在,就不再插入了。
  为也了解其内容,在版权信息、静态文字和其他不包含变量的元素或者依赖其他正在执行的脚本的元素中我更趋向于使用require函数。例如:
  <HTML>
  <HEAD><TITLE>Something</TITLE></HEAD>
  <BODY>
  [a lot of content]
  <?
  // insert copyright
  require('/home/me/mycopyright');
  ?>
  </BODY>
  </HTML>
  另一方面,我经常在文件的开始使用PHP函数include()来控制许多的函数:
  <?
  //得到函数库
  include('/home/me/myfunctions');
  // do PHP things with my functions ?>
  <HTML>
  <HEAD><TITLE>Something</TITLE></HEAD>
  <BODY>
  [a lot of content]
  </BODY>
  </HTML>
  下一个问题就该是“include和require文件在哪里?”,对这个问题简单的回答是,“系统中的任意地方。”如果你的代码中包含有带有用户名和口令的数据库连接,你肯定不会将它们都放在文档根目录中向所有的人都开放。
  included或required文件可以在系统上的任何地方,只要PHP运行的系统上的用户可以访问这些文件即可,你可以使这些文件具有任何后缀,或者不使用后缀。
  使用PHP函数include()和require()对在网站中的元素进行具体化是一种普遍的现象,并在需要对网站升级时,给你带来很大的方便。
 

上一篇:PHP将URL转换成短网址的算法分享

下一篇:详解PHP页面乱码的具体解决办法