PHP中过滤访问流量的最佳方法?仅允许自有安卓应用发起请求
限制PHP接口仅允许自有Android App访问的实现方案
要完全100%拦截所有伪造请求在技术上无法实现,但以下多层叠加的方案可以拦截几乎所有Postman等工具的普通请求、第三方恶意调用,满足绝大多数场景的安全需求:
0. 基础前置要求
所有APP和服务端的交互必须走HTTPS协议,避免请求明文传输被抓包窃取参数、签名规则。
1. 核心签名校验层(最关键防护)
- 前后端提前约定唯一不对外公开的App Secret密钥,该密钥仅存储在Android App打包代码和服务端PHP环境中,禁止通过任何方式对外传输
- Android端发起请求时按固定规则生成签名:将所有请求参数(GET+POST参数)按字典序排序后拼接为字符串,末尾拼接上App Secret,使用
sha256或者md5算法计算哈希值,将该哈希值作为sign参数和其他参数一起传给服务端 - 服务端PHP收到请求后,用完全相同的规则对收到的所有参数做拼接、哈希计算,将计算结果和请求携带的
sign对比,不一致直接返回403状态码拒绝访问
注意:禁止将App Secret放到请求参数中传输,仅用于两端本地计算签名
2. 时效性校验层(防重放攻击)
- Android端发起请求时额外携带当前10位/13位时间戳作为
timestamp参数,该参数和其他参数一起参与签名计算 - 服务端收到请求后首先校验时间戳和服务端当前时间的差值,差值超过5分钟的请求直接拒绝,再进行后续的签名校验
该规则可以避免攻击者抓包拿到历史有效请求后,重复提交调用接口。
3. 自定义请求头校验层(拦截普通工具请求)
- Android端发起HTTP请求时,添加自定义的私有请求头,例如
X-APP-VALID: 你自定义的唯一随机字符串,该头字段的值也可以参与签名计算 - 服务端首先校验请求是否携带该自定义头、头的值是否符合预期,不符合直接拒绝
不要依赖User-Agent字段做校验,该字段可以被任意篡改,防护有效性极低
4. 客户端加固层(防止密钥泄露)
- 不要将App Secret明文写在Android的Java/Kotlin业务代码中,建议将密钥存储、签名计算逻辑用NDK写到so动态库中,打包后反编译很难提取到明文密钥
- 开启Android代码混淆,增加反编译难度
5. 可选场景方案(仅适用特定场景)
如果你的APP仅在企业内部固定网络环境下使用,可以直接在服务端的Nginx/Apache配置中添加IP白名单,仅允许指定IP段的请求访问PHP接口,该方案安全性最高,但不适用于公网用户使用的普通APP。
内容的提问来源于stack exchange,提问作者Rafael Diaz
相关产品推荐
相关产品推荐

