本文中讨论了API安全性和采用安全措施的重要性,如身份验证,API密钥,访问控制和输入验证。

API设计的第一步是撰写接口文档

根据TechTarget(海外IT专业媒体)的定义,RESTful API是一个应用程序接口,它使用HTTP请求来获取GET,PUT,POST和DELETE等数据。从技术层面上看,RESTful API(也称为RESTful Web服务)是一种基于代表性状态转移(REST)技术,这是一种通常用于Web服务开发的架构风格和通信方法。

但随着 RESTful API 应用范围的爆炸性扩大,安全性越来越成为API架构设计中最容易被忽视的部分。

为什么API安全性很重要?

在设计和部署RESTful API时,有以下三个核心原因可以解释为什么安全性应该是一个很重要的考虑因素。

▼1.数据保护

RESTful API是一种向外界传输价值的服务方式。因此,保护通过RESTful方式提供的数据始终应该是属于高优先级。

▼2.DOS攻击

如果不采取正确的安全措施,(DOS)攻击可以使RESTful API进入非功能状态。考虑到很多基础的RESTful API是开放给所有人使用的情况,通过这种类似开源的方式有助于它更好推广给市场,让更多人投入使用,但同时意味着如果有人选择对API执行DOS攻击时,它也可能导致灾难性的结果。

▼3.商业影响

如今有越来多的服务平台,提供着影响衣食住行的各种信息,从飞机航班时刻表到高铁余票查询,甚至只是超市里日常用品,都能给你提供价格、数量、时间等诸多信息,让你足不出户,买到最合心意的商品。在这样的大趋势下,这种利用API数据来获取更多信息,再提供给你的聚合服务平台将会越来越多。于是通过RESTful API传输的信息会被频繁调用,而其中的个人信息很容易被泄露。

保障安全采用的措施

以下介绍一些RESTful API通用设计中的关键概念。

▼1.会话管理和认证

除了使用TLS / HTTPS之外,最重要的RESTful API安全级别是以会话管理和身份验证为中心的。在本文讨论中重点将放在API密钥,OpenID Connect / OAuth2 / SAML和会话状态事项上。

▼2.API密钥

API密钥的概念是为使用者提供了作为其HTTP请求的一部分的唯一字符串(密钥)。虽然不是一个完整的安全解决方案,但与匿名使用相比,使用API密钥可以更清楚地了解谁在使用API。

API密钥也可用于提供附加服务。例如,对于RESTfulAPI,附加的服务可以选择使用不同的级别。以一般、高、最高三个等级为例,在“一般”的级别,用户可以自由访问,但只能访问一组有限的数据。假如要访问更多组的数据,那就必须支付费用才能访问“高”的级别,以此类推,不受限制的访问所有的数据则要支付“最高”等级的费用,通过提供不同API密钥的方式,提供额外的服务。

使用API密钥的最常用的方式是将它们包含在请求头中。

例如,当调用某个小部件的头部时,67A73DD1BD1D90210BA的API设置为HTTP头部中的X-API-KEY键/值对:

curl-H“X-API-键:67A73DD1BD1D90210BA”

API密钥的另一个常见用法是将该密钥包含在URI中:

https://www.example.com/v1/widgets?api_key= 67a73dde1bdd1d90210ba

但这种方法的问题在于,API密钥在浏览器历史记录和对应服务器的日志中都会显示出来,意味着向所有有权访问这些数据的人公开唯一密钥。

▼3.OpenID Connect,OAuth2和SAML

OpenID Connect,OAuth2和SAML使用HTTP协议作为传输,用于安全目的。身份验证提供个人的验证,同时授权执行或撤消访问的任务。

从身份验证角度来看,存在以下选项:

  1. OpenID Connect:可以利用现有的身份提供商(如Google或Facebook)获取用于验证用户授权的令牌。
  2. OAuth2:可以通过授权执行伪认证(如下所述)。
  3. SAML:使用断言、协议、绑定和配置文件来管理身份验证,包括标识提供者,但不太适合移动应用程序验证。

为提供授权服务,采用以下策略:

  • OAuth2:提供安全的委托访问,通过允许第三方身份提供程序颁发令牌来代表用户执行操作。由于OAuth2必须了解被委派的用户,因此身份验证是以伪方式实现的(如上所述)。
  • SAML:对可信服务执行断言,包括提供授权的令牌。

▼4.会话状态事项

RESTful API端点应始终保持无状态会话状态,这意味着会话的所有内容都必须保存在客户端。来自客户端的每个请求都必须包含服务器理解请求所必需的所有信息。为了简化流程,包括API令牌以及会话令牌,作为每个业务中都需要的一部分。

▼5.访问控制

如上所述,对RESTful服务的授权可以将安全性引入到所提供的端点中,以便对那些可以向API发出HTTP删除请求的人有限制。

在下面的简单Java示例中,只有Admin和Manager角色(即组)的成员可以执行删除所有用户的DELETE请求,但是所有用户都可以执行GET请求以获取用户列表:

▼6.速率限制

如上所述,API密钥是判断RESTful API的使用者身份级别一种很有用的策略。除了提供等级识别外,使用API密钥的另一个好处是能够限制API的使用,例子像Tibco Mashery、MuleSoft和Dell Boomi等API管理解决方案允许限制API请求,利用API密钥实现此功能。因此,试图执行DoS攻击(有意或无意)的时候将会达到一个设定的阈值,到达阈值后后续所有的请求都将被拒绝。

▼7.输入验证和HTTP返回代码

在保护RESTful API时,应始终考虑对输入进行验证。例如,如果用户试图发布与地址相关的JSON数据集合,则RESTful端点内的服务应验证数据并使用HTTP返回代码来反映正确的状态。在下面简化的Java示例中,就是调用一个非常基本的AdvSersService来验证和保存地址:

在上面的示例中,使用isValidAddress()方法验证newAddress对象(从JSON编组到Address Java对象)。如果地址无效,则向用户返回HTTP 401(错误请求)代码,文本显示为“提供的地址无效。” 如果认为该地址有效,则convertAddress()将执行必要的操作,然后将包含地址内容的JSON格式的字符串返回给用户,以及一个HTTP 201(创建)返回代码。

结论

保护RESTful API的安全应该始终处于API设计工作中最先被考虑的部分。如果不保护敏感数据,允许DOS攻击以及不考虑使用RESTful API的影响,那么即使它只是短暂的影响,相关的风险可能很容易使企业处于不利地位。

授权和身份验证可以为RESTful API提供必要的安全性,实现API密钥策略可以有效的用最低成本保护RESTful API的安全。对输入内容进行验证始终应该是RESTful API的一部分,因为无法保证API后续是否会进行任何必要的验证,同时返回到客户端的结果应该符合预设中HTTP返回代码,而不仅仅只是状态码显示的成功(200)或者错误(404)。

除了API的安全性需要被保护,时刻掌握API运行中的动态也是很重要的事情。最近发掘了一个新的工具:EOLINKER,他们本身是做API研发管理服务,因工作原因最近一直使用他们的另一个产品:API监控,最大的改变就是能随时查看接口是否报错,报错时可以查看错误的地方,对比之前效率搞了不少,对API管理、监控等方面有兴趣的小伙伴自行了解下哦!https://www.eolinker.com

你使用过RESTful API吗?又对RESTful API安全性有什么看法?欢迎在下方留言一起讨论哦。

原标题:RESTful API Security

作者:John Vester

翻译和修改:EOLINKER

原文地址:https://dzone.com/articles/restful-api-security

分析RESTful API安全性及如何采取保护措施的更多相关文章

  1. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展

    1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...

  2. RESTful Api 身份认证安全性设计

    REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...

  3. RESTful Api 身份认证中的安全性设计探讨

    REST 是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 ...

  4. nova创建虚拟机源码分析系列之一 restful api

    开始学习openstack源码,源码文件多,分支不少.按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程.从这一条线入手,能够贯穿openstack核心服务.写博文仅做学习 ...

  5. SpringBoot实现JWT保护前后端分离RESTful API

    通常情况下, 将api直接暴露出来是非常危险的. 每一个api呼叫, 用户都应该附上额外的信息, 以供我们认证和授权. 而JWT是一种既能满足这样需求, 而又简单安全便捷的方法. 前端login获取J ...

  6. CI中如何保护RESTful API

    步骤5 保护RESTful API 为了保护RESTful API,可以在application/config/rest.php中设置安全保护级别,如下所示: $config['rest_auth'] ...

  7. 如何设计好的RESTful API之安全性

    保证RESTful API的安全性,主要包括三大方面: a) 对客户端做身份认证 b) 对敏感的数据做加密,并且防止篡改 c) 身份认证之后的授权 1.对客户端做身份认证,有几种常见的做法: 1)在请 ...

  8. Yii2 Restful API 原理分析

    Yii2 有个很重要的特性是对 Restful API的默认支持, 通过短短的几个配置就可以实现简单的对现有Model的RESTful API 参考另一篇文章: http://www.cnblogs. ...

  9. API网关在API安全性中的作用

    从单一应用程序切换到微服务时,客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同.简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同. 目前在使用微服务时,客户端必须处理微服务 ...

随机推荐

  1. Scala Control Structures

    Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Struc ...

  2. 写在使用 Linux 工作一年后

    start 去年公司空了几台台式机,当时看了下似乎配置比我用的乞丐版 air 略高一些,而且除了 ssd 以外还有一个 1T 的大硬盘,加上后面可能会有一段时间不做 iOS 了,那就不需要 macOS ...

  3. spring应用实例

    新建一个登陆页面:loginActionSupport.jsp,代码例如以下   <%@page contentType="text/html;charset=GBK" is ...

  4. WolframAlpha 的使用

    WolframAlpha 1. 求解复杂方程组 a+b=−4ab+c=2ac=1 直接点开网站,在输入框中输入,a+b=-4;ab+c=2;ac=1;(逗号分割开来),

  5. WPF中的可视化对象(Visual)

    原文:WPF中的可视化对象(Visual) 这是MSDN对Visual的解释:Visual class:Provides rendering support in WPF, which include ...

  6. 去除WPF中3D图形的锯齿

    原文:去除WPF中3D图形的锯齿 理论上讲PC在计算3D图形的时候是无法避免不出现锯齿的,因为3D图形都是又若干个三角形组成,如果3D图形想平滑就必须建立多个三角形,你可以想象一下正5边形和正100边 ...

  7. OpenGL(二十) glutSpecialFunc响应键盘方向控制键

    OpenGL的glut中使用glutMouseFunc函数注册鼠标响应事件,使用glutKeyboardFunc函数注册键盘响应事件,对键盘上特殊的4个方向按键的响应函数是glutSpecialFun ...

  8. 关于 Facebook 的 React 专利许可证

    本文转载自:酷 壳 – CoolShell 作者:陈皓 随着 Apache.百度.Wordpress 都在和 Facebook 的 React.js 以及其专利许可证划清界限,似乎大家又在讨论 Fac ...

  9. 如何完全备份android在系统system分区和data分

    安德鲁斯系统备份是非常的情况下,可以使用.下面的这个python脚本.它可以用来备份整个data分:所有data分区的文件和文件夹打包data.zip.并产生recovery专用edify脚本upda ...

  10. Poco vs Boost(Poco也有不少优点,特别是网络功能更强)

    POCO的优点: 1) 比boost更好的线程库,特别是一个活动的方法的实现,并且还可设置线程的优先级. 2) 比 boost:asio更全面的网络库.但是boost:asio也是一个非常好的网络库. ...