电商API接口的问题:保证接口安全的小技巧

24 阅读4分钟

如何保证接口的安全性?

根据我多年的工作经验,这篇文章给大家介绍一下保证接口安全的一些小技巧,希望对你会有所帮助。

1 参数校验

保证接口安全的第一步,也是最重要的一步,需要对接口的请求参数做校验。

如果我们把接口请求参数的校验做好了,真的可以拦截大部分的无效请求。

京东API接口为例

公共参数

名称类型必须描述
keyString调用key(必须以GET方式拼接在URL中)
secretString调用密钥
api_nameStringAPI接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]
cacheString[yes,no]默认yes,将调用缓存的数据,速度比较快
result_typeString[json,jsonu,xml,serialize,var_export]返回数据格式,默认为json,jsonu输出的内容中文可以直接阅读
langString[cn,en,ru]翻译语言,默认cn简体中文
versionStringAPI版本

请求参数

请求参数:num_iid=10335871600

参数说明:num_iid:JD商品ID

响应参数

Version: Date:

名称类型必须示例值描述
itemitem[]0获得JD商品
  1. 参数说明

    • 通用参数说明

      • 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

  2. 此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网关捕获该业务异常,然后转换成统一的异常结构返回,这样能统一返回值结构。