zoukankan      html  css  js  c++  java
  • api的安全问题

     

    在给第三方系统提供api时,我们需要注意下安全问题。

    比较常见的接口有http接口。以http接口为例。我们需要注意的几点:

    1.只有被允许的系统才可以调用api

    2.如果http请求被截获。也不能随便修改接口中的参数。

     

    在运维方面,可以添加访问白名单。白名单中有一系列的ip地址。只有白名单中的ip才可以访问api。但是这样会给运维造成麻烦。比如应用的ip可能会变化。

    下面说下一种比较容易实现的api安全方案吧。

    比如要让a系统访问我们的api接口。可以给a系统分配一个appName和一个appKey。

    如:appName=app1.appKey是一个guid。

    应用a调用我们的接口时,在参数中,除了接口必须的业务上的参数外,还需要提供一个appName参数,一个secretKey参数。appName就是分配的app1.secretKey是一种根据业务参数,appKey,由某种算法得出的值。

     

    比如:得到appSecret的算法可以是:

    业务参数+appName+appKey,再进行md5加密等。

    http://localhost:8080/api/addUser?id=123&name=leo&password=hello1234&usertype=2

    业务参数就是“id=123&name=leo&password=hello1234&usertype=2”

    +appName=“id=123&name=leo&password=hello1234&usertype=2&appName=app1”

    将上面的值+appKey,再进行md5加密等。

    最终的url请求大致如下:

    http://localhost:8080/api/addUser?id=123&name=leo&password=hello1234&usertype=2&appname=app1&appsecret=546rtf564thft456fth56jh54tfg5454gfhgf

    服务端收到请求后,

    根据appname,找到对应的appKey。

    再根据算法,“addUser?id=123&name=leo&password=hello1234&usertype=2&appname=app1”+appKey,再进行md5加密,如果得到的=appsecret=546rtf564thft456fth56jh54tfg5454gfhgf

    表明,该请求时被授权的。

    只要a系统不将appName和appKey全部泄漏,别的系统就不能调用我们的api。

    如果上面的url被截获了。那么第三方系统就可以发出这个请求了。因为他已经知道了url了,虽然他不知道我们的appkey。但是如果他想修改接口中的参数是不可以的。一旦,他修改了参数,appsecret就不对了,因为不知道appkey,在修改了参数后,也不知道对应的appsecret。

    那,如果攻击者一直调用上面被截获的接口怎么办呢?很简单,在url中再添加一个当前时间戳。

    即:appsecret变成:业务参数+appname+当前时间戳,在md5加密。

    服务端接受到请求后,获得时间戳。如果时间戳和当前时间相隔很小,该请求时有效的。不然是无效的。

    如果攻击者修改时间戳怎么办?如果修改了时间戳,appsecret就不对了。

    所以,该方案的前提是应用的appName和appsecret不能全部泄漏。appname可能会泄漏。但是appkey决不能泄漏。

  • 相关阅读:
    【Loj146】DFS序3-树链剖分
    【BZOJ3083】遥远的国度- 树剖-换根
    树链剖分-树剖换根
    c++ 随机生成树
    【HAOI2015】树上操作-树链剖分
    centos修改dns
    HttpClient
    aiax跨域问题
    伪静态
    springboot父子项目
  • 原文地址:https://www.cnblogs.com/leiwei/p/3644093.html
Copyright © 2011-2022 走看看