PHP安全模式

转载 2012年03月26日 16:22:08

PHP勿庸置疑是非常强大的服务器端脚本语言,但是强大的功能总是伴随着重大的危险,在这章里,你将学习到使用PHP的安全模式来阻止一些PHP潜在的危险因素。

  【 安全模式 】

  PHP的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的PHP开放的Web服务器上。当一个Web服务器上运行的PHP打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。

  [ 使用安全模式来强制限制 ]

  在安全模式下,一些尝试访问文件系统的函数功能将被限制。运行Web服务器用户ID,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权限,实现这个限制功能对于PHP来说是没有问题的。

  在 安全模式开启的时候,尝试读取或者写入一个本地文件的时候,PHP将检查当前访问用户是否是该目标文件的所有者。如果不是所有者,则该操作会被禁止。(写 
入权限:在较低级别的文件访问权限下,可能会允许读取或者写入系统操作系统的文件,通过PHP的安全模式实现了防止你操作另外一个用户文件的操作。当然, 
一个Web服务器可能能够访问一个具有全局写入权限的任意文件。)

  当安全模式打开的时候,以下函数列表的功能将会受到限制:

  chdir , move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, 
rename, fopen, require, highlight_file, show_source, include, symlink, link, 
touch, mkdir, unlink

  同样的,一些PHP扩展中的函数也将会受到影响。(加载模块:在安全模式下dl函数将被禁止,如果要加载扩展的话,只能修改php.ini中的扩展选项,在PHP启动的时候加载)

  在PHP安全模式打开的时候,需要执行操作系统程序的时候,必须是在safe_mode_exec_dir选项指定目录的程序,否则执行将失败。即使允许执行,那么也会自动的传递给escapeshellcmd函数进行过滤。

  以下执行命令的函数列表将会受到影响:

  exec, shell_exec, passthru, system, popen

  另外,背部标记操作符(`)也将被关闭。

  当运行在安全模式下,虽然不会引起错误,但是 putenv 函数将无效。同样的,其他一些尝试改变PHP环境变量的函数set_time_limit, 
set_include_path 也将被忽略。

  [ 打开安全模式 ]

  打开或者关闭PHP的安全模式是利用php.ini中的safe_mode选项。如果要激活安全模式给当前所有共享Web服务器的用户,只要设置配置选项为:safe_mode 
= On当函数在访问文件系统的时候将进行文件所有者的检查。缺省情况下,会检查该文件所有者的用户ID,当你能够修改文件所有者的组ID(GID)为 
safe_mode_gid 选项所指定的。如 果你有一个共享库文件在你的系统上,当你碰到需要include或require的时候,那么你可以使用 
safe_mode_include_dir 选项来设置你的路径,保证你的代码正常工作。(包含路径: 如果你想要使用 safe_mode_include_dir 
选项包含更多的包含路径,那么你可以象 include_path 
选项一样,在Unix/Linux系统下使用冒号进行分割,在Windows下使用分号进行分割)比如你想要在安全模式下包含 
/usr/local/include/php 下的文件,那么你可以设置选项为:safe_mode_include_dir = 
/usr/local/include/php如果你的包含的文件是需要执行的,那么你可以设置 safe_mode_exec_dir 选项。比如你需要 
/usr/local/php-bin 路径下的文件是可以执行的,那么可以设置选项为:safe_mode_exec_dir = 
/usr/local/php-bin(可执行:如果你执行的程序在 /usr/bin 
目录下,那么你可以把这些的二进制文件,连接到你指定选项下能够执行的路径)如果你想设置某些环境变量,那么可以使用 
safe_mode_allowed_env_vars 选项。这个选项的值是一个环境变量的前缀,缺省是允许 PHP_ 
开头的环境变量,如果你想要改变,可以设置该选项的值,多个环境变量前缀之间使用逗号进行分割。比如下面允许时区的环境变量 TZ 
,那么修改该选项的值为:safe_mode_allowed_env_vars = PHP_,TZ【 其他的安全特征 
】除了安全模式以外,PHP还提供了许多其他许多特征来保证PHP的安全。

  [ 隐藏PHP ]

  你能够在php.ini里使用 expose_php 选项来防止Web服务器泄露PHP的报告信息。如下:expose_php = 
On利用整个设置,你能够阻碍一些来自自动脚本针对Web服务器的攻击。通常情况下,HTTP的头信息里面包含了如下信息:Server: Apache/1.3.33 
(Unix) PHP/5.0.3 mod_ssl/2.8.16

  OpenSSL/0.9.7c在 expose_php 选项打开以后,PHP的版本信息将不包含在上面的头信息里。当然,用户访问网站的时候同样能够看到 
.php 的文件扩展名。如果你想整个的使用不同的文件扩展名,你需要在 httpd.conf 中找到如下这行:AddType 
application/x-httpd .php你就可以修改 .php 
为任何你喜欢的文件扩展名。你能够指定任意多个的文件扩展名,中间使用空格进行分割。如果你想在服务器端使用PHP来解析 .html 和 .htm 
文件的时候,那么你设置选项如下:AddType application/x-httpd .html 
.htm(解析HTML:配置你的Web服务器使用PHP去解析所有的HTML文件,但是如果非服务器端代码也需要PHP去解析,会影响服务器的性能。静态页面你可以使用不同的扩展名,这样能够消除对PHP脚本引擎的依赖,增强性能。)

  [ 文件系统安全 ]

  安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用 open_basedir 
选现来指定一个你必须访问的目录。如果你指定了一个目录,PHP将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir
选项能够工作在安全模式之外。限制文件系统只能访问 /tmp 目录,那么设置选项为:open_basedir = /tmp[ 函数访问控制 ]你能够在 
disable_functions 
选项中使用逗号分割来设定函数名,那么这些函数将在PHP脚本中被关闭。这个设置能够工作在安全模式之外。disable_functions =   http://www.ztup.cc   dl当然,同样的你能够使用 disable_classes 选项来关闭对一些类的访问。

  [ 数据库安全 ]

  假设你的PHP脚本中包含一个基于表单值来执行的Mysql查询:$sql = “UPDATE mytable SET col1 = ” .

php $this到底是什么

一般说法:¥this表示当前所在类对象这个很不明确 $this取决于¥this所在方法被调用时的执行对象(环境) 方法执行环境:当前方法在哪个对象环境下执行,该方法的¥this就表示该对象,针对还原一...
  • xiaobaig0407
  • xiaobaig0407
  • 2015年02月22日 19:07
  • 1575

php断点调试的几种方法

断点调试是程序开发过程中的一个必不可少的步骤,一些程序的断点调试操作比较简单,只需在编辑器里标记哪行为断点,便可得知程序各个环节的输出结果,例如c#、VB、Delphi等语言。 但是对于php程序的...
  • u013939746
  • u013939746
  • 2015年09月09日 17:52
  • 14698

PHP异步编程简述

概述 异步编程,我们从字面上理解,可以理解为代码非同步执行的。异步编程可以归结为四种模式:回调、事件监听、发布/订阅、promise模式。我们最熟悉的两种模式是回调和事件监听,举两个最简单的ja...
  • huyanping
  • huyanping
  • 2015年10月15日 09:56
  • 10632

PHP面向对象基础概念(抽象方法和抽象类)

在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口。而抽象方法就是为了方便继承而引入的,我们先来看一下抽象类和抽象方法的定义再说明它的用途。 什么是抽象方...
  • PHPwhite
  • PHPwhite
  • 2015年06月15日 23:40
  • 2478

PHP架构-PHP内核

http://blog.areawebsolutions.com/php-architecture-the-php-core.html/comment-page-1
  • iefreer
  • iefreer
  • 2013年11月01日 18:58
  • 5173

RabbitMQ官方中文入门教程(PHP版) 第二部分:工作队列(Work queues)

工作队列 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序。在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Works )。 ...
  • alexdream
  • alexdream
  • 2015年01月27日 20:33
  • 8723

2016某知名互联网公司PHP面试题及答案

1 字符串”\r”,”\n”,”\t”,”\x20”分别代表什么答案: “\r”代表的含义是: 在Linux、unix 中表示返回到当行的最开始位置,在Mac OS 中表示换行且返回到下一行的最开始...
  • whq19890827
  • whq19890827
  • 2016年09月27日 20:27
  • 36127

php的特殊协议php://

来自:http://www.php.net/manual/zh/wrappers.php.php
  • tenfyguo
  • tenfyguo
  • 2014年06月09日 12:57
  • 5611

php查询数据的4个fetch用法和区别

mysql_fetch_row;mysql_fetch_array;mysql_fetch_assoc;mysql_fetch_object;
  • tuku0801
  • tuku0801
  • 2014年10月02日 12:10
  • 3379

基于PHP的排列组合(如输入a,b,c 输出他们的全部组合)

全部组合
  • feihongxueni
  • feihongxueni
  • 2016年03月24日 18:25
  • 2031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP安全模式
举报原因:
原因补充:

(最多只允许输入30个字)