2012-03-11 15 views
4

私はmySQLを使っています。 'がデータベースに追加されている文字列に含まれている場合は処理できません。java 'と'を置換してください

私が試した:

replaceAll("'","\\'") 

replaceAll("'","\'") 

を任意のアイデア私は\''の交換については行くだろうか?

+0

実際の問題は、 'PreparedStatement'を使用する代わりに、実行時にSQLクエリを動的に構築することだと思います。データベースに挿入するコードの詳細を表示してください。ほとんどの場合、手動でエスケープする必要はありません。 –

+0

私はPreparedStatementが何であるかわかりません。私は単純なWebページを作成しています。 – user1163278

+0

下記のJB Nizetの答えをチェックしてください。彼はサンプルコードとJDBCチュートリアルの関連するセクションへのリンクを提供しています。これは重要です。 'PreparedStatement'は、ほとんどの場合、より安全で、よりクリーンで、より高速なコードになります。 –

答えて

8

あなたは正規表現エンジンに一度、文字列処理エンジン用と1回、2回、バックスラッシュをエスケープする必要があります。

replaceAll("'","\\\\'") 

警告:これは文字列にバックスラッシュを挿入する方法についての質問に答える一方でSQLインジェクション攻撃を阻止しようとする試みには使用しないでください。

明確にする:アポストロフィーがすでにエスケープされている文字列を誰かが送信したとします。。この正規表現は、アポストロフィがエスケープされていないになります(これは、バックスラッシュがエスケープされるようになるためです)。実際には、この正規表現はバックスラッシュが偶数の場合にのみ、アポストロフィをエスケープする必要があります。これは、

replaceAll("(?<!\\\\)((?:\\\\\\\\)*)'", "$1\\\\'") 

のように急速に維持されなくなり、すべてのケースをカバーしていません。

+1

違反はありませんが、これは明らかに質問に答えていますが、私は実際の問題の周りだけで動作すると思います:) –

+0

ありがとう、それはそのトリックでした。 8分で受け入れられるように印を付けてください。 – user1163278

+5

@PhilippReichart:私の意見では、JB Nizetの答えは受け入れられるべきです。 –

18

これを処理するために文字列置換を使用しないでください。代わりに、プリペアドステートメントを使用しますので、JDBCドライバはあなたのためのパラメータをエスケープしてみましょう:

String sql = "select a.foo from a where a.bar = ?"; 
PreparedStatement stmt = connection.prepareStatement(sql); 
stmt.setString(1, aStringWhichMightContainQuotes); 
ResultSet rs = stmt.executeQuery(); 

これはつまり、SQLインジェクション攻撃に対して脆弱ではありません、データベースに依存しない、堅牢なコードを持っている適切な方法です。また、異なるパラメータで同じクエリを複数回実行すると、より効率的になります。

詳細については、JDBC tutorialを参照してください。

関連する問題