我知道准备好的语句的力量,但我不能在这里使用它。我通过 HTTP 向外部服务器发送 sql 查询,而不是通过 JDBC。如何为 SQL 查询转义字符串?有办法通过 JDBC 做到这一点吗?或者我应该为此使用自定义类/函数?
ps 另外我有连接到其他数据库,所以我可以使用 JDBC 函数。
尽管其他人已经告诉过,这不是一个好主意。您可以通过 HTTP 调用“模仿” PreparedStatement 的行为。
只需在调用中发送多个参数,例如
/sqlInterperter.do?sql=somesql_with_params¶m1=...¶m2=...
然后至少您可以在接收方再次使用准备好的语句。
(尽管如此,任何人都可以向您发送任何声明!所以最好的是:不要这样做)
我知道链接并不能很好地回答 - 但是如果你无法使用准备好的语句,这个SQL 注入预防备忘单是一个很好的读物(而且太大而不能在这里发布) - 它为你提供了很多关于如何防止 SQL 的示例注射
阅读这个有这个:
static public String escapeLine(String s) {
String retvalue = s;
if (s.indexOf ("'") != -1 ) {
StringBuffer hold = new StringBuffer();
char c;
for(int i=0; i < s.length(); i++ ) {
if ((c=s.charAt(i)) == '\'' ) {
hold.append ("''");
}else {
hold.append(c);
}
}
retvalue = hold.toString();
}
return retvalue;
}
这听起来很不安全。如果您通过 HTTP 发送 SQL 语句,那么您可能会受到中间人攻击(以及其他攻击)的危害。除此之外,任何平均水平的程序员都可能尝试对您的数据库执行恶意 SQL,如果他们看到您正在发送 SQL 语句。他们可以创建用户、更改密码、检索敏感数据……您确定这是处理事情的最佳方式吗?