graphql - 使用 GraphQL,是否可以通过数据类型为 Int 的属性进行 SQL 注入?
问题描述
如果我有输入类型:
input EntityInput {
id: Int!
vals: [Int!]!
}
我有一个突变,它是通过在 JavaScript 中从输入数组构建一个 SQL 字符串来实现的
type Mutation {
updateEntity(input: [EntityInput!]!): [Entity!]!
}
考虑到输入是数字,是否可以进行 SQL 注入?我知道对于 type 的属性String
,SQL 注入是可能的。
解决方案
从规格:
当期望作为输入类型时,仅接受整数输入值。所有其他输入值,包括具有数字内容的字符串,都必须引发查询错误,指示类型不正确。如果整数输入值表示小于 -2³¹ 或大于或等于 2³¹ 的值,则应引发查询错误。
换句话说,在您的任何解析器代码被触及之前,提供的任何非整数值都会在验证期间引发错误。根本不会执行无效查询,因此不可能进行注入攻击。
但是,您不应该依赖 GraphQL 的类型系统来防止注入。相反,您应该确保正确转义您执行的任何 SQL 查询中使用的所有用户输入。大多数流行的 ORM、查询构建器等已经为您执行此操作,或者至少提供了一种运行安全、参数化查询的方法。否则,您应该使用更流行、经过充分测试的库来执行此操作。
推荐阅读
- javascript - 即使项目没有 src/main/java 文件夹,Sonarqube 6.7.5 也会计算代码覆盖率
- kubernetes - 为什么 Kubernetes pod 不优雅停止?
- javascript - 如何使用 Immer 调试 UI 状态?
- python - 使用 Python 和 AsyncIO 获取 JSON
- python - 比较两个单独数据帧的时间
- vue.js - Axios - 无法设置全局授权标头
- java - Java 接口只定义方法名(即变量参数)
- css - 从下到上一一列出动画
- php - 通过类的 Wordpress 排队样式插件
- javascript - Vue路由器链接和自定义事件