恶意|API查询语言GraphQL的优秀安全实践( 四 )

  • <body>
  • <script>history.pushState('', '', '/')</script>
  • <form action="https://redacted/graphql" method="POST">
  • <input type="hidden" name="query" value="https://www.sohu.com/a/{
  • user {
  • firstName
  • __typename
  • }
  • }
  • " />
  • <input type="submit" value="https://www.sohu.com/a/Submit request" />
  • </form>
  • </body>
  • </html>
  • 弥补GraphQL漏洞的清单 下面 , 我们将以清单的形式 , 给出一些与GraphQL安全有关的优秀实践 。
    防止GraphQL注入攻击
    对于那些由LDAP、ORMs/SQL/NoSQL或XML等辅助解析器 , 来处理输入信息的应用而言 , 我们建议开发人员做到如下方面:
    • 选择诸如参数化语句等能够提供安全API的库 。
    • 根据所选用的解析器的最佳实践 , 对输入进行转义或编码 。
    • 遵循所选模块的文档 , 以正确的方式使用该工具 。 毕竟 , 大多数语言和框架都内置了编码/转义功能 , 因此了解它们的核心功能 , 并选择适合的用例是非常重要的 。
    预防DoS攻击
    DoS攻击旨在使得GraphQL API变慢、甚至无法响应正常的请求 。 为了防御此类攻击 , 我们应做到:
    • 为传入的GraphQL查询实施深度的规则限制(depth limiting) 。
    • 为基础设施和API层添加超时设定 。
    • 执行查询的成本分析 , 以限制代价昂贵的查询 。
    • 对每个API客户端的传入请求 , 实施速率限制 。
    GraphQL API的访问控制
    为了保护对GraphQL API的合理访问 , 开发人员应该做到:
    • 验证当前用户是否有权根据他们的请求 , 查看、改变、以及修改数据 。
    • 对端点和边缘实施授权控制 。
    • 利用基于角色的访问控制(RBAC)中间件 , 通过查询和变异解析器(mutation solver) , 来启用访问控制 。
    • 在公共的API中禁用自省查询 。
    • 禁用GraphiQL之类针对GraphQL模式的探查工具 。
    通用GraphQL API安全实践
    开发人员还可以用来保护GraphQL层的其他方法包括:

    • 对允许的字符使用白名单 。
    • 为突变的输入预先定义好对应的GraphQL模式 。
    • 使用单一的内部字符编码格式 , 来正确地处理Unicode输入 。
    • 添加分页(pagination) , 以限制单个请求能够一次性访问到的信息量 。

    推荐阅读