OpenAPI 2.0 警告

在定义 API 时,您可以使用 Postman 来识别任何潜在的安全漏洞。

OpenAPI 2.0 的安全警告

OpenAPI 2.0 的安全警告

对于 OpenAPI 2.0 中定义的所有 API,以下列表描述了可能的警告消息和可能的解决方法。

损坏的对象级授权

securityDefinition 声明中未定义安全字段中使用的 OAuth 方案的范围

严重性 问题描述 可能的修复
低的 全局安全字段中使用的 OAuth2 范围应在安全方案字段中定义。否则,攻击者可以引入他们的范围来填补空白并利用系统。 确保使用的所有 OAuth2 范围都在 OAuth2 安全方案中定义。

解决:

swagger: '2.0'
#...
security:
  - OAuth2:
    - read
    - write
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    scopes:
      read: read object
      write: writes object
    authorizationUrl: https://example.com/authorize
    tokenUrl: https://example.com/token

 

使用的 OAuth 方案的范围未在 securityDefinition 声明中定义

严重性 问题描述 可能的修复
低的 操作的安全字段中使用的 OAuth2 范围应在安全方案字段中定义。否则,攻击者可以引入他们的范围来填补空白并利用系统。 确保使用的所有 OAuth2 范围都在 OAuth2 安全方案中定义。

解决:

swagger: '2.0'
#...
paths:
  "/user":
    get:
      summary: 'Sample endpoint: Returns details about a particular user'
      operationId: listUser
      security:
        - OAuth2:
          - read
          - write
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    scopes:
      read: read object
      write: writes object
    authorizationUrl: https://example.com/authorize
    tokenUrl: https://example.com/token

 

损坏的用户身份验证

未定义安全字段

严重性 问题描述 可能的修复
高的 如果未定义全局安全字段,则 API 默认不需要任何身份验证。任何人都可以访问未定义安全字段的 API 操作。 安全字段应该在模式中定义。

解决:

swagger: '2.0'
#...
securityDefinitions:
  basicAuth:
    type: basic
security:
    - basicAuth: []

 

安全字段不包含任何项目

严重性 问题描述 可能的修复
高的 如果 security 字段包含一个空数组,则默认情况下不会对操作应用任何安全方案。 安全字段应至少包含数组中的一项。

解决:

swagger: '2.0'
#...
securityDefinitions:
  basicAuth:
    type: basic
security:
    - basicAuth: []

 

安全字段不包含任何方案

严重性 问题描述 可能的修复
高的 安全字段中的空对象会完全停用身份验证。如果没有为每个操作定义安全字段,任何人都可以访问 API 操作而无需任何身份验证。 安全字段数组项不应包含空对象。

解决:

swagger: '2.0'
#...
securityDefinitions:
  basicAuth:
    type: basic
security:
    - basicAuth: []

 

未定义安全定义对象

严重性 问题描述 可能的修复
高的 API 的 components 对象没有声明任何可以在 API 的安全字段或单个操作中使用的安全定义。 安全定义应该在组件的模式中定义。

解决:

swagger: '2.0'
#...
securityDefinitions:
  basicAuth:
    type: basic

 

安全定义对象不包含任何方案

严重性 问题描述 可能的修复
高的 可重用安全定义中的空对象意味着没有为每个操作定义身份验证方案,任何人都可以访问API操作而无需任何身份验证。 安全定义应在对象中至少包含一项。

解决:

swagger: '2.0'
#...
securityDefinitions:
  basicAuth:
    type: basic

 

安全字段中使用的方案未在安全定义对象中定义

严重性 问题描述 可能的修复
中等的 全局或操作安全字段中使用的认证方案未在安全定义对象中定义。 安全领域使用的方案应该在安全定义对象中定义。

解决:

swagger: '2.0'
#...
securityDefinitions:
  basicAuth:
    type: basic
security:
    - basicAuth: []

 

操作的安全字段不包含任何项目

严重性 问题描述 可能的修复
中等的 默认情况下,API 操作未应用任何安全方案。 任何操作中的安全字段都应至少包含数组中的一项。

解决:

swagger: '2.0'
#...
paths:
  /user:
    get:
      description: 'Returns details about a particular user'
      security:
          - basicAuth: []
      #...
securityDefinitions:
  basicAuth:
    type: basic

 

操作的安全字段不包含任何方案

严重性 问题描述 可能的修复
中等的 安全字段中的空对象会完全停用操作的身份验证。任何人无需任何身份验证即可访问 API 操作。 在操作中指定至少一项安全要求。

解决:

swagger: '2.0'
#...
paths:
  /user:
    get:
      description: 'Returns details about a particular user'
      security:
          - basicAuth: []
      #...
securityDefinitions:
  basicAuth:
    type: basic

 

操作不强制执行任何安全方案

严重性 问题描述 可能的修复
中等的 如果全局安全字段和操作的安全字段都没有定义,任何人都可以访问 API 而无需任何身份验证。 在操作中定义一个安全字段。

解决:

swagger: '2.0'
#...
paths:
  /user:
    get:
      description: 'Sample endpoint: Returns details about a particular user'
      security:
          - basicAuth: []
      #...
securityDefinitions:
  basicAuth:
    type: basic

 

过多的数据暴露

API 接受来自 OAuth 身份验证的纯文本凭据

严重性 问题描述 可能的修复
高的 访问令牌通过未加密的网络以纯文本形式发送。攻击者只需侦听公共 Wi-Fi 网络中的网络流量即可拦截访问令牌。 确保方案数组中使用的方案是 HTTPS。

解决:

swagger: '2.0'
#...
host: 'example.com'
schemes:
  - https
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    authorizationUrl: https://my.auth.example.com/
    tokenUrl: https://my.token.example.com/
security:
 - OAuth2: []

 

API 接受纯文本的 API 密钥

严重性 问题描述 可能的修复
高的 API 密钥通过未加密的通道以纯文本形式发送。攻击者可以通过监听公共 Wi-Fi 网络中的网络流量轻松拦截 API 密钥。 确保方案数组中使用的方案是 HTTPS。

分辨率

swagger: '2.0'
#...
host: 'example.com'
schemes:
  - https
securityDefinitions:
  apiKeyAuth:
    type: apiKey
    name: api_key
    in: header
security:
  - apiKeyAuth: []

 

API 接受纯文本的基本身份验证凭据

严重性 问题描述 可能的修复
高的 凭据通过未加密的网络以纯文本形式发送。攻击者只需侦听公共 Wi-Fi 网络中的网络流量即可拦截凭据。 确保方案数组中使用的方案是 HTTPS。

解决:

swagger: '2.0'
#...
host: 'example.com'
schemes:
  - https
securityDefinitions:
  basicAuth:
    type: basic
security:
 - basicAuth: []

 

全局方案定义了 HTTP 方案

严重性 问题描述 可能的修复
中等的 服务器支持未加密的 HTTP 连接,所有请求和响应都将公开传输。任何在通话过程中监听网络流量的人都可以拦截它们。 确保方案数组中使用的方案是 HTTPS。

解决:

swagger: '2.0'
#...
host: 'example.com'
schemes:
  - https
#...

 

操作以纯文本形式接受来自 OAuth 身份验证的凭据

严重性 问题描述 可能的修复
中等的 API 操作接受来自通过未加密通道以纯文本形式传输的流的访问令牌。攻击者可以轻松拦截 API 调用并检索未加密的令牌。然后,他们可以使用令牌进行其他 API 调用。 确保操作的scheme数组中使用的scheme是HTTPS。

解决:

swagger: '2.0'
#...
host: 'example.com'
paths:
  "/user":
    get:
      summary: 'Sample endpoint: Returns details about a particular user'
      schemes:
          - https
      security:
          - OAuth2: []
      #...
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    authorizationUrl: https://my.auth.example.com/
    tokenUrl: https://my.token.example.com/

 

操作接受纯文本的 API 密钥

严重性 问题描述 可能的修复
高的 API 操作接受通过未加密通道以纯文本形式传输的 API 密钥。攻击者可以轻松拦截 API 调用并检索 API 密钥以进行其他 API 调用。 确保操作的scheme数组中使用的scheme是HTTPS。

分辨率

swagger: '2.0'
#...
host: 'example.com'
paths:
  "/user":
    get:
      summary: 'Sample endpoint: Returns details about a particular user'
      schemes:
          - https
      security:
          - apiKeyAuth: []
      #...
securityDefinitions:
  apiKeyAuth:
    type: apiKey
    name: api_key
    in: header

 

操作接受纯文本的基本身份验证凭据

严重性 问题描述 可能的修复
中等的 API 操作接受通过未加密通道以纯文本形式传输的凭证。攻击者可以轻松拦截 API 调用并检索未加密的令牌。然后,他们可以使用令牌进行其他 API 调用。 确保操作的scheme数组中使用的scheme是HTTPS。

解决:

swagger: '2.0'
#...
host: 'example.com'
paths:
  "/user":
    get:
      summary: 'Sample endpoint: Returns details about a particular user'
      schemes:
          - https
      security:
          - BasicAuth: []
      #...
securityDefinitions:
  BasicAuth:
    type: basic

 

操作方案定义了 HTTP 方案

严重性 问题描述 可能的修复
中等的 API 操作支持未加密的 HTTP 连接,所有请求和响应都将公开传输。任何在通话过程中监听网络流量的人都可以拦截它们。 确保操作的scheme数组中使用的scheme是HTTPS。

解决:

swagger: '2.0'
#...
host: 'example.com'
paths:
  "/user":
    get:
      summary: 'Sample endpoint: Returns details about a particular user'
      schemes:
          - https
      #...

 

授权 URL 使用 HTTP 协议。凭证将作为纯文本传输

严重性 问题描述 可能的修复
中等的 OAuth 授权凭证通过未加密的通道传输。任何在通话过程中监听网络流量的人都可以拦截它们。 确保授权 URL 是有效 URL 并遵循 HTTPS 协议。

解决:

swagger: '2.0'
#...
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    #...
    authorizationUrl: https://example.com/authorize

 

令牌 URL 使用 HTTP 协议

严重性 问题描述 可能的修复
中等的 OAuth 身份验证令牌通过未加密的通道传输。在发送令牌时监听网络流量的任何人都可以拦截它。 确保令牌 URL 是有效 URL 并遵循 HTTPS 协议。

解决:

swagger: '2.0'
#...
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    #...
    tokenUrl: https://example.com/token

 

Produces 字段未定义

严重性 问题描述 可能的修复
高的 produces如果未定义全局字段,API 可能会返回任何形式的数据。 produces字段应在模式中定义。

解决:

swagger: '2.0'
paths: {}
consumes:
  - application/json
produces:
  - application/json

 

Produces 字段不包含任何项目

严重性 问题描述 可能的修复
高的 如果该produces字段包含一个空数组,API 默认可以返回任何类型的数据。 全局produces字段应包含数组中至少一项具有有效 MIME 类型的项。

解决:

swagger: '2.0'
paths: {}
produces:
  - application/json
...

 

为操作生成字段不包含任何项目

严重性 问题描述 可能的修复
高的 操作中没有produces字段意味着API默认可以返回任何类型的数据。 任何操作中的produces字段都应至少包含数组中的一项。

解决:

swagger: '2.0'
paths:
  /user/{userId}:
    get:
      produces:
        - application/json

 

操作不包含产生字段

严重性 问题描述 可能的修复
中等的 如果未定义任何操作的全局produces字段和操作字段,则任何人都可以利用您的 API。produces produces如果未在全局级别定义,则在操作中定义一个字段。

解决:

swagger: '2.0'
paths:
  /user/{userId}:
    get:
      produces:
        - application/json
  ...
...

 

注射

未定义消耗字段

严重性 问题描述 可能的修复
高的 consumes如果未定义全局字段,API 可能会接受任何形式的数据作为输入。这可能会使您的 API 遭受任意数量的潜在攻击,例如缓冲区溢出、解码错误或 SQL 注入攻击。 consumes字段应在模式中定义。

解决:

swagger: '2.0'
paths: {}
consumes:
  - application/json

 

消耗字段不包含任何项目

严重性 问题描述 可能的修复
高的 如果该consumes字段包含一个空数组,API 默认可以接受任何类型的输入。 全局consumes字段应包含数组中至少一项具有有效 MIME 类型的项。

解决:

swagger: '2.0'
paths: {}
consumes:
  - application/json
...

 

操作的消耗字段不包含任何项目

严重性 问题描述 可能的修复
高的 操作中没有consumes字段意味着API默认可以接受任何类型的输入。 //操作中的consumes字段应至少包含数组中的一项。PUTPATCHPOST

解决:

swagger: '2.0'
paths:
  /user/{userId}:
    put:
      consumes:
        - application/json

 

操作不包含消耗字段

严重性 问题描述 可能的修复
中等的 如果未定义全局consumes字段和操作consumes字段(for PUT/ PATCH/ ),任何人都可以利用您的 API。POST consumes如果未在全局级别定义,则在操作中定义一个字段。

解决:

swagger: '2.0'
paths:
  /user/{userId}:
    put:
      consumes:
        - application/json
  ...
...

 

资产管理不当

OAuth 身份验证使用已弃用的隐式流程

严重性 问题描述 可能的修复
中等的 在 OAuth 隐式流程中,授权服务器在授权请求的响应中发出访问令牌。攻击者可以轻松拦截 API 调用并检索访问令牌以进行其他 API 调用。 推荐使用 accessCode 流。确保 OAuth 身份验证方案未使用隐式流。

解决:

swagger: '2.0'
#...
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    authorizationUrl: https://my.auth.example.com/
    tokenUrl: https://my.token.example.com/
    scopes:
      write: modify data
      read: read data

 

OAuth 身份验证使用已弃用的密码流程

严重性 问题描述 可能的修复
中等的 Oauth 密码授予流程使用用户的凭据来检索访问令牌。攻击者可以轻松拦截 API 调用并检索访问令牌以进行其他 API 调用。 推荐使用 accessCode 流。确保 OAuth 身份验证方案未使用密码流。

解决:

swagger: '2.0'
#...
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: accessCode
    authorizationUrl: https://my.auth.example.com/
    tokenUrl: https://my.token.example.com/
    scopes:
      write: modify data
      read: read data