在我的工作中,它曾经是传统,通过不安全地将参数连接到查询字符串中来形成 SQL 查询。 这当然导致 SQL 注射易感性。 这并没有被视为一个大问题, 因为发生这种情况的所有 Java 软件都在封闭的网络上运行, 假设所有用户都相信这些网络。 另外, 查询是从有数据库访问功能的客户端应用程序中进行, 这样用户就可以在技术上执行恶意查询 。
尽管如此,它还是计划支持新版数据库层中的预编报表。 与此同时,我在现有数据库层之上写了一个小图书馆(它只支持执行 SQL String 的查询,而没有选择预编的报表或参数逃跑 ), 这样就可以通过逃避字符串参数来写出安全的参数查询。
作为这个图书馆的一部分, 我写了以下方法, 脱离字符串字句。 我摆脱了与 PHP s 附加鞭笞功能相同的字符, 但我试图通过检测补充字符( 32比特) 来避免多字字字符脆弱性 :
private String escapeString(String str)
{
List<Character> toEscape = Arrays.asList( , " , \ , );
StringBuilder result = new StringBuilder();
for(int i = 0; i < str.length(); ++i)
{
char c = str.charAt(i);
if(i < str.length() - 1 && c >= uD800 && c <= uDBFF )
{
char next = str.charAt(i + 1);
if(next >= uDC00 && next <= uDFFF )
{
// Two-char supplementary character. Escape neither.
result.append(c);
result.append(next);
++i;
continue;
}
}
if(toEscape.contains(c))
{
// Special character. Add escaping .
result.append( \ );
}
// Copy character itself.
result.append(c);
}
return result.toString();
}
我的问题是,这种逃避查询的方法是否足够安全(而我并没有监督任何事情,或者犯了执行错误 ) 。 可以假定输入字符串是有效的 UTF-16。 DBMSs 将使用 MySQL 和 Oracle 。