[ 使用安全模式来强制限制 ]
当安全模式打开的时候,以下函数列表的功能将会受到限制:
以下执行命令的函数列表将会受到影响:
exec, shell_exec, passthru, system, popen
另外,背部标记操作符(`)也将被关闭。
[ 打开安全模式 ]
safe_mode = On
比如你想要在安全模式下包含 /usr/local/include/php 下的文件,那么你可以设置选项为:
safe_mode_include_dir = /usr/local/include/php
safe_mode_exec_dir = /usr/local/php-bin
(可执行:如果你执行的程序在 /usr/bin 目录下,那么你可以把这些的二进制文件,连接到你指定选项下能够执行的路径)
比如下面允许时区的环境变量 TZ ,那么修改该选项的值为:
safe_mode_allowed_env_vars = PHP_,TZ
除了安全模式以外,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的版本信息将不包含在上面的头信息里。
AddType application/x-httpd .php
AddType application/x-httpd .html .htm
[ 文件系统安全 ]
限制文件系统只能访问 /tmp 目录,那么设置选项为:
open_basedir = /tmp
[ 函数访问控制 ]
disable_functions = dl
当然,同样的你能够使用 disable_classes 选项来关闭对一些类的访问。
[ 数据库安全 ]
假设你的PHP脚本中包含一个基于表单值来执行的Mysql查询:
$sql = “UPDATE mytable SET col1 = ” .
POST["value"] . ”
WHERE col2 = ’somevalue’”;
$res = mysql_query($sql, $db);
举例,假设下面是
POST["value"] 提交的值:
0; INSERT INTO admin_users (username, password)
VALUES (’me’, ‘mypassword’);
那么当这个查询发送给Mysql查询的时候,那么就变成了下面这条SQL:
UPDATE mytable SET col1 = 0;
INSERT INTO admin_users (username, password)
VALUES (’me’, ‘mypassword’);
WHERE col2 = ’somevalue’;
如果你要防止 SQL injection 攻击,你必须保证用户表单里提交的内容不是一个能够执行的SQL表达式。
$sql = sprintf(”UPDATE mytable SET col1 = %d
WHERE col2 = ‘%s’”,
