私はSQL Injectionの定義をちゃんと知ってる訳ではないけど
大体やる事は分ってます。
・バインドを使用する(シングルコーテーションとかへの対策)
・エスケープ処理を行う(like検索時の%_対策)
今回はこのエスケープ処理に関するメモです。
エスケープ処理は入力値(バインドに渡すパラメータ)に
"%"、"_"が入ってた時に行うものです。
"%"は正規表現でいうところの"*"(%以降はなんでもあり)に、
"_"は同じく"."(1文字分だけなんでもあり)に相当してたと思います。
エスケープ処理としてはこの"%"、"_"の前にエスケープ文字を
付加する訳ですが、ただ付加するだけではダメだったりします。
エスケープ文字は固定の文字ではなく自分で決めれるようですが、
この文字がエスケープだよって事を明示的に書く必要があります。
それが"ESCAPE '文字'"です。
なのでエスケープ処理としては
・"%", "_"の前にエスケープ文字を追加(値編集)
・項目の後ろにESCAPE文を追加(SQL編集)
という2段階に分かれます。
エスケープを行ったあとの具体的な例:
入力値 → エスケープ後
COLUMN_A LIKE 'Orange100%Juice' → COLUMN_A LIKE 'Orange100%Juice%' ESCAPE ''
こんな感じです。
(最初の%は入力値としての%で最後の%は前方一致としてプログラム内部で付加した%)
バインドを絡めると
COLUMN_A LIKE ? → COLUMN_A LIKE ? ESCAPE ''
これがSQLでパラメータは別途エスケープ編集+LIKE文用の%付加処理が必要になります。
ちなみにエスケープ処理としてはこんな感じですが、
実際にはまずそもそもその項目に%という値は入ってるの?
ってとこからまず入っていく事になるんじゃないかな。
そもそも値として%禁止の項目であればSQLにまで到達させずに
事前に入力チェックで弾く事になると思います。
PR