API查询语言GraphQL的优秀安全实践( 三 )

Content-Type: application/x-www-form-urlencoded Referer: https://redacted Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Cookie: ... query=%7B%0A++user+%7B%0A++++firstName%0A++++__type...

  • Content-Type: application/x-www-form-urlencoded
  • Referer: https://redacted
  • Accept-Encoding: gzip, deflate
  • Accept-Language: en-US,en;q=0.9
  • Cookie: ...
  • query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
  • 而有经验的攻击者则可以使用自动化扫描工具 , 将其转换为CSRF的攻击接口:
    1. <html>
    2. <!-- CSRF PoC - generated by Burp Suite Professional -->
    3. <body>
    4. <script>history.pushState('', '', '/')</script>
    5. <form action="https://redacted/graphql" method="POST">
    6. <input type="hidden" name="query" value="https://www.sohu.com/a/{
    7. user {
    8. firstName
    9. __typename
    10. }
    11. }
    12. " />
    13. <input type="submit" value="https://www.sohu.com/a/Submit request" />
    14. </form>
    15. </body>
    16. </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) , 以限制单个请求能够一次性访问到的信息量 。
    【API查询语言GraphQL的优秀安全实践】

    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。