ORM 框架 SQL 注入点分析 (以Golang为例)
最近研究了一些现代 ORM 框架的 SQL 注入情况,做一些笔记吧。 GORM 注入点 gorm 注入点简单可以分为三种情况 检测转义 直接转义 schema 校验 如果 gorm 认为这个参数他不会是一个表达式也不会是`aaa`.`bbb` 的形式,从功能上也只可能是一个单纯的列名,这个时候 gorm 会直接给你套上 ` 同时对内部的内容全部进行转义,这种一般是不存在注入点的,例如 Association 函数。 另外部分多表关联(Associations)查询的字段会存在 schema 校验,如果对不上列名会在 sql 构建阶段报错,例如 Preload 函数,这些也是无法注入的。 那剩下的部分都执行一个检测转义的策略: 先检测`的存在, 如果不存在就套上,并假装存在,直到扫描另一个` 这个转义设计上是为了兼容性,并不出于安全性考虑,所以是比较好注的 根据注入点出现的位置分类,可以分为下面这几个 参数位置 函数 1 Group,Order,Exec,Having,InnerJoins,Joins,Not,Or,Pluck,Raw,Select,Table,Where 1… Distinct 2 Find,First,FirstOrCreate,FirstOrInit,Last,Take 参数位置 为 2 的一类基本是 gorm 新增的一些语法糖 API,不过从上表也可以看出 Gorm 设计的真的不错,API 风格真的非常统一。 案例 DB.Order("id = case when version() rlike '8.*' then ? else 0 end #").First(&a) DB.First(&a, "?=0 union select 1,1,version() #") SELECT * FROM `aaaa` ORDER BY id = case when version() rlike '8....