代码审计之php.ini配置详解
字数 1719 2025-08-18 11:39:08

PHP.ini 配置安全审计详解

一、PHP.ini 简介

PHP.ini 是 PHP 的核心配置文件,其加载方式因运行模式不同而有所差异:

  • Apache 模块版本:仅在 Web 服务器启动时读取一次
  • CGI/CLI 版本:每次调用都会被读取
  • 加载路径:Apache 启动时会转到根目录尝试读取 php.ini

PHP 配置模式分类

模式 含义 可设置位置
PHP_INI_USER 用户级配置 用户脚本(ini_set())、Windows 注册表(5.3+)、.user.ini
PHP_INI_PERDIR 目录级配置 php.ini、.htaccess、httpd.conf
PHP_INI_SYSTEM 系统级配置 php.ini、httpd.conf
PHP_INI_ALL 全局配置 任何地方

User.ini 文件:自 PHP 5.3.0 起支持基于每个目录的 .htaccess 风格 INI 文件,仅被 CGI/FastCGI SAPI 处理。

二、关键安全配置详解

1. register_globals

作用:控制全局变量的自动注册(已废弃)

版本变化

  • PHP 5.2.0 默认开启
  • PHP 5.3.0 废弃
  • PHP 5.4.0 移除

安全风险

// 漏洞示例
$username = $_GET['username'];
$password = $_GET['password'];

if(($username==="admin") && ($password==="admin123")){
    $authorized = true;
}

// 攻击者可构造 ?authorized=true 直接绕过验证
if ($authorized) {
    echo "You have login";
}

POC

http://127.0.0.1/test.php?username=xxx&password=xxx&authorized=true

审计要点

  • 检查变量是否被覆盖
  • 可能导致身份验证绕过、SQL注入等漏洞

2. short_open_tag

作用:控制是否允许使用 PHP 短标签 <? ?>

版本特性

  • PHP 5.2-5.3 默认开启
  • PHP 5.4.0 起 <?= 总是可用

安全风险

// 文件上传检测漏洞示例
$content = file_get_contents($upload_path);
if(preg_match('/<\?php/',$content)){ // 只检测完整标签
    echo "Hacker detected";
} else {
    echo "Upload success"; // 可通过 <?=`command`?> 绕过
}

攻击向量

  • PHP 5.4+ 未开启短标签时可用:<?={$_GET["cmd"]}?>
  • 上传包含短标签的恶意文件

3. safe_mode

作用:禁用危险函数如 system()、exec() 等(已废弃)

版本变化

  • PHP 5.3.0 废弃
  • PHP 5.4.0 移除

相关配置

  • safe_mode_exec_dir:限制可执行目录
  • disable_classes:禁用特定类
  • disable_functions:禁用特定函数

漏洞示例

$cmd = $_GET['cmd'];
system("{$cmd}"); // 直接命令执行

4. open_basedir

作用:限制文件访问范围

配置要点

  • 必须正确闭合路径(如 /var/www/html/
  • 可在运行时动态配置

错误配置风险

open_basedir=/var/www/html  // 可访问 /var/www/html1 等目录

5. 文件上传相关配置

file_uploads = On
upload_max_filesize = 2M
upload_tmp_dir = [路径]  ; 默认为系统临时目录

安全考虑

  • 限制上传文件大小
  • 指定安全的临时目录
  • 配合内容检查防止恶意文件上传

6. 错误显示配置

display_errors = On  ; 生产环境应关闭
error_reporting = E_ALL  ; 错误报告级别
error_log = [路径]  ; 自定义错误日志
log_errors = on  ; 记录错误到日志

安全风险

  • 暴露服务器路径信息
  • 增加SQL注入风险(显示错误详情)

7. magic_quotes 相关

作用

  • magic_quotes_gpc:自动转义GPC数据中的特殊字符
  • magic_quotes_runtime:转义数据库和文本文件内容

版本变化

  • PHP 5.3.0 默认关闭
  • PHP 5.4.0 移除

SQL注入风险

$user = $_GET['username'];
$sql = "SELECT * FROM users WHERE username='{$user}'";
// 未开启magic_quotes_gpc时易受SQL注入

三、审计实践要点

  1. 环境识别

    • 确定PHP版本
    • 检查php.ini实际配置(可通过phpinfo())
  2. 配置影响分析

    • register_globals开启时的变量覆盖风险
    • short_open_tag开启时的代码执行风险
    • safe_mode关闭时的危险函数调用
  3. 防御措施

    • 生产环境关闭display_errors
    • 合理设置open_basedir
    • 禁用不必要的危险函数
  4. 版本适配

    • 注意不同PHP版本默认配置差异
    • 识别已废弃/移除的特性

四、总结

PHP.ini配置直接影响应用程序的安全边界,审计时应:

  1. 优先检查register_globals、safe_mode等关键配置
  2. 关注不同PHP版本的默认行为变化
  3. 验证配置实际效果,避免想当然
  4. 结合代码逻辑分析配置可能带来的安全隐患

通过全面审计php.ini配置,可以有效识别因环境不当导致的潜在安全风险。

PHP.ini 配置安全审计详解 一、PHP.ini 简介 PHP.ini 是 PHP 的核心配置文件,其加载方式因运行模式不同而有所差异: Apache 模块版本 :仅在 Web 服务器启动时读取一次 CGI/CLI 版本 :每次调用都会被读取 加载路径 :Apache 启动时会转到根目录尝试读取 php.ini PHP 配置模式分类 | 模式 | 含义 | 可设置位置 | |------|------|------------| | PHP_ INI_ USER | 用户级配置 | 用户脚本(ini_ set())、Windows 注册表(5.3+)、.user.ini | | PHP_ INI_ PERDIR | 目录级配置 | php.ini、.htaccess、httpd.conf | | PHP_ INI_ SYSTEM | 系统级配置 | php.ini、httpd.conf | | PHP_ INI_ ALL | 全局配置 | 任何地方 | User.ini 文件 :自 PHP 5.3.0 起支持基于每个目录的 .htaccess 风格 INI 文件,仅被 CGI/FastCGI SAPI 处理。 二、关键安全配置详解 1. register_ globals 作用 :控制全局变量的自动注册(已废弃) 版本变化 : PHP 5.2.0 默认开启 PHP 5.3.0 废弃 PHP 5.4.0 移除 安全风险 : POC : 审计要点 : 检查变量是否被覆盖 可能导致身份验证绕过、SQL注入等漏洞 2. short_ open_ tag 作用 :控制是否允许使用 PHP 短标签 <? ?> 版本特性 : PHP 5.2-5.3 默认开启 PHP 5.4.0 起 <?= 总是可用 安全风险 : 攻击向量 : PHP 5.4+ 未开启短标签时可用: <?= {$_ GET[ "cmd"]} ?> 上传包含短标签的恶意文件 3. safe_ mode 作用 :禁用危险函数如 system()、exec() 等(已废弃) 版本变化 : PHP 5.3.0 废弃 PHP 5.4.0 移除 相关配置 : safe_mode_exec_dir :限制可执行目录 disable_classes :禁用特定类 disable_functions :禁用特定函数 漏洞示例 : 4. open_ basedir 作用 :限制文件访问范围 配置要点 : 必须正确闭合路径(如 /var/www/html/ ) 可在运行时动态配置 错误配置风险 : 5. 文件上传相关配置 安全考虑 : 限制上传文件大小 指定安全的临时目录 配合内容检查防止恶意文件上传 6. 错误显示配置 安全风险 : 暴露服务器路径信息 增加SQL注入风险(显示错误详情) 7. magic_ quotes 相关 作用 : magic_quotes_gpc :自动转义GPC数据中的特殊字符 magic_quotes_runtime :转义数据库和文本文件内容 版本变化 : PHP 5.3.0 默认关闭 PHP 5.4.0 移除 SQL注入风险 : 三、审计实践要点 环境识别 : 确定PHP版本 检查php.ini实际配置(可通过phpinfo()) 配置影响分析 : register_ globals开启时的变量覆盖风险 short_ open_ tag开启时的代码执行风险 safe_ mode关闭时的危险函数调用 防御措施 : 生产环境关闭display_ errors 合理设置open_ basedir 禁用不必要的危险函数 版本适配 : 注意不同PHP版本默认配置差异 识别已废弃/移除的特性 四、总结 PHP.ini配置直接影响应用程序的安全边界,审计时应: 优先检查register_ globals、safe_ mode等关键配置 关注不同PHP版本的默认行为变化 验证配置实际效果,避免想当然 结合代码逻辑分析配置可能带来的安全隐患 通过全面审计php.ini配置,可以有效识别因环境不当导致的潜在安全风险。