如何保证开放到互联网上的API不被非法调用

一旦API服务开放到互联网上,服务提供方就开始担心如何保证API调用方是特定的一方,而不是被其他方非法使用。最简单直接的方法可能就是限制请求来源的IP地址,过滤非法IP就好。

对于前后台分离的网站程序这种限制IP的方法并不适用,请求来自众多客户端浏览器。这种情况下可以采用防盗链的原理(https://www.jianshu.com/p/0a1338db6cab),校验HTTP请求头中的Referer字段值,比如限制请求是来自网站 https://www.democlient.com,假如网站没有启用SSL证书,只能提供 http://www.democlient.com(不是https)其实是很容易被人冒充的(windows/system32/driveers/etc /hosts,将hosts文件改为对应的域名和本机ip即可实现)。

保证API调用方是特定的一方还有一种比较通用的方法就是API签名。 调用方生成一对密钥,私钥用来签名,公钥用来校验签名。调用方将公钥提交给API提供方,私钥自己保留。在调用API的时候,在参数中增加时间戳、调用方的代号,然后对这两个参数进行私钥签名,API服务端接收到调用后也能获得签名,采用公钥校验签名,校验通过说明调用合法。下面是一个简单例子用来说明这个过程。

  • 初始请求
    http://api.test.com/test?id=123
  • 增加部分参数 timestamp 时间戳,party调用方ID
    http://api.test.com/test?id=123×tamp=1534141156&party=panda
  • 提出需要签名的字符串
    stringSignTemp="timestamp=1534141156&party=panda"
  • 对字符串进行签名
    sign=sign(stringSignTemp);
  • 最终的请求
    http://api.test.com/test?id=123×tamp=12312341234&party=panda&sign=dGhpcyBpcyBhIGV4YW1wbGU=

你可能感兴趣的:(如何保证开放到互联网上的API不被非法调用)