如何设计出安全的接口项目

 

接口安全略谈

一、铺垫

    在平时工作中,我们经常会用到接口,当然这里说的并不是 Interface 这个鬼东西;而是以项目方式向外提供的接口,接口的好处就是将整个系统解耦,包括现在的SOA架构,都是一种面向接口(当然也面向服务)的编程。接下来咱就简单介绍介绍,一个安全的接口项目需要考虑哪些方面。
                                                                   

二、常见的几种攻击

    1. 伪装攻击:一般会伪装成接口信任的 IP 去访问服务器,但是这种攻击除了会对服务器产生少许(应为伪装的 IP 有限)压力外不会有太大影响,就像你淘宝购物,你填写错误的收货地址是没办法得到你想购买的物品的,同理,你伪造了IP后你是得不到服务器返回的真实数据的。(暂且我是这么理解的
 
    2. 篡改攻击:例如我们使用HTTP传输,很容易就会被某些第三方工具抓包,抓到后,可以随意的修改传输的数据 [ 请求内容、请求头 ],完后再向服务器请求,从而起到攻击的效果。举个糖栗子:用户A在某宝上购物,提交订单时需要输入地址,再点击提交,这时 黑客B 抓包抓到用户A向某宝服务器的请求数据,黑客B将收获地址改为自己的收货地址。用户A没有发现这些,付款成功,购买的好东东就落到了黑客B的手里。当然这纯属我自己YY,你也可以想象到更好玩的场景,没错,是更好玩
    
    3. 请求重放:请求重放攻击类似于WEB的重复表单提交,接口的访问者使用同样的消息体不断的访问接口提供者的过程,从而导致接口提供者服务器故障,丢包甚至宕机等等。
 
                                                           
                
 
    4. 数据信息泄露:和篡改攻击差不多,就是截获你的请求,抓你的包,一些重要的信息,比如密码了、银行卡账号了....额,我是不敢想了
 
    5. 等等....
 

三、如何防御

    从上面我们可以看出,设计一个接口,被攻击的方式多种多样,在这些攻击面前我们的接口看似一只脆弱的羔羊,我们真的就素手无策了么,并没有;针对以上攻击我们可以列举以下防御措施
 
    1. 伪装攻击,我觉的可以忽略,或许我还真没有见识过这玩意儿厉害的时候,你如果你见识过,那请告诉我。
 
    2. 篡改攻击,这得防着点,这是黑客攻击站点或接口的常用武器。如何防止呢,采取加密技术,常见的加密有:1. DES加密  2. MD5签名 3. RSA签名 ,具体环境采用不同的加密签名,在一定程度上可以防止数据在传输的过程中被篡改。
 
    3. 请求重放,这种攻击,看一般的接口项目都会有个Token,没错这玩意就是防止请求重放的,这是其中一种防御措施,还有:
            ⑴ 请求方每次从提供方申请一个唯一的TID(或者就叫Token)
                    工作过程:请求方申请TID,再次向服务器请求时携带此TID,提供方对TID进行授权及校验,通过则继续。
            ⑵ 由请求方生成唯一的TID 如使用 UUID 生成方法
                    工作过程:提供方判断UUID是否使用过,没有使用过则判断可以继续,否则中断处理,这种方法看似简单,唯一考验是服务提供方如何保存如此多的UUID是一个挑战。
            我们可以考虑服务端,只保存1小时内请求过的UUID,这样同一个请求1小时之内是不允许访问第二次的。
            ⑶ 申请秘钥KEY并加上唯一的Sequence解决
                    工作过程:请求方的每台服务器甚至每个进程分发一个唯一的ClientCode,请求方向服务提供方申请一个KEY,服务方保留ClientCode、KEY的对应关系,并默认ClientSeq=1,请求方访问接口的头中增加AuthCode=AES(ClientCode+ClientSeq,KEY)和ClientCode俩个HttpHeader,服务提供方收到请求后,根据ClientCode找到服务器存储的ClientCode、Key和ServerSeq组合,使用Key对AuthCode解密,比对ClientSeq=ServerSeq+1,如满足则校验成功,否则中断。
     
     4. 针对第四种数据信息泄露,将站点的访问升级到 HTTPS就可以了,如想了解HTTPS请看这里 Http 和 Https 简单介绍
 

四、总结

    我们总结一下,如何设计出安全的接口呢,首先我们的使用证书,让所有请求都基于HTTPS;设计IP访问白名单,只允许新人的IP访问;再者,对请求的数据做签名算法,防止请求的数据中间被篡改;如果再严一点,不允许同一个请求多次访问的话,客户端每次请求加唯一码,服务端记录唯一码,这样看来接口基本安全了。

 

 
 
 
 
 
 
posted @ 2019-05-01 07:10  NCat  阅读(297)  评论(0)    收藏  举报