end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

perl による 素朴な csrf 対策用 token発行 と 照合

http://www.kent-web.com/perl/crypt/step05.html

上記urlを参考に、以下のような methodを活用すれば、良い気がします

use Digest::MD5;


sub get_csrf_token {
    my ($self) = @_;

    # 8文字のランダム文字列をsaltに使用します
    my @salt_chars = ('a' .. 'f', 0 .. 9);
    my $salt_str;
    for (1 .. 8) {
        $salt_str .= $salt_chars[int(rand(@salt_chars))];
    }

    my $org_token = join('', $salt_str,$self->{user}->{id});
    my $enc_token = Digest::MD5::md5_hex($org_token);
    my $csrf_token = join('',$salt_str, $enc_token);

    return $csrf_token;
}

sub chk_csrf_token {
    my ($self,$csrf_token) = @_;

    my $salt_str = substr($csrf_token,0,8); # 先頭にあるsalt値取得
    my $org_token = join('', $salt_str,$self->{user}->{id});
    my $enc_token = Digest::MD5::md5_hex($org_token);

    if( $csrf_token eq "$salt_str$enc_token" ){
        return 1;
    }

    return;
}