打造 API 接口的堡垒

news2024/11/16 12:07:31

前言

伴随互联网革命快速创新发展,API 需求的日益剧增,针对 API 的攻击几乎遍布各个行业,据报道 2022 年全年平均每月遭受攻击的 API 数量超过 21 万,游戏、社交、电商、制造等行业依然是攻击者主要目标。例如社交软件某特,在 2021 年发生数据泄露事件,此次数据泄露影响了多达 540 万用户,产生这场“惨案” 正是攻击者利用了登录 API 端点,产生这一漏洞的原因很可能是 API 过度数据暴露以及安全配置错误(下面我会讲到)。显然无论是 API 攻击整体趋势还是对企业和用户的影响都是不容乐观的。那如何去搭建 API 接口的安全“堡垒”?下面我们将展开探讨。

开始前我们可以先了解下:什么是 API?深入了解 API 的概念和应用

API 接口安全问题

API 攻击事件频发,其根本原因仍是 API 存在安全缺陷,随着 API 在各个生态的快速发展,API 面临的安全缺陷也逐渐凸显,也引起了决策者重视,API 的安全困局也成为了现代IT面临的一个共性问题。下面我举例几个我曾经在开发中常遇到的 API 安全问题 :

未授权访问

这类安全问题会带来极为严重的漏洞,因此小编在开发中尤为重视,API 倾向于暴露那些处理对象识别的端点,同时造成了广泛的攻击表层访问控制问题。一旦遭到攻击,攻击者可轻易获取到管理员的账号密码,并拿到系统的最高权限。大家可以通过白名单的方式来严格控制无需授权的 API 接口的访问;除非资源完全对外开放,否则访问默认都要授权,尤其是访问用户的资源或者受限制资源。

数据泄露过多

为了做到通用实现,一些伙伴往往倾向于公开所有对象属性,不考虑它们各自的敏感性,而是依赖于客户端执行数据过滤,然后再将其显示给用户。在不控制客户端状态的情况下,服务器就会接收越来越多的过滤器,攻击者可能会通过滥用这些过滤器,从而获得访问敏感数据的权限。某特引发数据泄露的一大原因,便是因为 API 端点返回了电子邮件或电话号码等可识别数据。

安全性配置错误

安全配置错误是在日常开发中容易忽略的常见问题,不安全的默认配置、不完整或临时配置、开放的云存储、错误配置的 HTTP 标头,不必要的 HTTP 方法、跨域资源共享(CORS)以及包含敏感信息的冗长错误消息都有可能引起 API 的安全问题。大家一定要注意检测。

注入

当不受信任的数据作为命令或查询的一部分发送到解释器时会发生注入缺陷,例如 SQL、NoSQL 的命令注入等。攻击者的恶意数据可能会诱使解释器执行非预期的命令,或未经授权访问数据。

缺乏资源和速率限制

在 API 的开发中一些小伙伴,不会对客户端/用户可以请求的资源大小或数量施加任何限制。这不仅会影响 API 服务器的性能,从而导致拒绝服务(DoS),而且还为诸如暴力破解之类的身份验证漏洞敞开了大门。我建议还是对资源和速率施加一定的限制,会让我们更有信心保持应用程序健康运行而良好的响应计划。

如何设计并保证 API 接口安全

我相信大家一般不会把大额的钱随身携带。大多数人都会选择把钱存到可信的环境中,在需要支付时采用分开的方式授权和验证支付。API 安全防护与之相似,所以,我们需要一个具有验证和授权策略的可信环境。接下来,我们来聊聊如何去营造这样的一个环境。

Token 方案

大家可以将 Token 形象的理解为“身份证”,由服务端签发与验证,并且在有效期内检测是否具有合法性,根据 Token 具有随机性、不可预测性、时效性、无状态、跨域等特点。Token 在 API 安全中发挥着重要作用,使用 Token 方案的优点是什么?

  • Token 完全由应用管理,所以它可以避开同源策略;
  • Token 性能高、安全性好,可以避免 CSRF 攻击;
  • Token 可以是无状态的,可以在多个服务间共享,解决跨域问题。

Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌

给大家简单叙述一下 Token 的鉴权方式的完整流程,以便于大家更好的理解 Token 在维护 API 安全方面的作用,首先客户端用户通过用户和密码进行首次登录,服务端在接收到用户请求,验证用户名和密码的正确性,登录验证成功后根据自定义规则生成 Token 信息,将生成的 Token 通过响应返回给客户端。

客户端再将 Token 信息存储在本地,在之后的每次请求中携带 Token 信息,服务端针获取请求中的 Token,并根据定义的验证机制判断 Token 合法性,验证成功获取用户信息,保持用户状态,Token 存活时间达到设置的有效期后自动失效,此后用户请求时 Token 验证不通过,就需要用户重新登录验证。

无论是从安全的角度考虑,还是从吊销的角度考虑,Token 都需要设有效期。使用 RefreshToken,它可以避免频繁的读写操作。这种方案中,服务端无需刷新 Token 的过期时间,一旦 Token 过期,就反馈给前端,前端使用 RefreshToken 申请一个全新 Token 继续使用。从而保障信息数据安全。

接口签名

企业在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,请求是否唯一,数据是否可以重复提交等问题。其中数据是否被篡改相对重要。因而数据传输存在着极大的危险,所以必须接口签名,接口签名可以解决什么问题?

❤请求是否合法:是否是我规定的那个人;

❤请求是否被篡改:是否被第三方劫持并篡改参数;

❤防止重复请求(防重放):是否重复请求。

请求携带参数 appid 和 sign,只有拥有合法的身份 appid 和正确的签名 sign 才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到 secret(仅作本地加密使用,不参与网络传输),无法伪造合法的请求。措施依然不是最严谨的,只使用 appid 和 sign,虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。称为重放攻击(replay 攻击),大家可以通过加入 timestamp + nonce 两个参数来控制请求有效性,防止重放攻击。

简单来说一下该方案的签名规则,首先进行线下分配 appid 和 appsecret 针对不同的调用方分配不同的 appid 和appsecret,加入 timestamp (时间戳) 2 分钟内数据有效,再加入流水号 nonce (防止重复提交) 至少 10 位。针对查询接口,流水号只用于日志落地,便于后期日志核查。针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。加入 signature,所有数据的签名信息。其中,需要放在请求头的字段: appid、timestamp、nonce、signature。

讲到这里我想大家对这两大方案有了一定的了解,总的来说 Token+ 签名认证两大方案,去维护 API 安全的主要原理是:

★ 通过认证服务,提供一个认证的 WEBAPI,用户先访问它获取对应的 Token;

★ 用户拿着相应的 Token 以及请求的参数和服务器端提供的签名算法计算出签名后再去访问指定的 API;

★ 服务器端每次接收到请求就获取对应用户的 Token 和请求参数,服务器端再次计算签名和客户端签名做对比,如果验证通过则正常访问相应的 API,验证失败则返回具体的失败信息。

当然仅仅使用 Token+ 签名认证两大“根基”,去全面保障 API 安全也是较为困难的,对于我们来说,为了更好的提高 API 安全性,就需要在设计和开发阶段,对 API 的安全性进行良好的构建和设计,这就需要大家遵守 API 安全开发规范进行实施。接下来讲解一下,在我开发日常中认为较为重要的五大规范。

五大安全规范

能见度

作为一名合格的应用程序开发人员和用户,我们需要知道正在发布哪些 API、如何以及何时更新它们、谁在访问它们以及如何访问它们。大家可以通过 Apifox 这类一体化协助平台提供可视化 API 设计,及时了解用户的 API 使用范围,以确保 API 安全的第一步。

Bot 缓解措施

在某些环境中,大量的应用程序流量,例如,账户登录或注册、购物车结账是由自动化 Bot 生成的。必须了解和管理流量配置文件,包括区分好 Bot 和坏 Bot,防止自动攻击的同时又不会阻止合法流量。有效的补充措施包括实施 Bot 白名单、黑名单和速率限制策略,以及特定于用例和相应 API 端点的地理围栏。

访问控制

API 访问权限通常是不受严格控制的,这可能导致意外暴露。确保向不同用户授予适当的 API 访问权限是一项至关重要的安全要求,访问者必须与企业的身份和访问管理(IAM)系统进行协调。

防止漏洞利用

API 通过消除 Web 表单或移动应用程序来简化攻击过程,从而使攻击者更容易利用目标漏洞。因此,保护 API 端点免遭业务逻辑滥用和其他漏洞利用是关键的 API 安全缓解要求。

数据防泄漏

防止由于编程错误或安全控制漏洞而产生的 API 暴露或非授权访问,是防止数据泄露或丢失的一项至关重要的安全要求。许多 API 攻击都是专门为获取对后端服务器和系统提供的关键数据的访问而设计的。

写在最后

事实上 API 作为应用程序之间,应用与用户之间交互的桥梁,承载着企业的业务逻辑和大量用户数据,一旦由 API 安全漏洞引发攻击事件,其后果注定难以承受。因此,建议企业用户通过引用专业的 API 管理工具产品或解决方案,快速建立起真实、有效的 API 安全“堡垒”,通过一体化协作平台高效,及时,准确补全安全上的缺口。

文章写到这里就告一段落了,希望这篇文章可以帮助大家解决一些 API 开发中产生的问题。高效,及时,准确的完成开发,感谢大家阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cuda优化

希望用GPU解决更大的问题,更多的程序在同等的设备商运行 最大化单个kernel的运算强度, 最小化内存的操作时间 在第一步分析的时候,不要依赖直觉 类似CPU,单个线程处理这个事情,串行 把读取全局内存的地方合并以后…

7.2 文件系统的简单操作

7.2.1 磁盘与目录的容量 磁盘的整体数据是在superblock区块中,但是每个个别文件的容量在inode当中记载的。 df:列出文件系统的整体磁盘使用量; du:评估文件系统的磁盘使用量(常用在推估目录所占容量) d…

Postman是个好用的工具,不试一下?

忘了 postman 是被谁种草的,很长一段时间内 postman 都是我做接口测试的首选工具,之前也有小伙伴跟我安利过 IDEA 中的 RestfulToolkit 插件,但是一直没机会体验,最近抽空玩了一把,感觉在某些场景下还蛮不错的(不需要认…

互联网SaaS产品的账户体系应该如何设计-账户分析

在进行账户体系设计之前,需要先理清产品使用群体、付费群体,这两个统称为用户群体,还需要了解产品的使用场景、产品功能以及产品的商业模式。从产品战略顶层进行SaaS产品的用户体系设计。 我们首先对人的本质和价值进行深入的分析&#xff1b…

你的测试技术这么烂,不学几招怎么跳槽?

最近几年我一直担任着软件测试面试官的角色,正好过年回来,马上就要金三银四求职季了,所以想写点面试的经验分享给大家,希望能对大家有些帮助。碍于才疏学浅,又是理工出身,字里行间未免词不达意,…

ubuntu20.04 使用pip安装配置Pytorch

关于pytorch的安装,我之前其实写过一篇博客:解决问题:import torch失败和torch.cuda.is_available()返回false 但是那是在windows下的,在ubuntu双系统下好像情况有点不一样,但是所幸踩的坑不算多,这里总结如…

2023全云在线联合微软AIGC专场沙龙:人工智能与企业创新,促进创造力的数字化转型

6月29日,由全云在线平台和微软联合主办的人工智能与企业创新:促进创造力的数字化转型——2023AIGC微软专场沙龙在广州天河区正佳万豪酒店举行。 关于2023AIGC微软专场沙龙 GPT翻开了AGI新的一页,也翻开了各行各业的新篇章。 2022年11月30日…

当心僵尸:过时Linux内核的安全风险

导读设备年年新,内核永不换。早该被淘汰的Linux内核版本,依然阴魂不散地扎根在各种各样的设备中,驱动着这些设备如同《行尸走肉》的丧尸游荡在世界各地。 Linux内核安全漏洞是新闻头条常客。最近又有一个隐身十年之久的严重内核漏洞被曝光了…

layer做阻塞式弹出层的方法

今天遇到一个问题:文章来源地址https://www.yii666.com/article/301050.html?actiononAll layer弹出一个confirm提示窗,然后confirm还没有点击对应的按钮的时候,就已经执行了后续代码,我这里做出的判断是,是否需要进行…

vue新特性

vue3 ref、reactive toRefs setup ref reactive 实现了数据响应式,不能使用 ES6 解构,会消除响应特性。所以需要 toRefs 解构,使用时,需要先引入。 let me reactive({single:true,want:"暖的像火炉的暖男" }) //运…

小黑收到阿黄宴请潮汕牛肉火锅,跟淹哥包鹏拉面,明日飞新疆乌鲁木齐地窝堡的leetcode之旅:剑指 Offer II 016. 不含重复字符的最长子字符串

小黑代码&#xff08;与官方题解思路一致&#xff09; class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 字符串长度n len(s)# 定义双指针head 0tail 0# 窗口集合set_ set()# 结果变量result 0while tail < n:# 该字符不在集合里if s[tail] no…

【数据结构】队列——顺序实现+链式实现(带头结点+不带头结点)入队 出队 初始化 判空 双端队列 完整代码

文章目录 四 队列1.基本概念2.队列的顺序存储3.队列的链式实现3.1 定义3.2 带头结点3.2.1 初始化3.2.2 判空3.2.3 入队3.2.4 出队3.2.5 完整代码 3.3 不带头结点3.3.1 初始化3.3.2 入队3.3.3 出队3.3.4 完整代码 4.双端队列 四 队列 1.基本概念 定义 只允许在一端进行插入&…

代理服务器拒绝连接怎么办

在使用代理服务器时&#xff0c;有时我们可能会遇到代理服务器拒绝连接的问题。这种情况可能会阻止我们访问被封锁的内容或绕过地理限制。下面&#xff0c;我们来一起探讨一下。 1. 配置错误 代理服务器拒绝连接的一个常见原因是配置错误。请确保您已正确输入代理服务器的地址和…

64MHz 闪存STM32G0B1CEU6(STM32G0B1CCU6)STM32G0B1CBU6引脚配置图、32位微控制器

STM32G0B1 32位微控制器具有最高512KB嵌入式闪存和144kB RAM存储器。该器件采用48-UFQFPN 引脚封装。它支持USB全速主机/设备、集成USB Type-C控制器和收发器、FDCAN协议以及多达8个UART。 STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用&#xff0c;并可随时…

el-carousel和el-image组合实现swiper左右滑动图片,点击某张图片放大预览的效果

<template><el-carousel class"image-swiper" :height"100%" :indicator-position"swiperItems.length < 1 ? none : ":arrow"swiperItems.length < 1 ? never : "><el-carousel-item v-for"(a, $i) in s…

尚硅谷Docker实战教程-笔记06【Docker容器数据卷】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】尚硅谷Docker实战教程-笔…

移动端H5实现自定义拍照界面

一、实现思路 手机端 H5 实现自定义拍照界面也可以使用 MediaDevices API 和 <video> 标签来实现。 首先&#xff0c;使用 MediaDevices.getUserMedia() 方法获取摄像头媒体流&#xff0c;并将其传递给 <video> 标签进行渲染。 接着&#xff0c;使用 HTML 的 <…

手把手教你搭建SpringCloudAlibaba之Sentinel注解SentinelResource

SpringCloud Alibaba全集文章目录&#xff1a; 零、手把手教你搭建SpringCloudAlibaba项目 一、手把手教你搭建SpringCloud Alibaba之生产者与消费者 二、手把手教你搭建SpringCloudAlibaba之Nacos服务注册中心 三、手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心 …

【智慧交通项目实战】《 OCR车牌检测与识别》(四):基于Pyqt的项目可视化

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。✨公众号&#xff1a;GoAI的学习小屋 &#xff0c;免费分享书籍、简历、导图等&#xf…

SpringBoot 限流方案

一、背景 限流对于一个微服务架构系统来说具有非常重要的意义&#xff0c;否则其中的某个微服务将成为整个系统隐藏的雪崩因素&#xff0c;为什么这么说&#xff1f; 举例来讲&#xff0c;某个SAAS平台有100多个微服务应用&#xff0c;但是作为底层的某个或某几个应用来说&…