API 安全最佳实践,不要等出事后“捶胸顿足”

译者 | HelloGitHub-小鱼干、鸭鸭

来源 | HelloGitHub(ID:GitHub520)

头图 |  CSDN 下载自东方IC

原文地址:API Security Best Practices[1]

原文作者:Mark Michon

译者 & 校正:HelloGitHub-小鱼干 & HelloGitHub-鸭鸭

虽然本质上 API 就是拿来用的,但即便某个 API 的使用者全是内部人员,它还是可能会出现安全问题。为了解决 API 安全问题,在本文我们收集了一系列 API 的最佳实践,希望你记住这些 Tips 日后在保护 API/Web 服务安全和免受入侵时,会帮助到你。

使用 HTTPS

现在的 Web 已经不是之前那个年代,标准的 HTTP 满足不了 Web 安全需求。而各大浏览器供应商开始标记不使用安全层的 URL,你的 API 也可以考虑开始动手做这件事——用 HTTPS。HTTPS 采用传输层安全性协议(TLS)对传输进行加密。这意味着 HTTPS 对客户端和服务器之间的通信进行加密。对 API 而言,HTTPS 意味着从 API 发送的内容是受第三方保护的,但更重要的是这意味着访问凭证是安全的。

认证

说到访问凭证,避免意外使用 API 的最直接的方法便是确保正确的身份验证。身份验证决定了你是否可访问 API 及如何访问某个 API,即便是对外开放的免费 API 理论上也应当考虑采用身份验证策略以保证安全性。有了身份认证,你可以限制或删除滥用 API 的使用者,让使用者在需要时重新设置凭证,从而保护他们的安全。了解更多有关 API 身份验证的知识可以阅读《三种最常见的认证方法》[2]。

授权

起到和身份验证类似作用的是授权。身份验证和授权的区别在于,身份验证关注的是 API 的使用者是谁,而授权关注的是他们能够访问的内容。举个例子,免费计划用户可能被授权只能访问你所有 API 的某个子集。当你想集成诸如社交登录此类 API 时,用户授权可让应用从社交平台读取他们的配置文件数据。

安全 endpoints 和资源(对象级授权)

一般来说,我们会通过授权来保护 endpoint/endpoints,但更长远来说,我们需要确保单个资源的安全。单个资源的安全可以防止错误配置的 endpoint 级授权访问数据。此外,它还意味着 endpoint 本身不受用户类型的限制,而是由资源控制谁能查看它,谁不能查看它。(控制某个 URL 操作的权限)

限速

一说到安全,我们常会想到不适当的访问。当然,如何处理不适当的访问对管理资源也很有用。限速是一种限制 API 使用的技术。它不仅在经济上保护资源,但也保证了服务器不会因某次大量的请求而超载。大多数限速的方法都基于时间的——一般会设置一个账单周期来处理 API 总体使用情况,也会用“突发”方法来限制大量涌入的请求。如果你看到 429 HTTP 状态代码[3],说明你正在被限速。

验证和净化输入

要攻击 Web 程序最古老的方式之一是输入,即:我们访问数据的方式可能已经改变,但是验证任意用户输入的需要还没有改变。客户端验证有助于防止错误和改善用户体验,但是 API 还需要在对输入执行操作前验证和净化(sanitize)输入——净化策略为删除请求中的恶意或无效代码。验证确保数据满足资源期望的必要条件,例如:类型、形式,甚至是密码结构等因素。

按需公开

采用快捷方式将数据模型直接映射到接口是很诱人,但这不仅会产生冗长的响应、增加带宽使用,而且还会暴露用户不需要访问的数据。举个例子:一个 /user 接口要返回用户信息。它可能只要用户的一些基本信息,而不需要用户的密码/权限。

错误消息的配置

除了对 API 的输入数据进行净化(sanitize)外,还需要对从中产生的信息进行净化。错误消息对用户了解问题的发生至关重要,但要确保不泄漏任何敏感数据。向终端用户提供 API 内部代码结构的详细信息会为攻击者提供便利,所以一定要确保错误信息的配置不仅能提供足够的信息来帮助用户调试,并提供足够的信息让他们报告问题,但又不足以暴露应用程序的内部工作和敏感数据。

不要暴露敏感信息

API 开放要建立在保护敏感数据之上,要确保不要在 JSON Web Token[4] 和缓存中公开细节。JWT(JSON Web Token) body 给人一种很安全的错觉,其实它很容易破译。因此,应该避免 JTW 和缓存中,包含可用于访问应用程序的用户信息。同样的建议也适用于 URL,要确保查询字符串不会暴露敏感数据的细节。

评估依赖

开发过程中我们并不是完全自己编写代码,大多数情况下,代码很大一部分会包含库、中间件和各种来自外部源的依赖关系。虽然一般情况下我们可以认为流行的软件包是经过实战测试的,但即便如此,并不意味着这些依赖完全避免漏洞。因此,要确保你评估过 API 的依赖关系——它们维护得好吗?你使用的是最新版本吗?有什么历史问题?也许最重要的事情是想一下:真的需要一个库来实现你正在做的功能吗?

允许用户跟踪和重置身份验证密钥

提高 API 安全性的另一种方法是允许用户重置他们的凭证并监视使用情况。一个常见的错误是不允许使用者重置他们的 API 密钥。如果 API 使用者意外地公开了他们的密钥,或者恶意获取密钥,那么这个问题现在会直接影响你的 API。相反,为了保证安全,你可以为他们创建一种管理访问的方法。

标准化服务中的认证

我们看到像谷歌、微软和亚马逊这样的 API 巨头都对它们的 API 授权和认证过程进行了标准化。我们不妨考虑一种集中的方法,比如使用 API 网关或专用的入口点来处理身份验证请求。

遵循 OWASP 标准指南

除了这些最佳实践之外,可以考虑采用开放式 Web 应用程序安全项目[5](Open Web Application Security Project,缩写 OWASP)的建议。他们提供了特定平台的指导,以及即将推出的特定 API 的指导——API 安全 Top 10[6]。除了在代码层面保护 API 之外,还需要确保正确配置服务器和基础设施,以避免未经授权的访问。

参考资料

[1] API Security Best Practices: https://dev.to/bearer/api-security-best-practices-3gjl

[2] 《三种最常见的认证方法》: https://blog.bearer.sh/the-three-most-common-api-authentication-methods/

[3] 429 HTTP 状态代码: https://blog.bearer.sh/error-429-too-many-requests-what-to-do-when-youve-been-rate-limited/

[4] JSON Web Token: https://jwt.io/

[5] 开放式 Web 应用程序安全项目: https://owasp.org/

[6] API 安全 Top 10: https://owasp.org/www-project-api-security/

更多精彩推荐
☞独家对话华为王成录:手机 HarmonyOS 开发者 Beta 版将如约而至
☞对话指令集创始人兼CEO潘爱民:面向未来的新型物联网操作系统 | 人物志
☞@程序员,什么才是“2020-1024”的正确打开姿势?

☞最新!百度首发 OCR 自训练平台 EasyDL OCR

☞SQL分页查询方案的性能对比
☞2021年,很可能是以太坊的“高光之年”
点分享点点赞点在看
### Socket编程技术的组成部分及相关内容 Socket 编程是一种用于实现网络通信的技术,其核心在于通过操作系统的系统调用接口完成不同主机之间的数据交换。以下是关于 Socket 编程技术的主要组成部分及其相关内容: #### 1. 基础概念 Socket 是一种抽象的概念,表示应用程序之间的一个连接端点[^1]。它允许程序在不同的计算机之间发送和接收数据流。通常情况下,Socket 被视为一种文件描述符,在 Unix 和类 Unix 系统中尤其如此。 #### 2. 协议支持 进行网络编程时,依赖于底层的操作系统所提供的网络传输协议栈的支持。常见的协议包括 TCP/IP 和 UDP/IP。TCP 提供面向连接的服务,适用于可靠的数据传输;UDP 则是非面向连接的服务,适合实时性和速度优先的应用场景[^2]。 #### 3. 地址结构 为了建立有效的通信链路,Socket 需要指定地址信息。这涉及 IP 地址和端口号两个部分: - **IP 地址**:用来唯一标识一台设备在网络上所处的位置。 - **端口号**:进一步区分同一台机器上的多个服务进程。 #### 4. 创建与初始化 创建一个 socket 对象的过程如下所示: ```python import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 这里 `AF_INET` 表明使用 IPv4 地址族,而 `SOCK_STREAM` 指定采用基于字节流的方式(即 TCP),如果改用 `SOCK_DGRAM` 就会切换到无连接模式下的消息传递方式——也就是 UDP[^2]。 #### 5. 连接管理 服务器端需要监听来自客户端发起的新连接请求,并接受它们形成实际的工作链接; ```python server_socket.bind(('localhost', port)) server_socket.listen(backlog) client_conn, client_addr = server_socket.accept() ``` 与此同时,客户端也需要主动向目标服务器发握手信号以求建立关联通道: ```python client_socket.connect((host, port)) ``` #### 6. 数据交互 一旦建立了可靠的双向通讯管道之后就可以自由地收发任意长度的消息包体了。读取远程节点传来的最新一批有效载荷可以这样写: ```python data_received = sock.recv(buffer_size) ``` 相对应地把本地缓冲区里的待处理材料推送去则需执行下面这条语句: ```python bytes_sent = sock.send(data_to_send) ``` #### 7. 错误处理机制 考虑到可能现的各种异常状况比如超时、断线等情况都应当提前做好预案措施加以防范规避风险隐患。例如设置合理的等待时限参数或者捕获特定类型的例外事件等等[^3]。 #### 加密功能扩展 除了基本的功能之外还可以引入额外的安全防护手段诸如 DES 对称算法之类的工具来保护敏感信息安全不被窃听篡改泄露等问题困扰。当涉及到此类需求的时候记得先确认输入源是否已经是经过适当编码后的二进制序列再继续后续步骤以免发生兼容性冲突矛盾现象产生不必要的麻烦障碍阻碍正常流程运转效率降低用户体验满意度下降等诸多不良后果影响整体项目质量水平提升难度加大成本增加收益减少回报率变低等一系列连锁反应效应现最终导致失败告终局面难以挽回损失惨重后悔莫及追悔不及欲哭无泪痛心疾首捶胸顿足咬牙切齿愤恨不已怒火冲天满腔热血瞬间冷却变成冰水混合物冻结成固体状态再也无法流动起来恢复活力生机勃勃充满希望憧憬未来美好前景无限广阔天地任鸟飞鱼跃万物欣欣向荣繁荣昌盛国泰民安天下太平盛世再现辉煌成就永垂青史名留千古万代敬仰崇拜膜拜效仿学习传承发扬光大继往开来开拓进取不断创新突破自我超越极限挑战巅峰追求卓越勇攀高峰登顶珠穆朗玛峰俯瞰世界一览众山小豪情壮志满怀信心十足坚定不移奋勇向前永不言弃直至胜利属于我们为止!!! ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值