私は現在、エンタープライズCMSデータベース(ビジネスオブジェクト)用のJavaフロントエンドを開発しています。現時点では、ユーザーがカスタムデータベースクエリを作成できるようにする機能を構築しています。私はすでにユーザーが利用可能な列のサブセットとユーザーアクセス用に承認された演算子を使用して選択できるようにする手段を実装しています(SI_CUIDのような強力なフィールドは選択できないようにSI_EMAIL_ADDRESSを選択できます)。これまでのところはうまくいきましたが、今度はこの機能を潜在的なSQLインジェクション攻撃から保護する必要があります。
質問:私は、ユーザー入力文字列をエスケープする方法を探しています
。私はすでにPerparedStatementを見てきましたが、データベースにアクセスするために第三者のAPIを使用することを余儀なくされています。これらのAPIは私にとって不変であり、直接的なデータベースへのアクセスは問題にはなりません。個々のメソッドは、実行されるクエリを表す文字列を受け取り、PreparedStatementを無効にします(私の知る限り、直接データベース接続に対して実行する必要があります)。
私はString.replace()を使用することを検討しましたが、可能であればホイールを再作成したくありません。加えて、私はPerparedStatementを開発したセキュリティ専門家からははるかに驚いています。
また、PerparedStatementのJava APIリファレンスを見て、何らかの種類のtoString()メソッドが見つかることを期待しました。悲しいかな、私はこの種のものを見つけることができませんでした。
ご協力いただきまして誠にありがとうございます。前もって感謝します。
参考文献:
Java - escape string to prevent SQL injection
Java equivalent for PHP's mysql_real_escape_string()
:ここに私のサンプルコードです。私は、暗黙的に定義されたtoString()メソッドの未定義の動作に懸念しています。エンタープライズアーキテクトは、データベースそのものが適切に隠されていることを確実にするために驚くべき努力をしてきました。私はそれが実行されているDBMS、または将来変更されるかどうかを知りません。 – phobos51594
実際には、PreparedStatementには公にアクセス可能なコンストラクタさえあるように見えません。私はJDBC接続オブジェクトを持っていないので、どのようにPreparedStatmentオブジェクトをどのように取得するか分からない。 Hm。 – phobos51594
ええ、私はそれがどのように謎になるか見ることができます。私はLog4JDBCを使用していませんが、準備されたステートメントに基づいてSQLを生成できるようです。 – ametren