开发安全的API所需要的核对的清单

以下是当你在设计,测试以及发布你的API的时候所需要核对的重要安全措施。


身份认证

  • 不要使用Basic Auth使用标准的认证协议(例如JWT,OAuth)。
  • 不要重新实现Authenticationtoken generatingpassword storing,使用标准库。
  • 限制密码错误尝试次数,并增加账号冻结功能。
  • 加密所有的敏感数据。

    JWT(JSON Web令牌)

  • 使用随机复杂的密钥(JWT Secret)以增加暴力破解的难度。

  • 不要在请求体中直接提取数据,要对数据进行加密(HS256RS256)。
  • 使令牌的过期时间尝试的短(TTLRTTL)。
  • 不要在JWT的请求体中存放敏感数据,它是可解码的

    OAuth授权或认证协议

  • 始终在后台验证redirect_uri,只允许白名单的URL。

  • 始终在授权时使用有效期初始的授权码(code)而不是令牌(access_token)(永久response_type=token)。
  • 使用随机哈希数的state参数来防止跨站请求伪造(CSRF)。
  • 对不同的应用分别定义默认的作用域和各自有效的作用域参数。

    访问

  • 限制流量来防止DDoS攻击和暴力攻击。

  • 在服务端使用HTTPS协议来防止MITM(中间人攻击)。
  • 使用HSTS协议防止SSL Strip攻击。

    输入

  • 使用与操作相符的HTTP操作函数,GET (读取)POST (创建)PUT (替换/更新)以及DELETE (删除记录),如果请求的方法不适用于请求的资源则返回405 Method Not Allowed

  • 在请求头中的content-type分区使用内容验证来只允许支持的格式(如application/xmlapplication/json等等)并在不满足条件的时候返回406 Not Acceptable
  • 验证content-type中申明的编码状语从句:你收到正文编码harmony和谐(如application/x-www-form-urlencodedmultipart/form-dataapplication/json等等)。
  • 验证用户输入来避免一些普通的易受攻击缺陷(如XSSSQL-注入远程代码执行等等)。
  • 不要在URL中使用任何敏感的数据(credentialsPasswordssecurity tokens,或API keys),而是使用标准的认证请求头。
  • 使用一个API网关服务来启用缓存,限制访问速率(如QuotaSpike ArrestConcurrent Rate Limit)以及动态地部署的API资源。

    处理

  • 检查是否所有的接口都包含必要都的身份认证,并被破坏了的认证体系。

  • 避免使用特有的资源id。使用/me/orders替代/user/654321/orders
  • 使用UUID代替自增长的id。
  • 如果需要解析XML文件,确保实体解析(实体解析)是关闭的入侵XXE
  • 如果需要解析XML文件,确保实体扩展(实体扩展)是关闭的索引通过索引实体扩展攻击实现的Billion Laughs/XML bomb
  • 在文件上传中使用CDN。
  • 如果数据处理量很大,则在后台处理来避免重复请求,从而快速响应客户端。
  • 不要忘了把DEBUG模式关掉。

    输出

  • 增加请求返回头X-Content-Type-Options: nosniff

  • 增加请求返回头X-Frame-Options: deny
  • 增加请求返回头Content-Security-Policy: default-src 'none'
  • 删除请求返回中的指纹头- ,,X-Powered-By 等等。Server``X-AspNet-Version
  • 在响应中一致请求的content-type,如果你的请求类型是application/json那么你返回的content-type就是application/json
  • 不要返回敏感的数据,如credentialsPasswordssecurity tokens
  • 给请求返回使用合理的HTTP响应代码。(如200 OK400 Bad Request401 Unauthorized405 Method Not Allowed等等)。

    持续集成和持续部署

  • 使用单元测试以及集成测试的覆盖率来保障你的设计和实现。

  • 约会代码审查流程,禁止私自合并代码。
  • 在推送到生产环境之前确保服务的所有组件都用杀毒软件静态地扫描过,包括第三方库和其他依赖。
  • 为部署设计一个回滚方案。

也可以看看: