在阅读 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 了,这是重大隐患
@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