织梦上传白名单失效主因是变量名错误(如$imtypes应为$imgtypes),导致类型判断跳过;需修正/include/uploadsafe.inc.php中变量名与数组值(小写无点号),并清空后台缓存,同时严格限制/uploads/目录执行权限。

织梦上传白名单失效的典型表现
上传图片提示 UPLOAD FILETYPE NOT ALLOW,或后台附件管理里明明勾选了 jpg 却仍被拦截。这不是配置没生效,而是底层变量名写错导致白名单逻辑根本没跑起来——比如 $imtypes(少了个 g)被当成未定义变量,整个图片类型判断直接跳过,结果所有上传都 fallback 到默认拒绝。
修复 $imgtypes 变量名并同步更新白名单数组
核心文件是 /include/uploadsafe.inc.php(DedeCMS 5.7+ 主流版本)。打开后定位到类似这行:
global $imtypes;
把它改成:
global $imgtypes;
接着往下找 $imgtypes = array( 开头的数组定义,确保它包含你实际需要的扩展名,例如:
$imgtypes = array('jpg','jpeg','gif','png','bmp');
注意三点:
- 数组值全部小写,不带点号(
'jpg'✅,不是'.jpg'❌) - 如果还要支持 PDF 或 ZIP,得额外加进
$filetypes数组(该数组控制非图片类附件),不能只改$imgtypes - 改完必须清空后台缓存:进入
/dede/sys_cache_up.php页面点击“更新系统缓存”,否则改动不生效
后台附件设置里的白名单只是表层开关
后台「系统」→「附件设置」里填的「允许的附件类型」(如 jpg|png|gif)只是前端校验和数据库记录,真正起作用的是上面那个 PHP 文件里的硬编码数组。也就是说:
- 后台填了
pdf,但$filetypes数组里没加'pdf'→ 上传仍失败 - 后台没填
jpg,但$imgtypes里有'jpg'→ 图片仍能上传(只是少了后台校验) - 两者必须同时匹配,才真正安全又可用
上传目录权限与执行限制比白名单更关键
即使白名单全开,如果 /uploads/ 目录允许执行 PHP,黑客传个 shell.jpg.php(利用解析漏洞)就能绕过所有类型检查。所以必须:
- 把
/uploads/和/data/目录的服务器权限设为755,禁止写入可执行脚本(Nginx/Apache 需配location ~ \.php$ { deny all; }) - 确认这两个目录不在 Web 根目录下(理想是移到
/var/www/xxx/../uploads/),避免 URL 直接访问 - 别用
777权限——这是白名单再严也救不了的硬伤
白名单只是第一道过滤网,目录执行限制才是真正的安全底线。变量名写错、缓存没清、权限放太宽,三者任一出问题,白名单就形同虚设。











