如何在接口端点验证可信客户端,确保请求仅来自自有网页?
前端上报接口防恶意伪造方案
首先明确前提:不存在100%无法绕过的校验方案,所有方案本质是提高攻击者的伪造成本,当成本高于其收益时,绝大多数恶意请求都会被过滤。
1. 动态签名校验机制
- 前端每次发起请求前,将所有请求参数、当前10位/13位时间戳、访问UUID、以及页面加载时后端下发的一次性动态盐值拼接为原始字符串,用
SHA256等哈希算法计算得到签名值,把签名、时间戳一同放到请求头中传给后端。 - 动态盐值仅存在前端内存中,不要存入localStorage、sessionStorage等持久化存储,页面关闭即失效,有效期建议控制在2小时以内。
- 后端校验逻辑:
先校验请求头的时间戳与服务器当前时间差是否在5分钟以内,超出范围直接拒绝请求;再用同样的参数、盐值、哈希规则重新计算签名,与前端传的签名对比,不一致直接拒绝。
- 额外优化:对前端的签名计算代码做混淆处理,不要直接调用明文的标准哈希方法,降低JS被逆向得到签名规则的概率。
2. 严格CORS策略加固
- 后端配置严格的CORS跨域规则,仅放行你的业务域名对该接口的请求,非允许域名发起的请求会被浏览器直接拦截。该规则仅对浏览器环境生效,无法阻挡curl、Postman等工具的请求,但可以过滤掉低门槛的跨域调用攻击。
3. 行为特征校验
- 后端对同一个UUID对应的请求序列做行为校验,比如正常用户的交互请求间隔不会低于100ms,不会出现一秒钟数十次的密集请求,上报参数的变化符合正常用户的交互逻辑,不符合规则的直接标记为异常拒绝。
4. 绑定特征的短期令牌校验
- 用户每次打开页面时,后端下发一个有效期1~2小时的访问令牌,令牌和当前用户的IP、浏览器UA特征绑定,请求时必须携带该令牌,后端校验令牌有效性、绑定的IP和UA是否匹配,过期或不匹配直接拒绝。令牌同样仅存在前端内存中,不要持久化存储。
高阶优化建议
如果对安全性要求极高,可以将核心的签名计算逻辑封装到WebAssembly中,相比纯JS代码更难被逆向分析,同时可以定期更新签名规则、盐值生成逻辑,进一步提高攻击者的维护成本。
内容的提问来源于stack exchange,提问作者DHG
相关产品推荐
相关产品推荐

