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

1、使用 HTTPS

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

2、认证

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

3、授权

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

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

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

5、限速

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

6、验证和净化输入

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

7、按需公开

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

8、错误消息的配置

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

9、不要暴露敏感信息

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

10、评估依赖

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

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

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

12、标准化服务中的认证

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

遵循 OWASP 标准指南

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

api 另一窗体 之上_12 个设计 API 的安全建议,不要等出事儿了“捶胸顿足”相关推荐

  1. 如何设计API返回码(错误码)?

    前言 客户端请求API,通常需要通过返回码来判断API返回的结果是否符合预期,以及该如何处理返回的内容等. 相信很多同学都吃过返回码定义混乱的亏,有的API用返回码是int类型,有的是string类型 ...

  2. C#-WinForm-无边框窗体的移动和阴影-API

    //窗体移动API,先导入命名空间,在委托MouseDown事件 //移动前准备 [DllImport("user32.dll")] public static extern bo ...

  3. mysql标准化存储结构_Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql...

    Atitit.自定义存储引擎的接口设计api标准化attilax总结mysql 1.图16.1:MySQL体系结构 存储引擎负责管理数据存储,以及MySQL的索引管理.通过定义的API,MySQL服务 ...

  4. 使窗体拥有透明效果的API

    一.背景FlashGet的透明效果大家羡慕吧.传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAt ...

  5. Golang Web入门(4):如何设计API

    Golang Web入门(4):如何设计API 摘要 在之前的几篇文章中,我们从如何实现最简单的HTTP服务器,到如何对路由进行改进,到如何增加中间件.总的来讲,我们已经把Web服务器相关的内容大概梳 ...

  6. 软件需求文档范例_【设计API系列】 一文了解常见的事件驱动APIs范例

    最近几年, 很多种API范例涌现出来,目前比较流行的标准如REST, RPC, GraphQL, WebHooks 以及WebSockets等.但是大家大家真的对每一种都很了解吗?什么场景下适合用哪种 ...

  7. 用产品思维设计API(三)——版本控制,没有你想的这么简单

    用产品思维设计API(三)--版本控制,没有你想的这么简单 前言 最近公司内部在重构项目代码,包括API方向的重构,期间遇到了很多的问题,不由得让我重新思考了下. - 一个优雅的API该如何设计? - ...

  8. 腾讯阿里原来是这样设计api的

    大厂如何设计api 本文参考微信和支付宝的API设计,从「设计」,「可用性」,「安全性」三个方面分析API的设计思路:其中「设计篇」是设计一个api需要考虑哪些因素,「可用性」是一个api高可用的背后 ...

  9. php 设计api,PHP制作API接口

    需要单一入口文件,可以使用autoload来加载 //获取get参数 $m = !empty($_GET['m'])?$_GET['m']:'Index'; $a = !empty($_GET['a' ...

最新文章

  1. python延时一秒_python如何最快毫秒速度使用requests?
  2. HTML5 浏览器接收的常用 content-type
  3. boost::leaf::function_traits用法的测试程序
  4. nashorn js 调用 java_从nashorn(JDK 8 JavaScript引擎)调用char []输入参数调用Java函数?...
  5. 设置springboot日志级别_Spring Boot 日志框架实践
  6. Qt5中文乱码解决方案
  7. Bootstrap 警告框插件Alert 的事件
  8. UI设计干货模板|引导网格系统
  9. MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
  10. bug宝典linux篇 LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory(转)
  11. 团队选题报告(团队)
  12. OpenCV41:Meanshif和Camshift
  13. 互联网晚报 | 12月13日 星期一 | 百度将发布元宇宙产品“希壤”;吉利发布国内首款7nm汽车芯片;腾讯云财税管家正式发布...
  14. 物联网智能家居系统解决方案
  15. 霍夫变换(Hough)
  16. 2048游戏制作html,一个自制的2048小游戏(一)
  17. 【多元统计分析】一、多元统计分析概述
  18. ARM裸机开发篇3:ARM汇编语言程序设计
  19. Python+Pycharm和 VisualStudio C++社区版使用PK及易混淆的语法问题
  20. Impala/Hive现状分析与前景展望【转载】

热门文章

  1. 数据双向绑定_手写 Vue3 数据双向绑定 理解Proxy
  2. Java基础学习总结(132)——Java8 Stream流操作学习总结
  3. mysql 列很多_MySQL:多个表还是一个表有很多列?
  4. 路飞学城-Python爬虫集训-第一章
  5. eslint的安装与使用
  6. DP学习之USACO货币系统
  7. javascript -- 判断是否为某个数据类型
  8. JSLint Error 之 Don't make functions within a loop
  9. 思科Catalyst1900交换机上速配VLAN
  10. 软工作业4:词频统计