掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VBからDBへのシングルコーテーション対応 (ID:141678)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 工数を考えると共通化できないものかと思いまして・・・ 共通化できるかどうかは、ソース全体を見渡した後、初めて言えることなので、 ソースを見れない第三者には判断できないように思います。一般論を語れるだけかと。 > ですがこの対応では画面→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 にしなければならないでしょう。 (エスケープ文字は \ で無くとも良いですが)
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.