perlメモ:SQLite等でSQL使用時の文字列のエスケープ
Posted by kumacchi on 2008年4月17日 , No comment
データベースのデータをアップデートするのにこんな感じのコード書いちゃってました。orz
my $SQL = “UPDATE EXAMPLE_TBL SET”;
$SQL .= ” EXAMPLE=’ KUMA’s test ‘ “
$SQL .= ” WHERE EXAMPLE_ID= ‘ABCD’ ”;
$hDB->do($SQL);
こんなエラーが出ます。
near “s”: syntax error(1) at dbdimp.c line 271
何が問題かっていうと、「’ KUMA’s test ‘」UPデートし様としている文字列の中に「’」シングルクオートが含まれているのにエスケープせずにアップデートしちゃおうとしてます。
何たる不覚、こんなことも忘れていたとはorz
上のエラーの意味がわからず1時間程悩みました。
上のエラーの意味は「s」なんて文法しらねーよって怒られてます。
KUMA’sの「’」(シングルクォーテーション)のところで文字列が途切れちゃってるので「s」がコマンドだと思われちゃったわけです。「SQLインジェクション」です。セキュリティーホールです。おいらバカです。
エスケープの仕方がわからなくて検索しまくったわけですが、なかなか見つからなくて渋ったのですが、やっと見つけたのが下記のサイトです。
prepare関数を使ったバインドメカニズムを使うのが良いようです。
■情報処理推進機構:情報セキュリティ 2-1. SQL組み立て時の引数チェック
http://www.ipa.go.jp/security/awareness/vendor/programming/a02_01.html
(Visited 266 times, 1 visits today)
カテゴリ:
データベース