• ベストアンサー

SQLインジェクション対策で、エスケープ処理を行おうとしています。

タイトルの通り、SQLインジェクション対策として、文字のエスケープ処理を行おうと考えています。 言語はJavaです。StringクラスのreplaceAllメソッドを使おうと考えています。 例えば以下の文字列の場合、 "AAA%BBB\%CCC" %という字を\%に置き換えようと思うのですが、そのまま%を\%に変更してしまうと、 "AAA\%BBB\\%CCC" となってしまいます。 これを防ぐため、1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたいのですが、うまく行きません。 例えば replaceAll("[^\\\\]%","\\\\%"); という風にすると、 "AA\%BBB\%CCC" という風に1文字欠けてしまいます。 また、' (シングルクオーテーション)も同じような問題をかかえています。 単純に'を''に変えるのではなく、''となっている物はそれ以上変更を加えたくないのです。 ・・・そもそも本来、そういう文字列が渡されないような仕様にするべきなのですが、それもなかなか安心できず、出来れば実装したいのです。 どなたか方法を教えて頂けないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

MicrosoftのAccessしか使ったことがない者ですが・・・ > 1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたい 以下のような手順を踏むというのはいかがでしょうか;  1)変換されたくない「\%」を、別の文字に置き換える   *データに含まれてない文字であることが大前提になります*    (私の場合は、「§」を使用しています)  2)「%」を「\%」に変換  3)最初に置き換えた文字を、「\%」に再変換 こうすれば、「"AAA%BBB\%CCC"」を「"AAA\%BBB\%CCC"」に変換 することができます。 独学・我流なのでセオリーを外しているかもしれませんが、参考までに。

tennyasu
質問者

お礼

お返事をお待たせして申し訳ありません。 実は質問した直後に解決してしまったのです。 結論としてはpreparedStatementのエスケープ処理に依存する形としました。 本当にありがとうございました。

その他の回答 (2)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がると申します。 ちと質問なのですが。 "AAA%BBB\%CCC" という文字列をどのように変換されたいのでしょうか? 通常、エスケープ処理ですと "AAA\%BBB\\\%CCC" だと思われるのですが、どうでしょうか? 要求されているoutputによって、返答が異なってしまうので。

tennyasu
質問者

お礼

お返事をお待たせして申し訳ありません。 実は質問した直後に解決してしまったのです。 結論としてはpreparedStatementのエスケープ処理に依存する形としました。 本当にありがとうございました。

回答No.1

文字列の置き換えは神経使いますよね。 どういう場面で SQL 文字列を生成するのか分かりませんが、私ならストアド プロシージャを作成しちゃいます。 これなら与えた文字列は単なるパラメータ値として扱われますので神経を使わなくても済むし。

tennyasu
質問者

お礼

お返事をお待たせして申し訳ありません。 実は質問した直後に解決してしまったのです。 結論としてはpreparedStatementのエスケープ処理に依存する形としました。 本当にありがとうございました。

関連するQ&A