首页 > 解决方案 > 使用 GraphQL,是否可以通过数据类型为 Int 的属性进行 SQL 注入?

问题描述

如果我有输入类型:

input EntityInput {
  id: Int!
  vals: [Int!]!
}

我有一个突变,它是通过在 JavaScript 中从输入数组构建一个 SQL 字符串来实现的

type Mutation {
  updateEntity(input: [EntityInput!]!): [Entity!]!
}

考虑到输入是数字,是否可以进行 SQL 注入?我知道对于 type 的属性String,SQL 注入是可能的。

标签: graphqlsql-injection

解决方案


规格

当期望作为输入类型时,仅接受整数输入值。所有其他输入值,包括具有数字内容的字符串,都必须引发查询错误,指示类型不正确。如果整数输入值表示小于 -2³¹ 或大于或等于 2³¹ 的值,则应引发查询错误。

换句话说,在您的任何解析器代码被触及之前,提供的任何非整数值都会在验证期间引发错误。根本不会执行无效查询,因此不可能进行注入攻击。

但是,您不应该依赖 GraphQL 的类型系统来防止注入。相反,您应该确保正确转义您执行的任何 SQL 查询中使用的所有用户输入。大多数流行的 ORM、查询构建器等已经为您执行此操作,或者至少提供了一种运行安全、参数化查询的方法。否则,您应该使用更流行、经过充分测试的库来执行此操作。


推荐阅读