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


これまで、「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してみます。

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 アプリケーションでは、これを使うことはほとんど無いように思います。