PHP安全核心配置

2023-10-21 11:25:20 浏览数 (1)

PHP配置文件指令多达数百项,为了节省篇幅,这里不对每个指令进行说明,只列出会影响PHP脚本安全的配置列表以及核心配置选项。

详细参阅官方文档,关于php.ini的配置选项列表。

allow_url_include

如果服务端开启了远程文件包含选项allow_url_include,我们甚至可以直接远程执行PHP代码。但是,这些PHP默认自带的wrapper和filter都可能通过php.ini配置禁用,所以在具体情况还要具体分析。尝试实例,修改php.ini文件,将其设置为on,然后重启apache服务器重新读取php配置。

代码语言:javascript复制
allow_url_include=On

源网站test的index.php如下

代码语言:javascript复制
<!-- index.php -->
<?php
if (isset($_GET['file'])) {
    $file = $_GET['file'];
} else {
    $file = "test.txt";
}
include $file;
?>

另一个网站test1的index.php如下

代码语言:javascript复制
<!-- 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

代码语言:javascript复制
open_basedir = D:phpstudy_proWWWtesta

a目录下的test.php如下

代码语言:javascript复制
<!-- test.php -->
<?php
echo file_get_contents('../ac/test.txt');

重启web服务器,进入网页,发现访问被拒绝了。

当使用open_basedir配置目录后,执行脚本访问其他文件都需要验证文件路径,因此在执行效率上面也会有⼀定的影响。   

disable_functions

本指令可用于禁止某些函数。接受逗号分隔的函数名列表作为参数。此指令只能限制内置函数,对用户定义的函数无效。

例如在其中禁用phpinfo函数

代码语言:javascript复制
disable_functions = phpinfo

在index.php当中调用phpinfo函数,在网页当中报错

display_errors与error_reporting

该选项设置是否将错误信息作为输出的一部分打印到屏幕,或者对用户隐藏。这是辅助开发的功能,不应在生产系统中使用 (例如连接到互联网的系统)。设置为Off时,将不会对用户显示错误信息。

error_reporting用于设置错误报告级别。该参数可以是表示二进制位字段的任意整数或者常量名称。error_reporting 级别和常量是在预定义常量和php.ini中进行了说明。在程序运行时可以通过error_reporting进行设置。在设置display_errors=On时,还可以配置error_reporting,用来配置错误显示的级别。

0 人点赞