文件上传类型限制,CMS后台禁止上传脚本
很多CMS后台默认允许上传多种文件类型,攻击者可能上传.php、.jsp等脚本文件,从而控制服务器。
本文针对“文件上传类型限制”这一需求,手把手教你在Apache、Nginx和PHP层面配置规则,禁止上传脚本文件,适合零基础运维和站长操作。
先判断你的Web服务器类型
不同服务器的限制方式不同,请先确认环境:
- Apache:使用
.htaccess文件或主配置文件httpd.conf。 - Nginx:使用站点配置文件,通常在
/etc/nginx/conf.d/或/etc/nginx/sites-available/。 - PHP:使用
php.ini中的upload_max_filesize和post_max_size,但禁止脚本主要靠disable_functions或文件类型检查。
如果使用宝塔面板,可在“网站”->“设置”->“配置文件”中直接编辑。
方法一:Apache下通过.htaccess禁止脚本上传
在网站根目录创建或编辑.htaccess文件,加入以下内容:
Require all denied
这段规则会拒绝访问所有以这些后缀结尾的文件。
注意:如果上传目录需要允许图片等,请将规则放在上传目录的.htaccess中,而不是全局。
保存后,尝试上传一个.php文件,应返回403错误。
方法二:Nginx配置location匹配禁止脚本
编辑站点配置文件,在server块内添加:
location ~* \.(php|php5|phtml|jsp|asp|aspx|exe|sh)$ {
deny all;
return 403;
}
如果希望仅限制上传目录,可改为:
location ~* /uploads/.*\.(php|php5|phtml|jsp|asp|aspx|exe|sh)$ {
deny all;
}
修改后执行nginx -t测试配置,然后nginx -s reload重载。
方法三:PHP层面限制上传类型
在php.ini中设置:
upload_max_filesize = 2M
post_max_size = 8M
但更关键的是在CMS代码中检查文件扩展名。
例如在保存上传文件前:
$allowed = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allowed)) {
die('不允许的文件类型');
}
如果无法修改代码,可安装安全插件(如WordPress的“File Upload Type Restriction”)。
验证限制是否生效
配置完成后,进行以下测试:
- 上传一个
.php文件,应被拒绝并提示错误。 - 上传一个
.jpg文件,应成功。 - 直接访问上传目录下的
.php文件,应返回403。
如果测试失败,检查配置文件是否加载、语法是否正确,并查看服务器错误日志。
常见问题与避坑
问题1:上传图片时提示“文件类型不允许”
检查允许列表是否包含图片后缀,注意大小写。
问题2:Nginx规则不生效
确保location优先级正确,避免被其他规则覆盖。
问题3:CMS后台仍然能上传脚本
可能是CMS自身未做检查,需结合服务器层限制。
避坑:不要只依赖前端JavaScript验证,攻击者可绕过;
务必在服务器端实施限制。
总结
通过Apache、Nginx或PHP任一层面配置文件上传类型限制,即可有效禁止CMS后台上传脚本。
建议同时使用多种方式,并定期检查上传目录。
实际操作中,请根据你的服务器环境选择合适方法,修改前备份配置文件。
如果遇到问题,优先查看日志定位原因。