しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure App Service の認証は POST 時に Referer をチェックしているので注意

Site Extension として公開している phpMyAdmin が何故かボタンなどを押した時に 403 になるという報告があり、App Service チームの人達と調べてました。

普段から Edge を使っている自分は再現できませんでしたが、その時に Referer が必要と知りました。

最初は SCM 側の認証だけかと思ってましたが、調べてみると App Service の認証でも同様に POST 時には Referer をチェックしていて、HTML の書き方によっては特定のブラウザではエラーになることがあります。

App Service の認証については以下のドキュメントを参考にしてください。ぶちぞう RD 推薦の機能です。

phpMyAdmin が動かなかった理由は Referrer Policy が no-referrer になっていたことでした。てっきり、同一オリジンの場合には付いてくるものだと思ってましたが、絶対に出さない設定もあるようです。

http://www.w3.org/TR/referrer-policy/

Edge では動いていた理由は、phpMyAdmin が新しい書き方のみ採用していたからでした。Edge は微妙に古い書き方のみ対応しているので、影響を受けることなく Referer が付いていました。

ちなみに GET では Referer が付いていなくても問題ありません。POST の時に問題となります。

最後に実際に検証してみます。簡単に meta referrer を設定したファイルと、設定していないファイルを用意して F12 開発ツールで通信を確認するだけです。Edge で試したので設定は古いものを使っています。

<html>
    <head>
        <meta name="referrer" content="never" />
        <title>test</title>
    </head>
    <body>
        <form action="no-referrer.php" method="post">
            <input type="text" name="username" />
            <br />
            <button type="submit">submit</button>
        </form>
    </body>
</html>

Chrome や Firefox では never ではなく no-referrer を使います。両方書いておいても良いです。

最初に meta referrer を付けていない方で POST リクエストを行いました。200 が返ってきていて、問題なくリクエストが処理されていることが分かります。

f:id:shiba-yan:20170313222435p:plain

今度は meta referrer を付けた方で POST リクエストを行いました。リクエストヘッダーからは Referer が無くなっていて、ステータスコードは 403 が返ってきています。

f:id:shiba-yan:20170313222441p:plain

何で POST の Referer をチェックしているのかと思われそうですが、単純に CSRF 対策でしょう。

同じく phpMyAdmin が常に no-referrer を設定しているのはセキュリティのためでしょうが、個人的には origin と no-referrer が選べても良かったのではないのかと思いました。