今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

ASP.NET Core MVC CSRF対策を調べてみた

Webシステムの脆弱性CSRF (Cross-Site Request Forgery)
いわゆる、クロスサイトリクエストフォージェリがあります。
その対策として
フォーム側にトークンを埋め込んで、受ける側でトークンを検証することで
自サーバーからのPOSTであることが保証されます。
ASP.NET Core MVCではどのようにするのか調べてみました。
Visual Studio Community 2017 for Mac で動作確認しています。

View側の記述

タグヘルパーでFormを記述します。

<form asp-action="Index" method="post">

すると、Formの中にトークン情報が仕込まれます。
hidden属性で __RequestVerificationToken のvalue
トークン情報がセットされます。

Controller側の記述

POSTを受けるController側にも記述します。

   [HttpPost]
   [ValidateAntiForgeryToken]
   public IActionResult Index(ItemGrpViewModel model)

[ValidateAntiForgeryToken]を記述するだけです。
実際に効いているか確認してみます。
Chromeデベロッパーツールで__RequestVerificationToken のvalueの中身を変更して
Submitしてみます。

f:id:Heinlein:20180201141505p:plain
きちんとエラーではじかれました。

最後にもっと便利な方法がありました

[ValidateAntiForgeryToken]をいちいち全てのPOSTアクションへ記述するのは
面倒だし忘れてしまうかもしれません。
それを一括で可能にする方法がありました!

  [AutoValidateAntiforgeryToken]
  public class HomeController : Controller
  {

Controllerのクラス定義の上に [AutoValidateAntiforgeryToken]を記述することで
全てのPOSTアクションに適用することができます。
もちろんGETアクションにはそのまま利用できます。

このへんはさすがによくできていて、簡単に実装することができます。
もう一から自力で、フルスクラッチで開発しようなどと
とても思わないですね。