BACK
2019-10-11

MojoliciousのTest::MojoでCSRF対策済みのAPIのテスト

とてもピンポイントです。まあハマったのでメモ。
MojoliciousというのはPerlのWebフレームワークです。
割と使いやすい。

さて、CSRF対策したらAPIのユニットテスト動かない参ったぁぁぁ、、、
という貴方はごく少数だと思いますが、
一応動いたのでまとめます。最適かどうかは知らない(下にコメントplz)

csrf_protectはSessionに入ってるトークンと、
ユーザから投げられるトークンを突き合わせて、合ってたらOKという仕組みです。
なので必要な追加要件はこんな感じです。

a. トークンの発行
b. MojoliciousのSession(cookie)にトークンをはめる
c. POSTパラメータかHeaderにトークンをはめる
d. あとは普通にリクエスト

トークンはDefaultHelperのcsrf_tokenで発行できます。これをセッションとヘッダにはめていきます。
厄介なのはセッションです。
Mojoliciousのセッションはご存じの通りCookieに保存されています。

これは下記の手順で再現できます。
1. key-valueなJSONを準備
2. 1をシリアライズ(string)
3. BASE64エンコード
4. 3にチェックサムをつける
5. cookieにはめる

なんか長いですが、ソースにすると数行です。
1~3はMojolicious::Sessions->store、
4はMojolicious::Controller->signed_cookie、
5はMojo::TestのDocに書いてあります。

エッセンスは下記。
これ自体は動かしてないので、そのままコピペしても動かない、と思う。

use Test::Mojo;
use Mojo::Util;

# Token生成
my $token = $t->c->csrf_token;

# Sessionのハッシュ
my $session = {
'csrf_token'=>$token,
'expires'=>time+3600,
};

# シリアライズして、BASE64エンコード
my $value = b64_encode &Mojo::JSON::encode_json($session, '');
$sum = Mojo::Util::hmac_sha1_sum("$name=$value", $t->c->app->secrets->[0]);

# 値とチェックサム--で繋げる
my $enc_sess = "$value--$sum";

# ヘッダとCookieに値をはめて、あとは普通に送信
my $tx = $t->ua->build_tx(POST => '/hogehoge');
$tx->req->headers->append('X-CSRF-Token', $token);
$tx->req->cookies({name => 'sid', value => 'セッション値'});
$tx->req->cookies({name => $t->c->app->sessions->cookie_name, value => $enc_sess});


あとはきあいで(ぇ

Comments

ロジェ?デュブイスーパーコピー
ロジェ?デュブイスーパーコピー時計等のブランド時計コピーを販売しています。弊店はNOOB自社製のスーパーコピー時計のみ取り扱っていますので、品質がより安定しています。ロジェ?デュブイコピー時計はご注文から1週間でお届け致します。
http://www.ikebukuro777.com/
http://www.ikebukuro777.com/goods/kind_96_1.html

muinjhnbj
IEpMTt <a href="http://alhxfvhcdjtj.com/">alhxfvhcdjtj</a>, [url=http://ltdrqtpmdaec.com/]ltdrqtpmdaec[/url], [link=http://ahkxuyeqoaiq.com/]ahkxuyeqoaiq[/link], http://tmgiorqvqjtr.com/
PhEuMedz
buy viagra cheap uk <a href=" https://edmedz.com/# ">buy cialis online canadian no prescription</a> cheap viagra pills
PhEuMedz
order viagra cialis <a href=" https://edmedz.com/# ">cialis buy thailand</a> buy cialis online in u.k
PhEuMedz
levitra buy generic <a href=" https://edmedz.com/# ">cialis online order canada</a> where do i buy viagra yahoo
PhEuMedz
cheap cialis generic canada <a href=" https://edmedz.com/# ">how to buy viagra at boots</a> cheap cialis europe
PhEuMedz
viagra cialis <a href=" https://edmedz.com/# ">cialis price walmart</a> cheap viagra birmingham
PhEuMedz
herbal viagra sale uk <a href=" https://edmedz.com/# ">cheap viagra in europe</a> buy viagra qatar
PhEuMedz
viagra sale hyderabad <a href=" https://edmedz.com/# ">viagra online discount</a> cheapest place to get cialis
PhEuMedz
red pill like viagra <a href=" https://edmedz.com/# ">generic cialis tadalafil best buys</a> buy cialis vegas
MedEdMedz
buy viagra pills online https://edmedz.com viagra sale high street
EuMedzPh
buy levitra cialis viagra <a href=" https://edmedz.com/# ">cialis professional</a> buy viagra generic canada
MedEdMedz
discount viagra cialis levitra https://edmedz.com viagra online canadian pharmacy
MedEdMedz
buy cialis online mastercard https://edmedz.com buy viagra legally uk
MedEdMedz
herbal viagra sale https://edmedz.com liquid viagra buy uk
EuMedzPh
buy cheap cialis usa visa <a href=" https://edmedz.com/# ">cheap levitra india</a> order viagra thailand
MedEdMedz
generic levitra for sale https://edmedz.com cialis sale philippines
name:  空(Bot避け):


BACK