1、接口验证种类及外部访问方式种类:
(1)可直接访问类型:对于一些获取数据操作不影响系统正常运行的和数据的,多余的验证是没有必要的,这个时候可以直接访问,例如获取当天的天气预报信息,获取网站的统计信息等。
(2)给予表单的web验证:对于网站来说,有些网页需要我们登录才可以操作,http请求是无状态,用户每次操作都登录一遍也是不可能的,这个时候通常就需要将用户的登录状态记录Cookie中,Cookie每次会随请求发送到服务端,以此来进行验证。
(3)基于签名的API验证:对于接口来说访问源有很多,网站,移动端和桌面程序都有可能,这个时候就不能通过cookie来验证了,需要签名的API验证来实现,它有几个重要的参数:appkey,random,timestamp,secretekey。secretkey不随请求传输,服务端会维护一个appkey-secretkey的集合。例如要查询用户余额时,请求会是类似:/api/user/querybalance?userid=1&appkey=a86790776dbe45ca9032fc59bbc351cb&random=191×tamp=14826791236569260&sign=09d72f207ba8ca9c0fd0e5f8523340f5
2、参数解析:
(1)appkey用于给服务端找到对应的secretkey。有时候我们会分配多对appkey-secretkey,例如安卓分一对,ios分一对。
(2)random、timestamp是为了防止重放攻击(reply-attacks)的 ,这是为了请求被窃取后,再次发起恶意请求。参数timestamp时间戳是必须的,所谓时间戳是指从1970-1-1 至当前的总秒数。我们规定一个时间,例如20分钟,超过20分钟就算过期,如果当前时间与时间戳的间隔超过20分钟,就被拒绝。random不是必须的,但有了它可以更好地防止重放攻击,理论上来说,timestamp+random应该是唯一的,这个时候我们可以将其作为key缓存在redis,如果通过请求的timestamp+random能在规定的时间获取到,就拒绝。这里还有个问题,客户端与服务端时间不同步怎么办? 这个可以要求客户端校正时间,或者把过期时间调大,例如30分钟才过期,再或者可以使用网络时间。防止重放攻击也是很常见的,例如你可以把手机时间调到较早前一个时间,再使用手机银行,这个时候就会受到error了。
(3)sign签名是通过一定规则生成,在这里使用sign=md5(httpmethod+url+timestamp+参数字符串+secretkey)生成。服务端接受到请求后,先通过appkey找到secretkey,进行同样拼接后进行hash,再与请求的sign进行比较,不一致则拒绝。这里需要注意的是,虽然我们做了很多工作,但依然不能阻止请求被窃取;我把timestamp参与到sign的生成,因为timestamp在请求中是可见的,请求被窃取后它完全可以被修改并再次提交,如果我们把它参与到sign的生成,一旦修改,sign 也就不一样了,提高了安全性。参数字符串是通过请求参数拼接生成的字符串,目的也是类似的,防止参数被篡改。例如三个参数a=1,b=3,c=2,那么参数字符串=a1b3c2,也可以通过将参数按值进行排序再拼接生成参数字符串。
文章来自:源码在线https://www.shengli.me/api/29.html