発生したエラー
ngrokはローカルの開発サーバーをインターネットに外部公開できるサービスです。
localhost:xxxx等をインターネット上に公開できるので非常に便利です。
$ ngrok http (port)で早速以下のように公開することが出来ました。
Forwarding https://xxxxxx.ngrok-free.app -> http://localhost:xxxx
https://xxxxxx.ngrok-free.appにブラウザからアクセスしてみると、以下のようなエラーが発生します。
これは「許可されていないホストなのでアクセスをブロックしましたよ」という内容になっています。
このようになる理由は、Rails6から追加されたDNSリバインディング攻撃を防止するActionDispatch::HostAuthorizationが関係しているようです。
セキュリティ上、許可されていない任意のhost名を持つリクエストはブロックしておきたいということです。
対処法
ngrokの性質上、数時間ごとにURLが入れ替わってしまうため、正規表現を用いてngrokで生成されたURLであるなら何でも許可されるようにします。
以下のコードを開発環境の設定項目として追加します。
# config/environments/development.rb
config.hosts << /[a-z0-9\-]+\.ngrok\-free\.app/
このようにすることで、ngrokが生成したURLが入れ替えられても毎回設定を書き換える必要なく許可をした状態になります。
注意点
ngrokの仕様変更で生成されるURLが変わるケースがあるようです。
以前は「/xxxxxxx.jp.ngrok.io」のように生成されていました。
今後変更された場合は、正規表現を用いて生成される範囲をカバーできるように設定項目に許可を書きましょう。
また、許可する必要がなくなったらきちんと設定項目の中から消しておく必要があります。
なお、これはngrok特定の話ではなく、許可されたホストの通信のみ許可する設定に関するものなので、「任意のホストの通信を用いる場合」というスコープの知識として記事に残しています。
