PHP配置文件指令多达数百项,为了节省篇幅,这里不对每个指令进行说明,只列出会影响PHP脚本安全的配置列表以及核心配置选项。
详细参阅官方文档,关于php.ini的配置选项列表。
allow_url_include
如果服务端开启了远程文件包含选项allow_url_include
,我们甚至可以直接远程执行PHP代码。但是,这些PHP默认自带的wrapper和filter都可能通过php.ini配置禁用,所以在具体情况还要具体分析。尝试实例,修改php.ini文件,将其设置为on,然后重启apache服务器重新读取php配置。
allow_url_include=On
源网站test的index.php如下
<!-- index.php -->
<?php
if (isset($_GET['file'])) {
$file = $_GET['file'];
} else {
$file = "test.txt";
}
include $file;
?>
另一个网站test1的index.php如下
<!-- index.php -->
<?php
echo "ok";
在test站点传递file参数http://test/?file=http://test1/index.php
,就能看到页面回显了ok,远程读取并执行了test1的index.php,这个配置选项对于PHP安全的影响不可小觑,在使用的时候必须慎之又慎。
open_basedir
open_basedir将 PHP 可以访问的文件限制在指定的目录树中,包括文件本身。当脚本尝试访问文件系统时,例如使用 include 或 fopen() 时,将检查文件的位置。当文件位于指定的目录树之外时,PHP 将拒绝访问它。在 Windows 中,用分号分隔目录。在所有其它系统上,用冒号分隔目录。现在 Apache 模块将自动继承来自父目录的open_basedir路径。需要注意的点是,open_basedir指定的限制是目录名称,而不是前缀。
例如,修改php.ini
open_basedir = D:\phpstudy_pro\WWW\test\a
a目录下的test.php如下
<!-- test.php -->
<?php
echo file_get_contents('../ac/test.txt');
重启web服务器,进入网页,发现访问被拒绝了。
当使用open_basedir配置目录后,执行脚本访问其他文件都需要验证文件路径,因此在执行效率上面也会有⼀定的影响。
disable_functions
本指令可用于禁止某些函数。接受逗号分隔的函数名列表作为参数。此指令只能限制内置函数,对用户定义的函数无效。
例如在其中禁用phpinfo函数
disable_functions = phpinfo
在index.php当中调用phpinfo函数,在网页当中报错
display_errors与error_reporting
该选项设置是否将错误信息作为输出的一部分打印到屏幕,或者对用户隐藏。这是辅助开发的功能,不应在生产系统中使用 (例如连接到互联网的系统)。设置为Off时,将不会对用户显示错误信息。
error_reporting用于设置错误报告级别。该参数可以是表示二进制位字段的任意整数或者常量名称。error_reporting 级别和常量是在预定义常量和php.ini中进行了说明。在程序运行时可以通过error_reporting进行设置。在设置display_errors=On时,还可以配置error_reporting,用来配置错误显示的级别。