LoginSignup
4
2

More than 3 years have passed since last update.

ASP.NET Core RazorPagesの偽造防止トークン

Posted at

これまで、「ASP.NET Core 3.0 RazorPages事始め」ってタイトルを使ってたけど、今回から「事始め」は取ることにします。

formタグヘルパーの偽造防止トークン

Razor Pages では、FormTagHelperが form要素に偽造防止トークンを挿入してくれます。

<form method="post">
    ...
</form>

これで、以下のような非表示のinputタグ(偽造防止トークン)が自動挿入されます。

 <input name="__RequestVerificationToken" type="hidden" value="CfDJ8Kws0PPAm1NChsmiTNfRcsX0TTepdsJf6F51WcaEnzEJH9W0IvKaCaoa7btzRNswqHlUXgzrHgA6rfcka5Jqt3u_93IMOSpOLtDRapBkHEPPhl7sGZ1lwyYlgzEcYpAcGKNeK-zL_8IaHnwMa0-viyY" />

これは、クロスサイトリクエストフォージェリ(Cross site request forgeries、CSRF)と呼ばれる脆弱性対策を行うためのものです。

試しに、ブラウザの開発者ツールを使ってトークンを書き替えてsubmitしてみます。

スクリーンショット 2019-11-23 20.26.00.png

HTTP ERROR 400 のエラーになりました。

AutoValidateAntiforgeryToken 属性

調べてみたら、AutoValidateAntiforgeryToken とか ValidateAntiForgeryToken という属性があるんですが、自動生成されたソースにはこれらの属性を使っている個所はどこにもありません。

デフォルトで、AutoValidateAntiforgeryToken が適用されてるようです。

偽造防止トークンを生成しない

asp-antiforgery="false"

次のように書くと偽造防止トークンは生成されません。

<form method="post"  asp-antiforgery="false">
    ...
</form>

まあ、あえてそうする理由は普通はないと思いますが...

IgnoreAntiforgeryToken 属性

IgnoreAntiforgeryToken属性を使うと、特定のページ あるいは、特定のページハンドラ(どうもこの名前が覚えられない...)だけ、偽造防止トークンの必要性を無くすことができます。

試しに、チュートリアルで作成したプログラムの EditModel クラスにIgnoreAntiforgeryToken 属性を適用してみます。


    [IgnoreAntiforgeryToken]
    public class EditModel : PageModel
    {

今度は、ブラウザの開発ツールで、トークンを書き替えてもエラーにならずに、データを更新することができました。

この属性も前述のasp-antiforgeryと同様に、通常の RazorPages アプリケーションでは、これを使うことはほとんど無いように思います。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2