如何通过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
相关产品推荐
相关产品推荐

