@zhuchao941
2017-01-15T13:09:13.000000Z
字数 791
阅读 880
会有请求被重新发到服务端,请求参数完全一样(包括TOKEN和签名)
通过该请求的访问IP与骑手正常访问时的IP做对比后确认该请求并不是由骑手APP发出
但是请求头还是有不一样的,比如其中的User-Agent
Android上来的UA为:okhttp/2.5.0
iOS上来的UA为:Rider/4.3.0 (iPhone; iOS 10.1.1; Scale/3.00)
其余都是异常的UA,从nginx访问日志分析大致有如下:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
AHC/1.0
AHC/1.0
据Google是某爬虫默认的UA,该UA的请求已经都被运维封杀了
针对上面的现象,我们可以很容易的想到先根据UA过滤一次:比如对于UA为AHC/1.0
,直接返回403
。或者只允许okhttp
开头或者Rider
开头的UA访问。
上面的解决方案算是第一重保护,但是其他人依旧可以伪造UA,那这个时候我们再加上一重时间戳的保护:针对每个请求,加上时间戳信息,限制请求的有效期。
上述的解决方案会存在一个问题:客户端和服务端时间信息可能存在不一致
针对这个问题,计划在骑手上传经纬度(15s一次)接口进行服务端时间的下发
那么客户端在上传经纬度正常的情况下和服务端的时间差最多15s
而服务端将有效期时间窗口设置成30s,也就是保证请求在发起30s之内才有效
这样对于被复制的流量只要超过30s就能被完全过滤掉
总体按照解决方案来开发,但是初期上线服务端不验证有效期,通过日志形式打印出每个请求请求时和服务端的时间戳差值,分析出一个较为合理的有效期。最后再加上这个有效期的限制。