プリペアドステートメントの力は知っていますが、ここでは使用できません。JDBCではなくHTTPを介してSQLクエリを外部サーバーに送信します。SQLクエリの文字列をエスケープする方法は?JDBCを介してこれを行う方法はありますか?または、これにカスタムクラス/関数を使用する必要がありますか?
psまた、他のDBに接続しているので、JDBC関数を使用できます。
リンクが本当に良い答えを出さないことは知っていますが、この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ステートメントを送信している場合、man-in-the-middle攻撃(とりわけ)によって危険にさらされる可能性があります。これとは別に、平均的なレベルのプログラマーは、SQLステートメントを送信していることを確認した場合、データベースに対して悪意のあるSQLを実行しようとする可能性があります。ユーザーを作成したり、パスワードを変更したり、機密データを取得したりする可能性があります...これが物事に取り組むための最良の方法であると確信していますか?
他の人がすでに言っているにもかかわらず、それは良い考えではありません。HTTP呼び出しを介して、PreparedStatementの動作を「模倣」することができます。
のように呼び出し内で複数のパラメータを送信するだけです
/sqlInterperter.do?sql=somesql_with_params¶m1=...¶m2=...
そうすれば、少なくとも受信側でプリペアドステートメントを再度使用できます。
(それでも、誰でもあなたにステートメントを送ることができます!だから最高は:それをしないでください)