某社内システムの保守を行うものです。
社内システムはVBで稼動し、社内DB(Oracle)を管理しています。
現在システム内で今まで禁則文字であったシングルコーテーションに対応しなければならない状況にいます。。。
単純に考えた私はテキストボックスからの入力箇所にのみreplace(String,"'","''")のように対応しました。
ですがこの対応では画面→Aテーブルのパターンなら対応できますが、Aテーブルからデータを取得してBテーブルへ、またはA→Aテーブルへ更新の場合などに結局エラーとなってしまいます。
全Insert・Update句に対してReplaceをかければいい話なのですが、テーブル数だけで300以上あるので、工数を考えると共通化できないものかと思いまして・・・
駄目なら駄目で諦めますので、よろしくお願いします。
> 工数を考えると共通化できないものかと思いまして・・・
共通化できるかどうかは、ソース全体を見渡した後、初めて言えることなので、
ソースを見れない第三者には判断できないように思います。一般論を語れるだけかと。
> ですがこの対応では画面→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 にしなければならないでしょう。
(エスケープ文字は \ で無くとも良いですが)