zoukankan      html  css  js  c++  java
  • 【分享】对外API接口安全设计

    前言

    最近公司业务需要对外提供接口,之前没有什么对外接口开发经验所以最近找了很多文章,恶补了一下对外接口开发知识,这篇算是自己开发接口的一个总结吧。下图我设计接口的大体流程

    对外接口的安全问题

    1.传输过程的安全
    请求报文在网络传输过程中可能会被劫持篡改请求参数信息,导致服务端接收错误的参数。所以我们引入签名机制,就好比一个指纹锁,我需要一个正确的指纹才能打开锁,这里的指纹就是签名。接口请求方根据接口双方约定的签名规则对参数进行签名,即使请求参数被篡改,我们通过双方生成的签名进行验签来拒绝这次请求。生成签名的算法可以使用摘要算法最常用的SHA256。
        以上所述我们可以保证请求数据由接口请求方到服务器端的数据不会被篡改,那么服务端返回到接口请求方的数据怎么能保证这个数据是由服务端返回的未被篡改过的数据。这里我的做法通过RSA算法生成公私钥,服务器端保存私钥,线下提供公钥给接口请求方,由接口请求方生成一个自己的密钥secretKey,通过RSA算法用公钥对secretKey进行加密,将加密后的字段通过请求头的方式传给服务端,服务端用私钥解密得到secretKey,在服务端返回数据的时候用AES算法进行加密,接口请求方用自己secretKey进行解密来保证返回数据的安全性。

    2.到达服务端的安全
    请求到达服务端需要判断这个请求方的身份是否合法。以及是否被DoS攻击。判断身份是否合法我们可以利用token的方式,通过下线分配给接口请求方一个id和密码类似于用户登录的用户名和密码来获取token(token可以是一次性的也可以设置有效时间段),每次请求都带上token,服务端进行身份校验。粗略的防止类似于DoS攻击这样的我们可以引入时间戳的机制,设置请求有效期例如三分钟内的请求有效其它的无效,但是这种方法并不能阻止DoS攻击,三分钟内同样可以使用DoS攻击来使服务器瘫痪。我们可以使用黑名单机制,对这个接口请求方的所有操作都直接返回错误或者拉入IP黑名单。如果对于频繁的接口请求,可以采用限流机制(常见的限流方式有漏斗限流和令牌桶限流算法)。
    在对外接口中如果是写入操作我们还需要防止重复写入数据,例如新增数据,我们通常只要新增一条例外一条相同的请求过来我们应该直接返回上次相同的结果而不是再新插入一条数据。关于重复写入数据的问题我采用的最简单的方式就是写入之前先去库里面查一次,如果存在就直接返回,无需继续插入数据。(当然还有更多优化的方式)
    同时,也可以使用一些API网关工具如Eolinker配合保护。

    使用地址:www.eolinker.com

  • 相关阅读:
    pytest05-参数化
    pytest04-conftest配置文件
    pytest03-fixture
    pytest02-setup和teardown
    SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static ,必须加锁,或者使用 DateUtils 工具类
    线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式
    线程资源最好通过线程池提供
    获取单例对象需要保证线程安全,其中的方法也要保证线程安全
    高度注意 Map 类集合 K / V 能不能存储 null 值的情况,如下表格
    使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历的好处
  • 原文地址:https://www.cnblogs.com/dc20181010/p/14705727.html
Copyright © 2011-2022 走看看