やっぱりエスケープは必要
K-enq.tdを作ってはテスト、作ってはテストを繰り返しているのですが、今日、シングルクオートをポストしたら、sqlite3が例外を出しました。ああ、やっぱり、クオートやらはエスケープしてやらんといかんのですね。
Pythonのドキュメントを見ると、
クエリーを Python の文字列操作を使って構築することは、安全とは言えないので、すべきではありません。
http://www.python.jp/doc/release/lib/module-sqlite3.html
とあるんですが、これがそのことなんでしょう。実際私はよくわかってなかったので、%を使った文字列フォーマット操作をこれまで使ってきて(Never do this -- insecure! と書いてあるのにね)、なので、次の出勤日にでも、これを書き換えます。けど、テーブル名の指定を文字列フォーマット操作でやっとんのよね。これも書き換えか。ちょっとめんどくさいけど、まあ仕方ないか。
これとは別に、ユーザーに入力させた値をエスケープする必要もありそうで、それはcgi.escape()を使ってもいいけど、自分で書いてもいいかな。なんて思って、以前Perlで書いたBBSで使っていた関数を、メモがわりにここに掲載しておくことにします。けど、これ見ると、別にcgi.escape()でもいいかな。ただ、改行コードのエスケープをどうするか。これは決めといた方がよさそうです。
sub sanitate_parameter { my $self = shift; my $value = shift; my $brbool = shift; if ($value ne '') { $value =~ s/&/&/g; $value =~ s/@/@/g; $value =~ s/"/"/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\0//g; if ($brbool) { $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/\n\n+/<br><br>/g; $value =~ s/\n/<br>/g; } else { $value =~ s/\r//g; $value =~ s/\n//g; } } return $value; } sub desanitate_parameter { my $self = shift; my $value = shift; my $brbool = shift; if ($brbool) { $value =~ s/<br>/\n/g; } $value =~ s/&/&/g; $value =~ s/"/"/g; $value =~ s/</</g; $value =~ s/>/>/g; return $value; }