您给出的示例导致返回值 0(非 NULL)。这是因为您构建的查询最终成为布尔比较。在=UPDATE语句的分配部分(S)内是比较运营商,而不是一个赋值运算符如你所期望的。
注入vote`=1, `vote`=10+`vote导致查询UPDATE mytable SET /*part1*/`vote`=1, /*part2*/`vote`=10+`vote` = `vote`=1, /*part3*/`vote`=10+`vote` + 1解构为此(为清楚起见,使用 == 作为比较运算符:
PART1:
vote = 1
PART2:
vote = ((10+vote) == vote) == 1
vote = ( 11 == vote ) == 1
vote = ( 11 == 10 ) == 1
vote = FALSE == 1
vote = FALSE (0)
PART 3:
vote = 10 + vote + 1
vote = 10 + FALSE (0) + 1
vote = 11
更有趣的注入是只设置投票列,然后使用评论结束查询:
$vote = "vote` = 1337 -- and we don't care about the rest";
// results in:
// UPDATE mytable set `vote` = 1337 -- and we don't care about the rest` = `vote` = 1337 -- and we don't care about the rest` + 1
MySQL 将在第一次出现 -- 作为注释后忽略所有内容,并将值(实际上是表中的所有投票值)设置为 1337。