やっぱりエスケープは必要

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/</&lt;/g;
        $value =~ s/>/&gt;/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/&amp;/&/g;
    $value =~ s/&quot;/"/g;
    $value =~ s/&lt;/</g;
    $value =~ s/&gt;/>/g;
    return $value;
}