VBからDBへのシングルコーテーション対応


テケテケ  2009-03-12 15:02:00  No: 141677  IP: 192.*.*.*

某社内システムの保守を行うものです。
社内システムはVBで稼動し、社内DB(Oracle)を管理しています。

現在システム内で今まで禁則文字であったシングルコーテーションに対応しなければならない状況にいます。。。
単純に考えた私はテキストボックスからの入力箇所にのみreplace(String,"'","''")のように対応しました。

ですがこの対応では画面→Aテーブルのパターンなら対応できますが、Aテーブルからデータを取得してBテーブルへ、またはA→Aテーブルへ更新の場合などに結局エラーとなってしまいます。


全Insert・Update句に対してReplaceをかければいい話なのですが、テーブル数だけで300以上あるので、工数を考えると共通化できないものかと思いまして・・・
駄目なら駄目で諦めますので、よろしくお願いします。

編集 削除
魔界の仮面弁士  2009-03-12 17:29:34  No: 141678  IP: 192.*.*.*

> 工数を考えると共通化できないものかと思いまして・・・
共通化できるかどうかは、ソース全体を見渡した後、初めて言えることなので、
ソースを見れない第三者には判断できないように思います。一般論を語れるだけかと。



> ですがこの対応では画面→Aテーブルのパターンなら対応できますが、
> Aテーブルからデータを取得してBテーブルへ、またはA→Aテーブルへ更新の場合などに
> 結局エラーとなってしまいます。

「'」があろうと無かろうと、適切なコーディングを行えば、
エラーにはならないはずです。

エラーになるのだとしたら、それは「エスケープするのを忘れていた」か
「エスケープすべきでは無い箇所でエスケープした」では無いでしょうか。

——たとえば、「エスケープ結果を、さらに(二重に)エスケープしてしてしまった」とか。



> replace(String,"'","''")のように対応しました。
全てをそうするわけでは無いですよね。たとえば、ADODB.Recordset を使って更新するなら
  RS.Fields("Name").Value = Text1.Text

  RS.Fields("Name").Value = Replace(Text1.Text, "'", "''")
にしてしまってはマズイでしょうし。

INSERT/UPDATE/DELETE の SQL を使って更新するのだとしても、パラメータ化して
ADODB.Command/Parameter オブジェクトを使って行うようにすれば、
「'」のエスケープは不要となるでしょう。


ただし、検索条件が複雑な場合など、WHERE 文を動的生成しなければいけない
場合など、パラメータ化が困難な場合には、SQL を直接生成せざるを得ないので、
「'」→「''」といった処理が必要になるでしょう。

この場合、SQL における特殊文字のサニタイジング(無害化)のために
考慮すべきは、シングルコーテーションだけではありません。

下記記事の最後「SQL文で危険な文字列」も確認しておいてください。
http://www.geocities.jp/ikepy0n/SQLInjectin.html


たとえば LIKE 検索。商品名に『100%』を含む商品を探すために、
  Text1.Text = "100%"
  S = "SELECT * FROM 商品 WHERE 名称 LIKE '%" & Replace(Text1.Text, "'", "'') & "%'"
という SQL にしてしまうと、「リンゴジュース/果汁100%」だけではなく、
「ハイシー 1000」までヒットしてしまうことになります。

この場合は、
  WHERE 名称 LIKE '%100%%'
ではなく、
  WHERE 名称 LIKE '%100\%%' ESCAPCE '\'
という SQL にしなければならないでしょう。
(エスケープ文字は \ で無くとも良いですが)

編集 削除