文件上传相关知识
1. httpd.conf(Apache 全局配置文件)
核心特点
所属:Apache 服务器的主配置文件,Nginx 对应的是 nginx.conf,IIS 无此文件。
作用范围:对整个 Apache 服务器生效,所有网站、所有目录都遵循此配置。
修改要求:需重启 Apache 才能生效,且只有服务器管理员有权修改(本地环境如 PHPStudy 可直接编辑)。
# 示例:httpd.conf 常见配置
Listen 80 # 配置 Apache 监听端口
LoadModule php7_module "D:/phpstudy_pro/Extensions/php/php7.4.33nts/php7apache2_4.dll" # 加载 PHP 模块
DocumentRoot "D:/phpstudy_pro/WWW" # 配置网站根目录
<Directory "D:/phpstudy_pro/WWW">
AllowOverride All # 关键:允许目录下的 .htaccess 覆盖全局配置(若设为 None,则 .htaccess 失效)
Require all granted # 允许所有IP访问
</Directory>
关键注意点
AllowOverride All 是 .htaccess 能生效的前提!如果 httpd.conf 中设为 AllowOverride None,则该目录下的 .htaccess 完全无效。
本地环境(如 PHPStudy)中,httpd.conf 通常在 Apache/conf 目录下(如 D:\phpstudy_pro\Extensions\Apache2.4.43\conf\httpd.conf)。
2. .htaccess(Apache 目录级配置文件)
核心特点
所属:Apache 特有的分布式配置文件(Nginx 不支持,需在 nginx.conf 中配置 location 替代)。
作用范围:仅对当前目录及所有子目录生效,优先级高于 httpd.conf(目录级覆盖全局)。
修改要求:无需重启 Apache,保存后立即生效(Apache 会自动检测),普通用户(无服务器管理员权限)也可修改(如虚拟主机环境)。
核心配置场景(结合 upload-labs 实用案例)
# 案例1:让 PNG 文件解析为 PHP(文件上传绕过)
<FilesMatch "\.png$">
SetHandler application/x-httpd-php # 覆盖 httpd.conf 的默认解析规则
</FilesMatch>
# 案例2:伪静态(隐藏文件后缀)
RewriteEngine On
RewriteRule ^index$ index.php [L] # 访问 /index 实际指向 /index.php
# 案例3:禁止访问特定文件
<Files "config.php">
Require all denied # 拒绝所有IP访问 config.php
</Files>
关键注意点
文件名必须是 .htaccess(前面的点不能少),且需放在需要配置的目录下(如 upload-labs 的 upload 文件夹)。
仅 Apache 支持,Nginx 中需将 .htaccess 的规则转换为 nginx.conf 的 location 配置(如 location ~ .png$ { fastcgi_pass 127.0.0.1:9000; })。
3. php.ini(PHP 全局配置文件)
核心特点
所属:PHP 的核心配置文件,独立于 Web 服务器(Apache/Nginx/IIS 都依赖它)。
作用范围:对整个 PHP 环境生效,所有网站、所有目录的 PHP 运行都遵循此配置。
修改要求:需重启 Web 服务器(Apache/Nginx)或 PHP-FPM 才能生效。
核心配置场景
; 示例:php.ini 常见配置
memory_limit = 128M # PHP 内存限制
upload_max_filesize = 2M # 上传文件大小限制(upload-labs 常需改大)
post_max_size = 8M # POST 数据最大限制
extension=php_redis.dll # 启用 Redis 扩展
display_errors = On # 显示错误信息(开发环境)
disable_functions = eval,exec # 禁用危险函数(生产环境)
cgi.fix_pathinfo = 1 # 关键:允许 PHP 解析后缀不匹配的文件(如 1.png 解析为 PHP)
关键注意点
本地环境中,php.ini 位置:PHPStudy 中每个 PHP 版本都有独立的 php.ini(如 D:\phpstudy_pro\Extensions\php\php7.4.33nts\php.ini)。
可通过 phpinfo() 查看当前生效的 php.ini 路径(Loaded Configuration File 项)。
4. .user.ini(PHP 目录级配置文件)
核心特点
所属:PHP 5.3.0+ 新增的目录级配置文件,替代老版本的 .htaccess 中 PHP 相关配置(尤其适用于 Nginx+PHP-FPM 环境)。
作用范围:仅对当前目录及所有子目录生效,优先级高于 php.ini(目录级覆盖全局)。
修改要求:无需重启服务器,PHP 会定期扫描(默认 300 秒),或手动触发(修改文件时间)后生效。
核心配置场景(结合 upload-labs 实用案例)
; 案例1:修改目录级上传限制(仅对 upload 目录生效)
upload_max_filesize = 10M
post_max_size = 20M
; 案例2:自定义 PHP 自动前置文件(文件包含漏洞利用)
auto_prepend_file = "shell.php" # 该目录下所有 PHP 文件执行前,先执行 shell.php
; 案例3:覆盖全局错误显示规则
display_errors = Off
关键注意点
仅当 PHP 以 CGI/FastCGI 模式 运行时生效(Nginx+PHP-FPM、IIS+FastCGI 均支持,Apache 模块模式下部分配置不生效)。
并非所有 php.ini 配置都能在 .user.ini 中覆盖!PHP 限制了可修改的配置项(标注为 PHP_INI_PERDIR 或 PHP_INI_USER 的项才行,如 upload_max_filesize;PHP_INI_SYSTEM 项如 extension 无法覆盖)。
文件名必须是 .user.ini(前面的点不能少),放在目标目录即可(如 upload-labs 的 upload 文件夹)。
| 需求场景 | 选择配置文件 |
|---|---|
| 配置 Apache | 监听端口、全局根目录 |
| 单个目录修改文件解析规则(如 PNG 解析 PHP) | .htaccess |
| 全局修改 PHP 内存限制、启用扩展 | php.ini |
| 单个目录修改上传文件大小限制 | .user.ini |
| 虚拟主机环境(无服务器管理员权限) | .htaccess/.user.ini |
总结
httpd.conf 和 php.ini 是全局配置,控制服务器 / PHP 的整体规则,需重启生效;
.htaccess 和 .user.ini 是目录级配置,仅影响当前目录,无需重启生效,适合精细化配置或无管理员权限的场景;
.htaccess 是 Apache 专属,.user.ini 是 PHP 跨服务器的目录级配置(更通用);
在 upload-labs 中,.htaccess 用于文件解析绕过,.user.ini 用于目录级 PHP 规则修改,是最常用的两个配置文件。

浙公网安备 33010602011771号