上传目录为什么要去掉脚本执行权限,在哪一层挡
因为上传目录同时满足两个条件:文件内容由外部写入,路径又能被公网访问。去掉脚本执行权限的意义在于,即使有脚本文件被放进这个目录,服务器也只会把它当作静态内容返回,不会当作程序运行。这类限制应当配在 Web 服务器一层,与程序内的文件类型检查是两道独立的防线,不是替代关系。
为什么上传目录是高危位置
附件上传是把外部字节落到服务器文件系统上,路径通常在站点根目录之下、可被直接请求。一旦这里的内容能被解释执行,写进来的脚本就有了运行入口,这是这类目录的攻击面所在。程序侧本来就有输入防御:站内用于防御 SQL 注入与 XSS 的机制、上传时的类型与扩展名处理,都属于第一道防线。第二道防线的价值在于不依赖第一道不出错——校验可能被绕过,而目录不执行脚本这件事与文件内容无关,只要配置生效就一直成立。
按路径配置块的匹配顺序
Web 服务器按路径匹配配置块的顺序决定了「先拦谁」。以 nginx 的文档描述为例:先检查用前缀字符串定义的 location,其中最长匹配的那个被选中并记住;然后按配置文件里出现的顺序检查正则表达式,正则的查找在首个命中处停止。还有一条容易踩的修饰符:如果选中的最长前缀 location 带 ^~ 修饰,就不再检查正则与其他匹配类型。这意味着给上传目录写的限制,可能被后面一条更靠前的正则块抢先命中,或者反过来被 ^~ 跳过——限制没生效,配置却是合法的,这类问题只在请求结果上暴露。
去掉执行权限怎么写
思路是给上传目录单独一条稳定命中的匹配,在该范围内关闭脚本解释:不再把请求交给脚本处理器,让脚本类文件以源码或静态内容返回。写法上有两个要点。一是路径要写实际落盘的目录,附件按日期分层的站点要覆盖到全部子目录;二是这条匹配要能稳定胜出,用最长前缀或 ^~ 明确优先级,避免依赖正则出现顺序。配置改完先请求一个不存在的路径确认返回符合预期,再用一个无害的脚本文件验证它不被执行,验证过后再删除测试文件。
改完之后核对备份
处理上传目录常伴随清理动作:找出可疑文件、移出站点目录。这一步的风险是把正常附件一起清掉,而附件是站点数据的一部分,误删之后前台会大面积出现图片缺失。动手前先确认备份可用——站内的备份与恢复覆盖站库数据与静态文件,这正是清理动作的回滚前提;其次按时间窗筛选而非按扩展名批量删除,把可疑文件先移动到站点外的隔离目录而不是直接删除,观察一段时间再决定处置。部署形态也要一并核对:容器部署下改动镜像内文件不会持久,清理结果在新容器里会消失,处置应当落在存储卷或站点目录上。
常见问题
问:程序已经校验了文件类型,还要配这一层吗? 答:要。校验是第一道防线,可能被绕过;目录不执行脚本与内容无关,是兜底的那一层,两者作用点不同。
问:禁了执行会不会影响正常图片访问? 答:不会。限制针对的是脚本类文件的解释执行,静态资源的读取路径与响应方式不变,改完逐项请求确认即可。
问:清理上传目录时发现大量陌生文件,先看什么? 答:先看这些文件的时间戳与来源接口的访问日志,确认是采集与导入产生的正常附件,还是异常写入。判断完成前不要批量删除,先隔离并保留备份。