アプリ版:「スタンプのみでお礼する」機能のリリースについて

タイトルの通り、SQLインジェクション対策として、文字のエスケープ処理を行おうと考えています。
言語はJavaです。StringクラスのreplaceAllメソッドを使おうと考えています。

例えば以下の文字列の場合、
"AAA%BBB\%CCC"
%という字を\%に置き換えようと思うのですが、そのまま%を\%に変更してしまうと、
"AAA\%BBB\\%CCC"
となってしまいます。
これを防ぐため、1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたいのですが、うまく行きません。
例えば
replaceAll("[^\\\\]%","\\\\%");
という風にすると、
"AA\%BBB\%CCC"
という風に1文字欠けてしまいます。

また、' (シングルクオーテーション)も同じような問題をかかえています。
単純に'を''に変えるのではなく、''となっている物はそれ以上変更を加えたくないのです。

・・・そもそも本来、そういう文字列が渡されないような仕様にするべきなのですが、それもなかなか安心できず、出来れば実装したいのです。
どなたか方法を教えて頂けないでしょうか。

A 回答 (3件)

MicrosoftのAccessしか使ったことがない者ですが・・・



> 1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたい

以下のような手順を踏むというのはいかがでしょうか;
 1)変換されたくない「\%」を、別の文字に置き換える
  *データに含まれてない文字であることが大前提になります*
   (私の場合は、「§」を使用しています)
 2)「%」を「\%」に変換
 3)最初に置き換えた文字を、「\%」に再変換

こうすれば、「"AAA%BBB\%CCC"」を「"AAA\%BBB\%CCC"」に変換
することができます。


独学・我流なのでセオリーを外しているかもしれませんが、参考までに。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/13 00:21

がると申します。


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

要求されているoutputによって、返答が異なってしまうので。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/13 00:20

文字列の置き換えは神経使いますよね。


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

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

お礼日時:2007/02/13 00:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!