如何阻止浏览器直接访问服务端图片/PDF 仅允许Android应用访问
Android应用专属图片访问防护方案
以下是可落地的多层防护方案,搭配你已有的随机哈希文件名机制,可以有效避免外部渠道非法访问图片资源:
1. 签名+时效校验机制(核心防护)
- 客户端和服务端提前约定好唯一的加密密钥,密钥需要做客户端混淆加固,避免被反编译提取
- 客户端发起图片请求时,在自定义请求头中携带两个参数:
Req-Timestamp:当前请求的时间戳Req-Sign:将「时间戳+当前请求的图片路径+约定密钥」通过SHA256/MD5生成的哈希值
- 服务端收到请求后先做两层校验:
- 校验时间戳是否在5分钟有效期内,超出则直接返回403,避免重放攻击
- 用和客户端完全一致的规则生成签名,和请求携带的
Req-Sign比对,不一致直接拒绝返回资源
- 可以额外添加自定义User-Agent作为辅助校验,但不要单独依赖该规则,因为UA极易被伪造
2. 账号绑定动态令牌校验
- 客户端用户登录成功后,服务端下发和用户账号绑定的短期有效访问令牌(Token),有效期可根据业务需求设置为几小时到几天不等
- 所有图片请求都需要在请求头中携带该Token,服务端校验Token的有效性、所属用户权限,校验通过才返回图片
- 该机制可以避免签名泄露后被长期滥用,Token过期后自动失效,也可以随时在服务端拉黑异常账号的Token
3. 客户端逆向防护
为了避免攻击者反编译App获取签名规则、密钥,需要做客户端加固:
- 核心的签名生成、密钥存储逻辑用NDK写到so层,大幅度提高逆向成本
- 自定义请求头的名称使用无意义的字符串,不要用
sign、token这类辨识度高的命名 - 对Android安装包做代码混淆、第三方加固处理,隐藏核心业务逻辑
4. 服务端附加防护
- 对图片接口做访问频率限制,同一个IP/同一个用户单位时间内请求超过阈值直接临时拉黑,避免被批量爬虫爬取资源
- 所有图片资源不要存放在Web服务的静态公开目录,由后端接口统一鉴权后读取资源返回流,避免出现路径遍历类的漏洞
不存在100%无法破解的防护方案,但是通过多层机制叠加,可以把破解成本抬升到远高于图片资源本身的价值,足以抵御绝大多数的非法访问场景。
内容的提问来源于stack exchange,提问作者JavaForAndroid
相关产品推荐
相关产品推荐

