perlメモ:SQLite等でSQL使用時の文字列のエスケープ

データベースのデータをアップデートするのにこんな感じのコード書いちゃってました。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

タグ : , , ,