结论:必须成双成对的一起,单引号需要转义字符,既可以两个单引号’’,也可以反斜线+单引号\'
INSERT INTO test.images (name, data) VALUES ('', NULL); # success 空
INSERT INTO test.images (name, data) VALUES ('''', NULL); # success '
INSERT INTO test.images (name, data) VALUES ('''''', NULL); # success ''
INSERT INTO test.images (name, data) VALUES ('\ ', NULL); # success 空
INSERT INTO test.images (name, data) VALUES ('\\ ', NULL);# success \
select id, name from test.images where name = ''; # success 空
select id, name from test.images where name = ''''; # success '
select id, name from test.images where name = '\\';# success \
select id, name from test.images where name = '\\\\'; # success
INSERT INTO test.images (name, data) VALUES ('\\''', NULL); # success \'
select id, name from test.images where name = '\\'''; # success \'
select id, name from test.images where name = '\'; # fail
select id, name from test.images where name = '\\\'''; # fail
解释一下,上面使用了PHP的addslashed(),addslashes()作用是 在预定义字符之前添加反斜杠。预定义字符是单引号(')双引号(")反斜杠(\)NULL。这样我们无法在注入的过程当中使用单引号(’)。
'单引号 经addslashed()处理后 变成\', 再连接数据库, 数据库会将\'变成\\\',进行select查询。
为什么数据库会将\'变成\\\'? 数据库想要插入值为\',执行的insert语句得是insert into...value('\\\''),实际插入才会是\'。所以对于实际插入为\'的select语句就为\\\'。