Web Api 12种常见安全措施
1)使用https:机密性--指传输的数据是采用 Session Key(会话密钥)加密的,在网络上是看不到明文的。完整性--指为了避免网络中传输的数据被非法篡改,使用 MAC 算法来保证消息的完整性。真实性--指通信的对方是可信的,利用了 PKI(Public Key Infrastructure 即「公钥基础设施」)来保证公钥的真实性。不可否认性是这个消息就是你给我发的,无法伪装和否认,是因为使用了签名的技术来保证的。
2) 使用OAuth2.0:
OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。 "客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料.
令牌(token)与密码(password)的作用是一样的,都可以进入系统,但令牌是短期的,到期会自动失效,用户自己无法修改。令牌可以被数据所有者撤销,会立即失效 。令牌权限有限制,密码一般是完整权限。
3) 使用WebAuthn:
WebAuthn 无需密码即可对用户进行身份验证。 它是基于公钥方法和生物特征、硬件令牌或智能手机等因素的使用的 W3C 标准。 许多浏览器、操作系统和互联网应用程序已经支持该方法。WebAuthn 通过消除与传统基于密码的身份验证相关的漏洞,显着增强了安全性。 它依赖于强大的加密原理,使其能够抵御网络钓鱼、密码猜测和凭据盗窃等常见攻击媒介。 用户便利性和体验 WebAuthn 提供无缝且用户友好的身份验证体验。 用户不再需要记住复杂的密码或经历重置忘记密码的麻烦
4) 使用资源签名验证:
接口签名验证的基本原理是,在每次请求中添加一个签名参数,用于验证请求的合法性和完整性。 服务端收到请求后,根据相同的算法和密钥,对请求参数进行加密处理,再与客户端传递过来的签名值进行比对。 否则,请求被认为是非法的,将被拒绝。 通过在每次请求中添加签名参数,并使用约定的签名算法和密钥进行验证,我们可以确保接口请求的合法性和完整性。 为了加强接口的安全性,我们可以引入接口签名验证的机制,以防止未经授权的访问和数据篡改。 通过引入接口签名验证的机制,我们可以有效地提高接口的安全性,防止未经授权的访问和数据篡改
5) 使用权限校验:
权限校验可以根据需求自行设计,例如基于角色,权限,账号,资源等建立授权策略并进行检查。用于避免数据权限,操作权限越权或者匿名操作。
6) 请求限制(基于用户,IP,行为等策略):
主要是为了显示请求速率过快,次数太多等,造成服务不稳定或者崩溃等。另外也是为了防止遍历数据,暴库等风险。
7) Api版本:
通过api版本既可以升级,也可以废弃某个版本的api。对api的不同版本进行良好的管理。
8) 白名单 (基于用户,IP等策略):
在一些情况,我们通过白名单能够更好的提升安全,例如:服务器的堡垒机,对数据库的IP白名单限制等,管理员的登录IP白名单限制等
9) 检查 OWASP API 安全风险:
Open Web Application Security Project (OWASP)
现对象级别授权的最佳位置是在后端 API 本身。 在后端,可以在请求(或对象)级别做出正确的授权决策,如果适用的话,使用适用于域和 API 的逻辑。 考虑这样一个场景:一个给定的请求可能会根据请求者的权限和授权在响应中产生不同级别的详细信息。
如果在后端无法更改当前易受攻击的 API,可以将 API 管理用作一种回退方式。 例如:
如果没有在后端实现对象级别授权,则使用自定义策略来实现该授权。
实现自定义策略,将标识符从请求映射到后端,从后端映射到客户端,这样内部标识符就不会公开。
在这些情况下,自定义策略可以是带查找功能的策略表达式(例如,字典),也可以通过发送请求策略与其他服务集成。
对于 GraphQL 场景,使用 authorize 元素通过验证 GraphQL 请求策略强制实施对象级别授权。
10) 使用Api网关:
API网关对API的安全管控基于多种规则的交叉,实现对网络层、应用层、信息层的安全策略的应用、审计和控制,来保障对外开放API时业务、数据、应用的安全。
API网关对API的保护贯穿API的创建、上线、开放、传输、以及最终销毁的全生命周期。
除以上本文提到的API安全管控功能外,API网关也提供实时的告警监控,能够及时对API调用的异常情况发出告警,有效保障API的稳定运行和对外服务。
11) 错误处理:
良好的规划错误处理,避免暴露sql和数据库细节或者敏感信息。
12)输入校验:
对输入不信任,并进行各种溢出,sql注入,xss,来源域名,频率,权限等校验能够提升api的安全性。