Rails 关于 SQL 注入的问题

runup · 2014年09月24日 · 最后由 runup 回复于 2014年09月28日 · 2149 次阅读

在阅读 railsguide 中的 sql 注入问题:

SELECT * FROM projects WHERE name = ' ' OR 1 --'

这句话如何进行理解,guide 中的解释是说:

两根横线表明注释开始,后面所有的语句都会被忽略。所以上述查询会读取 projects 表中所有记录,包括向用户隐藏的记录。这是因为所有记录都满足查询条件。

其实我不太理解这句话,能否请前辈们解释一下。

就是说,输入 ' OR 1 -- ,那么拼接出来的 SQL 语句为

SELECT * FROM projects WHERE name = ' ' OR 1 --'

等同于

SELECT * FROM projects WHERE name = ' ' OR 1

等同于

SELECT * FROM projects

程序设计者本意可能是想查询当前用户的 projects,结果一注入,取出所有用户的 projects 了,这是重大隐患

' OR 1 --

第一个引号会提前结束 sql 查询, OR 1 则无论如何都会返回 true,-- 注释掉后面的单引号确保 sql 正确。

#3 楼 @saiga 前面的两个引号‘’不是表示空的意思么,然后和后面的 1 --‘取 or,这是我的理解。如果' OR 1 --中的第一个引号表示结束,那么后面的标示符是不是就不会执行了。其实我知道我的理解是错的,求拨乱方正。

#2 楼 @libuchao 如何看待三楼的答案?

#5 楼 @runup 我没有理解 第一个引号会提前结束 sql 查询

#6 楼 @libuchao 会提前结束原来的查询,主要是为了好理解点

#7 楼 @saiga 如果结束了查询,那不是后面的都没有意义?

#8 楼 @runup 我原意是把注入的 sql 拆成两个表达式来理解的,不过好像更难理解了...无视我吧 😢

@libuchao 解释的蛮清楚的了。

比较 naive 的 server 端代码本身可能是 SELECT * FROM projects WHERE name = '#{name}' 所以如果你输入的是 "' OR 1 --" (注意 single quote 不是结束查询,而是和 server 端的#{name}前面的 single quote 配对,如果没有 single quote,那么所有的注入代码还是被当做 string 来解析,就无法用--起到注释的作用了)。 替换后: SELECT * FROM projects WHERE name = ' ' OR 1 -- whatever_sql_code

#10 楼 @yijunlin 其实我说结束的查询是“用户期望查询” 😢

我是把 SELECT * FROM projects WHERE name = ' ' OR 1 这个布尔表达式拆成了一个查询表达式和一个常量式,所谓的提前结束是期望查询在第一个表达式完成了,程序返回了第二个非期望表达式..

结果好像越描越糊涂了..

需要 登录 后方可回复, 如果你还没有账号请 注册新账号