生产环境对于文件服务注意事项
生产环境对于文件服务,尤其是对外提供访问的场景,需要注意以下几点,以防止伪装文件被解析执行等安全风险,从而被黑产利用上传恶意文件,如上传 html 作为钓鱼、菠菜、跳转 进行传播,利用你的域名当作跳板,导致域名封、通报、用户上当受骗等问题。
Nginx 访问限制与安全加固方案
一、限制非图片文件访问
仅允许访问指定图片格式,如有其他格式也是类似新增。
目的:防止伪装文件被解析执行。但这种方式无法完全杜绝风险,需要结合其他手段。
if ($uri !~* \.(jpg|jpeg|png|gif)$) {
return 403;
}二、结合 Referer 进行访问限制
通过校验 Referer 来源域名,同时限制文件类型:
location /uploads/ {
# 校验 Referer 是否来自允许的域名
if ($http_referer !~* "^https://your-mini-program-domain\.com") {
return 403;
}
# 限制非图片文件访问
if ($uri !~* \.(jpg|jpeg|png|gif)$) {
return 403;
}
}三、结合 Token 验证(后端代理文件请求方式)
仅允许携带合法 Token 的请求访问资源,适用于私有资源或鉴权场景。
可参考文章:基于S3协议对外分享文件权限管理方案-后端代理文件请求。
四、文件访问签名验证(S3方式)
通过签名 URL(Pre-Signed URL)控制访问权限,仅允许在有效期内通过合法签名访问文件。
可参考文章:基于S3协议对外分享文件权限管理方案-基于预签名-url。
五、临时凭证(STS)与策略控制(S3方式)
使用 STS 动态下发临时凭证,通过策略实现细粒度、时效性的权限分配。
可参考文章:基于S3协议对外分享文件权限管理方案-基于临时凭证sts。
六、上传接口安全过滤
从上传入口进行多重校验,降低伪装文件风险:
-
文件扩展名过滤
-
MIME 类型校验
-
图片内容校验(如 ImageIO 读取)
-
读取文件前几个字节,判断是否符合常见图片格式特征(如 魔术字节)
七、基于用户权限开放接口
从接口层面进行权限控制,不同用户仅允许访问授权资源。
八、记录上传者信息
保留上传用户、时间、IP 等审计信息,便于追溯和风控。
九、屏蔽国外 IP
通过 Nginx、WAF 或防火墙策略限制特定国家或地区 IP 的访问。
十、响应内容增加安全头
即使文件被伪装访问,通过严格的安全响应头降低被解析和执行的风险。
常用安全头配置
-
Content-Security-Policy:限制资源加载和脚本执行
add_header Content-Security-Policy "default-src 'none';"; -
X-Content-Type-Options:禁止浏览器进行 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff"; -
X-Frame-Options:防止内容被嵌入 iframe
add_header X-Frame-Options "DENY";
十一、整体防护策略总结
为全面防止伪装文件被解析,可从多个阶段进行控制:
-
上传阶段:校验真实文件类型和内容
-
存储阶段:限制敏感文件的存储路径与公开访问
-
响应阶段:增加安全头部和浏览器策略限制
十二、Nginx 拦截 Spring Boot Actuator
直接在 Nginx 层拦截敏感端点:
location /api/actuator {
return 403;
}十三、关闭或限制 API 文档、Swagger、Actuator
通过配置彻底禁用 Actuator HTTP 访问端口:
--- # Actuator 监控端点配置
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS
logfile:
external-file: ./logs/sys-console.log
server:
port: -1 # 设置为 -1,禁用 Actuator HTTP 端口