当前位置: 首页 > 后端技术 > PHP

分析RESTfulAPI安全性以及如何采取保护措施

时间:2023-03-29 21:38:01 PHP

在本文中,讨论了API安全性以及采用身份验证、API密钥、访问控制和输入验证等安全措施的重要性。API设计的第一步是编写接口文档根据TechTarget(国外IT专业媒体)的定义,RESTfulAPI是一种应用程序接口,通过HTTP请求获取GET、PUT、POST、DELETE等数据。在技??术层面上,RESTfulAPI(也称为RESTfulWeb服务)基于表述性状态传输(REST),这是Web服务开发中常用的一种架构风格和通信方法。然而,随着RESTfulAPI应用范围的爆炸性扩大,安全性越来越成为API架构设计中最容易被忽视的部分。为什么API安全很重要?以下是在设计和部署RESTfulAPI时安全性应作为重要考虑因素的三个核心原因。1.数据保护RESTfulAPI是一种向外界传递价值的服务方式。因此,保护??通过RESTful方式提供的数据应该始终是重中之重。2.DOS攻击如果不采取正确的安全措施,(DOS)攻击可以使RESTfulAPI进入非功能状态。考虑到很多基础的RESTfulAPI都是开放给大家使用的,这种开源的方式有助于它更好的推向市场,投入更多人的使用,但是也意味着如果有人选择实现API的话当发生DOS攻击时,也会导致灾难性的后果。3.业务影响如今,越来越多的服务平台提供影响衣食住行的各种信息,从航班时刻表到高铁余票查询,甚至超市的生活用品。他们可以为您提供价格、数量、时间等诸多信息,让您足不出户就能买到最心仪的产品。在这样的大趋势下,将会有越来越多的聚合服务平台利用API数据获取更多的信息,然后提供给您。因此,通过RESTfulAPI传输的信息会被频繁调用,其中的个人信息很容易泄露。安全保障措施下面介绍RESTfulAPI总体设计中的一些关键概念。1.会话管理和身份验证除了使用TLS/HTTPS之外,RESTfulAPI最重要的安全级别是围绕会话管理和身份验证。在此讨论中,重点将放在API密钥、OpenIDConnect/OAuth2/SAML和会话状态问题上。2.API密钥API密钥的概念是为消费者提供一个唯一的字符串(密钥)作为其HTTP请求的一部分。虽然不是完整的安全解决方案,但与匿名使用相比,使用API密钥可以更清楚地了解谁在使用API。API密钥也可用于提供附加服务。例如,使用RESTfulAPI,附加服务可以选择使用不同的级别。以普通、高级、最高级别为例。在“通用”级别,用户可以自由访问,但只能访问有限的一组数据。如果要访问更多组数据,则需要付费才能访问“高”级别,以此类推,对于无限制访问所有数据,则必须为“最高”级别付费,通过提供不同的API密钥方式提供额外的服务。使用API密钥的最常见方法是将它们包含在请求标头中。例如,当调用小部件的标头时,67A73DD1BD1D90210BA的API被设置为HTTP标头中的X-API-KEY键/值对:curl-H"X-API-Key:67A73DD1BD1D90210BA"APIKey一个常见的用法是在URI中包含密钥:https://www.example.com/v1/wi...67a73dde1bdd1d90210ba但这种方法的问题是API密钥在浏览器历史记录和相应服务器的历史记录中不可用它将是显示在日志中,这意味着唯一密钥已公开给有权访问此数据的每个人。3.OpenIDConnect、OAuth2和SAML出于安全目的,OpenIDConnect、OAuth2和SAML使用HTTP协议作为传输。身份验证在授权任务执行或撤销访问时提供对个人的验证。从身份验证的角度来看,存在以下选项:OpenIDConnect:可以利用现有的身份提供者(例如Google或Facebook)来获取用于验证用户授权的令牌。OAuth2:可以通过授权进行假认证(如下所述)。SAML:使用断言、协议、绑定和配置文件(包括身份提供者)管理身份验证,但不太适合移动应用程序身份验证。为了提供授权服务,采用了以下策略:OAuth2:通过允许第三方身份提供者颁发令牌以代表用户执行操作来提供安全的委托访问。由于OAuth2必须知道委托用户,因此身份验证以虚假方式实现(如上所述)。SAML:针对可信服务执行断言,包括提供授权令牌。4.会话状态问题RESTfulAPI端点应该始终保持无状态会话状态,这意味着会话的所有内容都必须保存在客户端。来自客户端的每个请求都必须包含服务器理解请求所需的所有信息。为了简化流程,将API令牌和会话令牌作为每个业务的必需部分包括在内。5.访问控制如上所述,对RESTful服务的授权可以为提供的端点引入安全性,从而限制谁可以向API发出HTTP删除请求。在下面的简单Java示例中,只有Admin和Manager角色(即组)的成员可以执行DELETE请求以删除所有用户,但所有用户都可以执行GET请求以获取用户列表:6.RateLimitingAs如上所述,APISecrets是判断RESTfulAPI用户身份级别的有用策略。除了提供级别标识外,使用API密钥的另一个好处是能够限制API的使用。例如,TibcoMashery、MuleSoft、DellBoomi等API管理解决方案允许对API请求进行限制,并使用API密钥来实现此功能。因此,执行DoS攻击(有意或无意)的尝试将达到设定的阈值,之后所有后续请求都将被拒绝。7.输入验证和HTTP返回代码在保护RESTfulAPI时,应始终考虑输入验证。例如,如果用户尝试发布与地址相关的JSON数据集合,则RESTful端点内的服务应验证数据并使用HTTP返回代码来反映正确的状态。在下面的简化Java示例中,调用了一个非常基本的AdvSersService来验证和保存地址:在上面的示例中,使用isValidAddress()方法验证了newAddress对象(从JSON编组到AddressJava对象)。如果地址无效,将向用户返回HTTP401(错误请求)代码,并显示文本“提供的地址无效”。如果地址被认为是有效的,convertAddress()将执行必要的操作,然后将地址内容以JSON格式返回给用户一个字符串,以及一个HTTP201(已创建)返回码。结论保护RESTfulAPI应该始终处于API设计工作的最前沿。如果不保护敏感数据,允许DOS攻击,不考虑使用RESTfulAPI的影响,相关风险很容易对企业不利,即使这只是短暂的影响。授权和鉴权可以为RESTfulAPI提供必要的安全保障,API密钥策略的实施可以以最低的成本有效保护RESTfulAPI的安全。输入内容的验证应该始终是RESTfulAPI的一部分,因为不能保证API将来会执行任何必要的验证,返回给客户端的结果应该符合默认的HTTP返回码,而不仅仅是成功由状态代码(200)或错误(404)显示。除了需要保护API的安全性之外,及时了解API运行的动态也很重要。最近发现了一个新工具:EOLINKER,他们是做API研发管理服务的,最近因为工作原因一直在用他们的另一个产品:API监控,最大的变化就是可以随时查看接口是否报错,而且报错的时候可以查看错误,相比之前的地方,效率高了很多。对API管理、监控等方面感兴趣的可以自行了解!https://www.eolinker.com你用过RESTfulAPI吗?您如何看待RESTfulAPI的安全性?欢迎在下方留言一起讨论。原标题:RESTfulAPISecurity作者:JohnVester参考原文地址:https://dzone.com/articles/re...