7 项API安全设计最佳实践

隐藏所有的API安全线索

恶意无所不在,攻击何时都有可能发生。所以千万不要泄露安全相关的线索到API中。比如用户身份认证,就千万不要仅提示密码错误,否则就会暴露给攻击者用户名正确的线索,取而代之的提示应该是用户名或者密码错误并添加尝试次数限制

先认证后授权

任何敏感私密的操作都需要进行额外的认证操作,而非在身份验证之后就决定实施。通常解决方式是进行其他的认证流程获取操作的密钥token类似于oauth2。除此之外,就算身份认证通过后,对于服务内部的资源访问我们需要提供一些授权手段来检验其是否拥有操作的权限,防止未经授权的访问。

全程使用加密手段

使用HTTPS等基本的加密通信手段是基本条件,必要情况下添加相互认证的证书,以确保双方交换信息不会被篡改。

使用限制和资源配额

服务资源永远都是有限且不足的,我们不应该放任用户的任意请求,我们甚至还可以为某些密集型操作做更多限制

使用正确的方式验证

对于用户的输入任何内容,包括请求参数、条件、类型都需要做谨慎判断,并且始终根据一组特定的规则和期望进行验证。长度、范围、内容以及类型都需要做验证

使用RESTful API设计

这样的话你就可以充分利用请求发法的差异性来充分针对不同类型API做不同的设计策略

使用审计和日志记录

对于敏感性操作请记录好对应日志并做审计统计报警,以期尽可能早发现问题

使用API Key

没有合法的API Key来保护接口的话,那么暴露在外的接口可能存在攻击风险,导致带宽或者计算周期过多,API Key可以用来降低此风险。

暴露Endpoint

暴露Endpoint需要使用强身份验证,并且最好在不同的子网上设计实现

安全头部

X-Content-Type-Options: nosniff 使用它来防止浏览器自动解析成其他的类型

HTTP安全相关返回码 语义化

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/REST_Security_Cheat_Sheet.md