php文件类型黑名单配置核心是服务端明确禁止特定后缀文件上传或访问,需在thinkphp5.0的url_deny_suffix中设竖线分隔字符串,自定义上传脚本中用pathinfo提取小写扩展名比对数组,并配合web服务器层.htaccess或nginx规则加固,但黑名单易被绕过,生产环境应优先使用白名单+文件头校验+重命名+非web目录存储。

PHP文件类型黑名单配置,核心是**在服务端明确禁止特定后缀的文件上传或访问**,不能依赖前端JS、MIME类型或大小写混淆等弱校验。实际生效的关键在于服务端逻辑控制,常见于框架配置或自定义上传处理代码中。
ThinkPHP5.0 的 url_deny_suffix 配置
该框架内置URL后缀拦截机制,用于防止敏感文件被直接访问(如 .php、.log、.bak):
- 打开 application/config.php,确保启用路由并设置黑名单字符串:
'url_route_on' => true,'url_deny_suffix' => 'php|log|bak|conf|ini|env' - 该值必须为竖线分隔的字符串,不能是数组或空值;若缺失或为空,检测完全失效
- 不支持正则表达式,仅做后缀精确匹配;不区分大小写,
.PHP、.Php同样被拦截 - 黑名单仅作用于 URL 路由解析阶段,对已上传到非Web目录的文件无影响
通用PHP上传逻辑中的黑名单实现
在自定义上传脚本(如 upload.php)中,需结合 $_FILES['file']['name'] 提取后缀并比对:
- 用
pathinfo($filename, PATHINFO_EXTENSION)获取扩展名,并统一转小写 - 定义黑名单数组:
$deny_ext = ['php', 'phtml', 'php3', 'php5', 'pl', 'py', 'jsp', 'asp']; - 严格判断:
if (in_array(strtolower($ext), $deny_ext)) { die('不支持的文件类型'); } - 注意规避绕过:需提前 trim() 文件名首尾空格,去除末尾点(
rtrim($ext, '.')),避免shell.php.或web.php%00.jpg类绕过
配合 Web 服务器层加固
仅靠PHP代码黑名单不够,需在 Apache/Nginx 层补充限制:
- Apache:在上传目录下放置
.htaccess,添加:<filesmatch>Deny from all</filesmatch> - Nginx:在 server 或 location 块中配置:
location ~ \.(php|log|bak|conf|ini)$ { deny all; } - 特别注意:
.user.ini和.htaccess本身也应加入黑名单——否则可能被上传用于二次利用
为什么黑名单不如白名单安全?
黑名单本质是“堵漏洞”,但容易遗漏新型后缀(如 .phar、.svg 中嵌入脚本)或被大小写、编码、截断等手法绕过。生产环境推荐:
- 优先使用白名单(只允许
jpg|png|pdf|docx等明确业务需要的类型) - 白名单 + 真实类型校验(
finfo_file()检查文件头) - 上传后重命名(如 UUID + 固定后缀)、保存至非Web可访问目录、通过代理脚本控制下载
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











