在MySQL 5.6数据库上,我构建了这个简单的表并插入一行:
CREATE TABLE `users` (
`username` varchar(64) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL
);
INSERT INTO users VALUES ('bob', 'pass');
Run Code Online (Sandbox Code Playgroud)
然后我在PHP中设置一个查询,如下所示:
$query = "SELECT * from users where username=\"".$username."\" and password=\"".$password."\"";
Run Code Online (Sandbox Code Playgroud)
当$username和$password它们都相等时""=",得到的查询是SELECT * from users where username="""="" and password="""="".当用于查询之前设置的表时,将返回表中的行.
问题是,MySQL如何评估该查询,使其认为查询有效并且WHERE语句为真?假设所有双引号都与最近的相邻双引号匹配,我原本期望查询被解释为类似这样,看起来应该被认为是乱码:
SELECT * from users where username=""
"="
" and password="
""
=
""
Run Code Online (Sandbox Code Playgroud)
以下是MySQL 5.6 DB上此行为的示例:http://sqlfiddle.com/#!9/02e606/2