6 个答案:
答案 0 :(得分:46)
关于退格字符的猜测:想象一下,我发送了一封电子邮件“嗨,这是根据需要更新数据库的查询”和带有的附加文本文件
INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);
你捕获文件,看到它没关系,然后将文件传输到MySQL。然而,你不知道的是我把
DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b
在INSERT STATEMENT之前你没有看到,因为在控制台输出上,退格会覆盖它。 BAMM!
但只是一个猜测。
编辑(无法抗拒):
答案 1 :(得分:15)
\0 ASCII NUL(0x00)字符。
\'单引号(“'”)字符。
\"双引号(“"”)字符。
\b退格字符。
\n换行符(换行符)。
\r回车符。
\t标签字符。
\Z ASCII 26(Control-Z)。见表格后面的注释。
\\反斜杠(“\”)字符。
\%“%”字符。见表格后面的注释。
\_“_”字符。见表格后面的注释。
答案 2 :(得分:4)
如果您有其他选择,黑名单(识别不良角色)绝不是您的选择。
您需要使用白名单,更重要的是绑定参数方法的组合。
答案 3 :(得分:0)
用户输入包含制表符或退格符?
至关重要的是,到目前为止,大多数用户确实认为必须转发用户输入,并且这样的“可以防止注入”。
答案 4 :(得分:0)
Java解决方案:
public static String filter( String s ) {
StringBuffer buffer = new StringBuffer();
int i;
for( byte b : s.getBytes() ) {
i = (int) b;
switch( i ) {
case 9 : buffer.append( " " ); break;
case 10 : buffer.append( "\\n" ); break;
case 13 : buffer.append( "\\r" ); break;
case 34 : buffer.append( "\\\"" ); break;
case 39 : buffer.append( "\\'" ); break;
case 92 : buffer.append( "\\" );
if( i > 31 && i < 127 ) buffer.append( new String( new byte[] { b } ) );
}
}
return buffer.toString();
}
答案 5 :(得分:-2)
不能只从用户输入中删除单引号吗?
例如:1,Func