如何保证接口的安全性?
根据我多年的工作经验,这篇文章给大家介绍一下保证接口安全的一些小技巧,希望对你会有所帮助。
1 参数校验
保证接口安全的第一步,也是最重要的一步,需要对接口的请求参数做校验。
如果我们把接口请求参数的校验做好了,真的可以拦截大部分的无效请求。
以京东API接口为例
公共参数
名称 | 类型 | 必须 | 描述 |
---|---|---|---|
key | String | 是 | 调用key(必须以GET方式拼接在URL中) |
secret | String | 是 | 调用密钥 |
api_name | String | 是 | API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等] |
cache | String | 否 | [yes,no]默认yes,将调用缓存的数据,速度比较快 |
result_type | String | 否 | [json,jsonu,xml,serialize,var_export]返回数据格式,默认为json,jsonu输出的内容中文可以直接阅读 |
lang | String | 否 | [cn,en,ru]翻译语言,默认cn简体中文 |
version | String | 否 | API版本 |
请求参数:num_iid=10335871600
参数说明:num_iid:JD商品ID
Version: Date:
名称 | 类型 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
item | item[] | 0 | 获得JD商品 |
-
参数说明
-
通用参数说明
- url说明 平台:淘宝,京东等, API类型:[item_search,item_get,item_search_shop等]
- version:API版本
- key:调用key,测试key:test_api_key
- secret:调用secret,测试secret:(不用填写)
- cache:[yes,no]默认yes,将调用缓存的数据,速度比较快
- result_type:[json,xml,serialize,var_export]返回数据格式,默认为json
- lang:[cn,en,ru] 翻译语言,默认cn简体中文
- secret:密钥
-
API:item_search 参数说明:
- q:搜索关键字
- cat:分类ID
- start_price:开始价格
- end_price:结束价格
- sort:排序[bid,bid,bid2,_bid2,_sale,_credit]
(bid:总价,bid2:商品价格,sale:销量,credit信用,加前缀为从大到小排序) - page:页数
- page_size:每页宝贝数量,默认40
- seller_info:是否获取商家信息[yes,no],默认yes
-
API:item_get 参数说明: num_iid:宝贝ID
-
-
此API目前支持以下基本接口:
- item_get 获得JD商品详情
- item_search 按关键字搜索商品
- item_search_img 按图搜索京东商品(拍立淘)
- item_search_shop 获得店铺的所有商品
- item_history_price 获取商品历史价格信息
- item_recommend 获取推荐商品列表
- buyer_order_list 获取购买到的商品订单列表
- buyer_order_datail 获取购买到的商品订单详情
- upload_img 上传图片到JD
- item_review 获得JD商品评论
- cat_get 获得jd商品分类
2 统一封装返回值
可能有些小伙伴认为,对接口返回值统一封装是为了让代码更规范。
其实也是处于安全方面的考虑。
假如有这样一种场景:你写的某个接口底层的sql,在某种条件下有语法问题。某个用户请求接口之后,在访问数据库时,直接报了sql语法错误,将数据库名、表名、字段名、相关sql语句都打印出来了。
此时,如果你的接口将这些异常信息直接返回给外网的用户,有些黑客拿着这些信息,将参数做一些调整,拼接一些注入sql,可以对你的数据库发起攻击。
因此,非常有必要对接口的返回值做统一的封装。
例如下面这样:
{
"code":0,
"message":null,
"data":[{"id":123,"name":"abc"}]
}
该json返回值中定义了三个字段:
code
:表示响应码,0-成功,1-参数为空,2-参数错误,3-签名错误 4-请求超时 5-服务器内部错误等。message
:表示提示信息,如果请求成功,则返回空。如果请求失败,则返回我们专门在代码中处理过,让用户能看懂的错误信息。data
:表示具体的数据,返回的是一个json字段。
对返回值这样封装之后,即使在接口的底层出现了数据库的异常,也不会直接提示用户,给用户提示的是服务器内部错误
。
对返回值统一封装的工作,没有必要在业务代码中做,完全可以在放到API网关。
业务系统在出现异常时,抛出业务异常的RuntimeException,其中有个message字段定义异常信息。
所有的API接口都必须经过API网关,API网关捕获该业务异常,然后转换成统一的异常结构返回,这样能统一返回值结构。