2009-07-24 9 views
1

私はjava app + SQLサーバーデータベースを持っています。 DB操作は、動的SQL文字列でJDBCを使用します。例:列= StringParmJavaアプリケーションでSQL Serverの特殊文字をキャプチャ/エンコードする方法は?

StringParamは、ユーザーの入力であるタブから

列選択。 stringParmにアポストロフィが含まれている場合、Javaアプリケーションは例外をスローし、SQLを実行できないと言います。

Javaコードを変更しないでこの問題を解決するにはどうすればよいですか?

+1

少なくとも一部のJavaコードを変更しないと解決できません。 –

+0

http://stackoverflow.com/questions/332365/xkcd-sjection-please-explain –

答えて

2

ユーザーの入力をSQLクエリに直接入力しないでください。パラメータ付きのPreparedStatementを使用する必要があります。 Javaコードを変更することなく、私はこれを安全にする方法は見当たりません。

+0

私はPreparedStatementを使用しました。 PreparedStatementをパラメータ(setXXX)で使用すると、?、 '、...やユニコードのような特別な文字をハンドリングできますか?また、SQLインジェクション攻撃を避けますか? – KentZhou

+0

はい、 "特別な"文字を扱うので、SQLインジェクションに脆弱ではありません。 – nos

0

パラメータを設定するには、実際にjava.sql.PreparedStatementを使用する必要があります。コードの変更は最小限でなければならず、ユーザーの入力を逃れようとしてもそれほど問題はありません。

3

私はあなたがそれのような

String sql = "Select Column from tab where column='" + StringParm + "'"; 

か何かのようないくつかの方法でSQLを構築推測していますか?これを行うと、あらゆる種類の攻撃が可能になり、結果として得られる文字列はもはや有効なSQLではなくなってしまいます。最初にユーザーが指定したパラメータからエスケープする必要があります。

最善の解決策は、あなたが

Statement stmt = conn.prepareStatement("Select Column from tab where column=?"); 
stmt.setString(1,StringParam); 

を行うので、PreparedStatementsのを使用することです私はバーが、おそらくその前に入力をサニタイズ/エスケープ、しかし任意のJavaコードを変更することなく、あなたの問題を解決するための任意の簡単な方法を参照することはできませんあなたのコードにヒットします(例えばwebappの場合はjavascript)

+0

あなたの解決策でアポストロフィ( ')文字を取り除く必要があると思います。それ以外の場合は、疑問符を含む文字列リテラルになります。 –

0

アプリケーションを変更せずにこれを修正することはできません。 SQL Serverは引用符を処理できますが、動的SQLコマンドを作成するときにアプリケーション(Javaコード)が引用符を正しくエスケープしていません。私はストアドプロシージャを使用し、パラメータを渡すことを好む、このように引用符の問題や注射は決してありません。

0

これを解決するには、データベースにトリガを入れてエントリをクリーンアップします。つまり、挿入を試みたときに、適切なエスケープ処理を行い、新しい挿入入力を続行します。しかし、これは間違ったレイヤーであり、おそらくそこでは行われないはずです。はるかに良い解決策(IMO)は、準備されたステートメントを使用し、JDBCがあなたのためにエスケープ作業をするように可変置換を行うことです。

関連する問題