Skip to content

关于模型中 where 使用不当导致 SQL 注入的问题修复方案

Welefen Lee edited this page Sep 14, 2017 · 9 revisions

模型中 where 提供了方便过滤的条件,但如果没有对参数进行过滤校验,可能会导致 SQL 注入漏洞。 如:

this.model('user').where({id: this.get('id')}).find();

在上面的例子中,我们希望从 URL 获取参数来查询,本意是希望 id 值为 int 类型,但如果不作任何校验,那么值有可能为 ['!=', 3],这样生成的 SQL 并不我们希望的,导致注入漏洞。所以一定要在 Logic 中作参数安全过滤。

为此,框架加了个转义的策略,当发现参数值为数组,且第一个参数为 where 中的关键字时,那么在后面补个空格,如:['!=', 3] 变成 ['!= ', 3],这样后续 where 里解析时会报参数不合法的错误,从而避免安全问题。

升级方案如下:

  • ThinkJS@3 项目中升级 thinkjs@3.1.2think-model@1.1.1think-model-abstract@1.1.0
  • ThinkJS@2 项目中升级 thinkjs@2.2.24
  • ThinkJS@1 项目中升级 thinkjs@1.2.15

一定要在 Logic 中对参数作安全校验!

一定要在 Logic 中对参数作安全校验!

一定要在 Logic 中对参数作安全校验!