You need to enable JavaScript to run this app. 如何通过PHP实现全站禁止所有文件上传,现有三种方案哪个最优?
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PHP实现全站禁止所有文件上传,现有三种方案哪个最优?

现有方案问题说明

你给出的三个方案均存在严重逻辑缺陷,无法起到禁止上传的作用:

  • 第一个方案:filetype()、filesize 均未传入目标文件参数,语法错误无法正常运行,随机扩展名的判断逻辑完全不具备实际拦截效力,攻击者可轻松绕过。
  • 第二个方案:前端accept="none"属于纯前端限制,攻击者只需修改页面HTML、直接构造POST上传请求即可完全绕过,完全不可靠,且后续提示代码未和上传校验逻辑绑定,无法拦截实际上传动作。
  • 第三个方案:不存在后缀名为none的合法文件,$ext == 'none'的判断永远不成立,同时文件大小不可能小于0,$fileSize < '0'也永远为假,整个拦截逻辑根本不会触发,相当于没有任何防护。

推荐实现方案

要实现全站禁止所有上传,优先从最前置的层面做拦截,防护优先级从高到低如下:

1. 最彻底方案:PHP配置层面关闭上传功能

直接修改php.ini配置文件,将file_uploads参数设置为Off,彻底关闭PHP的文件上传解析能力,所有上传的文件都会被PHP直接忽略,不会生成临时文件也不会填充$_FILES数组,完全避免后续逻辑的遗漏风险。

2. 服务器层面拦截(htaccess规则)

在你现有的htaccess规则中补充以下配置,直接拦截所有包含上传内容的请求,比PHP层面拦截更前置:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{CONTENT_TYPE} multipart/form-data [NC]
RewriteRule .* - [F,L]
</IfModule>

3. PHP全局代码拦截

如果无法修改服务器配置和php.ini,可以在项目的公共入口文件(如全局初始化文件、入口index.php)的最开头加入以下代码,只要检测到上传请求就直接拦截:

// 全局拦截所有上传请求
if (!empty($_FILES)) {
    // 清空上传数组,避免后续逻辑误处理
    $_FILES = [];
    http_response_code(403);
    exit("Sorry, you are not allowed to upload any files.");
}

如果使用的是框架,可将以上逻辑封装为全局中间件,绑定到所有路由,确保全站所有请求都经过校验。


内容的提问来源于stack exchange,提问作者Hout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 06:54:03