OpenAPI 2.0 警告
在定义 API 时,您可以使用 Postman 来识别任何潜在的安全漏洞。
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 字段应至少包含数组中的一项。PUT PATCH POST |
解决:
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