2.3 KiB
如果单纯考虑加解密,或者签名方式来保证请求合法,其实是远远不够的。事实上,一个安全的API平台往往需要多方面一起考虑,保证请求安全合法。
1、是不是实际客户端的请求?
设计专门的私有请求头:定义独有的Request headers,标明有此请求头的请求合法。 请求包含请求时间:定义时间,防止中间拦截篡改,只对指定超时范围内(如10秒)的请求予以响应。 请求URI是否合法:此URI是否在API平台注册?防止伪造URI攻击 请求是否包含不允许的参数定义:请求此版本的这个URI是否允许某些字段,防止注入工具。 部分竞争资源是否包含调用时版本(Etag):部分竞争资源,使用If-Match头提供。如用户资金账户查询API,可以返回此时的账户版本,修改扣款时附加版本号(类似乐观锁设计)。
2、API平台是否允许你调用(访问控制)?
访问控制,主要是授权调用部分。API都对外暴露,但是某些公共API可以直接请求,某些,需要授权请求。本质的目的,都是为了验证发起用户合法,且对用户能标识统计计费。
以HMac Auth为例,我们简单设计一个签名算法。开发者注册时获取App Key、App Secret,然后申请部分API的访问权限,发起请求时:
所有请求参数按第一个字符升序排序(先字母后数字),如第一个相同,则看第二个,依次顺延。 按请求参数名及参数值相互连接组成一个字符串。param1=value1¶m2=value2...(其中包含App Key参数) 将应用密钥分别添加到以上请求参数串的头部和尾部:secret + 请求参数字符串 + secret。 对该字符串进行 SHA1 运算,得到一个二进制数组。 将该二进制数组转换为十六进制的字符串,该字符串为此次请求的签名。 该签名值使用sign系统级参数一起和其它请求参数一起发送给API平台。 服务端先验证是不是实际客户端的请求,然后按照App Key查找对应App Secret,执行签名算法,比较签名是否一致。签名一致后查看此App Key对应的用户是否有访问此API的权限,有则放行。
执行成功后包装返回指定格式的结果,进行统计计费。