- ベストアンサー
SQLインジェクション対策で、エスケープ処理を行おうとしています。
タイトルの通り、SQLインジェクション対策として、文字のエスケープ処理を行おうと考えています。 言語はJavaです。StringクラスのreplaceAllメソッドを使おうと考えています。 例えば以下の文字列の場合、 "AAA%BBB\%CCC" %という字を\%に置き換えようと思うのですが、そのまま%を\%に変更してしまうと、 "AAA\%BBB\\%CCC" となってしまいます。 これを防ぐため、1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたいのですが、うまく行きません。 例えば replaceAll("[^\\\\]%","\\\\%"); という風にすると、 "AA\%BBB\%CCC" という風に1文字欠けてしまいます。 また、' (シングルクオーテーション)も同じような問題をかかえています。 単純に'を''に変えるのではなく、''となっている物はそれ以上変更を加えたくないのです。 ・・・そもそも本来、そういう文字列が渡されないような仕様にするべきなのですが、それもなかなか安心できず、出来れば実装したいのです。 どなたか方法を教えて頂けないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
MicrosoftのAccessしか使ったことがない者ですが・・・ > 1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたい 以下のような手順を踏むというのはいかがでしょうか; 1)変換されたくない「\%」を、別の文字に置き換える *データに含まれてない文字であることが大前提になります* (私の場合は、「§」を使用しています) 2)「%」を「\%」に変換 3)最初に置き換えた文字を、「\%」に再変換 こうすれば、「"AAA%BBB\%CCC"」を「"AAA\%BBB\%CCC"」に変換 することができます。 独学・我流なのでセオリーを外しているかもしれませんが、参考までに。
その他の回答 (2)
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 ちと質問なのですが。 "AAA%BBB\%CCC" という文字列をどのように変換されたいのでしょうか? 通常、エスケープ処理ですと "AAA\%BBB\\\%CCC" だと思われるのですが、どうでしょうか? 要求されているoutputによって、返答が異なってしまうので。
お礼
お返事をお待たせして申し訳ありません。 実は質問した直後に解決してしまったのです。 結論としてはpreparedStatementのエスケープ処理に依存する形としました。 本当にありがとうございました。
- temtecomai2
- ベストアンサー率61% (656/1071)
文字列の置き換えは神経使いますよね。 どういう場面で SQL 文字列を生成するのか分かりませんが、私ならストアド プロシージャを作成しちゃいます。 これなら与えた文字列は単なるパラメータ値として扱われますので神経を使わなくても済むし。
お礼
お返事をお待たせして申し訳ありません。 実は質問した直後に解決してしまったのです。 結論としてはpreparedStatementのエスケープ処理に依存する形としました。 本当にありがとうございました。
お礼
お返事をお待たせして申し訳ありません。 実は質問した直後に解決してしまったのです。 結論としてはpreparedStatementのエスケープ処理に依存する形としました。 本当にありがとうございました。