Cloudflare PagesでPHPを対象にしたリクエストをブロックする
この記事では、Cloudflare Pagesの設定を使って任意のパスに対するリクエストをブロックする方法が紹介されています。具体的には、_routes.jsonファイルを使用して特定のパスを除外する設定を行い、不正なリクエストを防ぐ手順が詳細に述べられています。設定後には、cUrlを使用して変更が正常に動作するかをテストし、注意点やリスクについても言及されています。
目次
この記事では、Cloudflare Pagesの設定を使って任意のパスに対するリクエストをブロックする方法を紹介します。
背景: 謎のSentry無料枠アラート
このサイトは2024年10月時点でRemixをCloudflare Pagesにデプロイして公開しています。ある程度表示や動作のテストを済ませてデプロイしたのですが、リニューアルから1ヶ月たたずにSentryから無料枠を使い切ったとの通知がありました。
見えないところでエラーが色々出ていたのかなと思い、Sentryに残っているエラーログの調査をしたところ、次のようなエラーイベントが大量に記録されていました。/wp-content/plugins/Cache/Cache.php
にアクセスしようとした際に、Remixがアプリケーションエラーを出していた様子です。
どうもネストの深い、存在しないパスにアクセスするとエラーが起きていた様子で、これはローカルでも再現しました。これ自体は要修正なのですが、存在しないURLへのリクエスト、しかも悪意のあるリクエストを送信するための調査にしか見えないもので4.5kもエラーを起こされてはたまらないので、追加の対策を入れる事にしました。
_routes.json
で除外する
Cloudflare PagesではPages Functionを起動するパスかどうかの設定を_routes.json
で行えます。ここでexclude
のパスをいくつか追加しました。
{
"version": 1,
"include": ["/*"],
"exclude": [
"/wp-content/*",
"/wp-includes/*",
"/wp-admin/*",
"/*.php",
"/favicon.ico",
"/assets/*"
]
}
パスを見る限りどうみてもWordPressサイトを狙ったリクエストですので、思いつくパスを一通りブロック対象にしています。このファイルをPagesへデプロイすれば、設定完了です。
cUrlで変更をテストする
それでは実際に設定が機能しているか確認しましょう。
設定前はサーバーエラーが発生する
この変更とバグ修正をデプロイする前のバージョンに対してリクエストを投げてみました。Sentryにエラーが残っていたことから予想していたとおり、HTTP 500エラーが発生しています。
curl -I https://xxxxx.yyyyy.pages.dev/wp-content/plugins/Cache.php
HTTP/2 500
date: Wed, 23 Oct 2024 23:59:46 GMT
content-type: text/plain
設定後はレスポンスが404に
_routes.json
を変更した後のページでは、エラーコードが404に変わりました。具体的な動きは想像ですが、Pages Functionsがトリガーされなくなったことで、同名の静的ファイルを探しにいき、ファイルが見つからないから404エラーであるという処理になっているのではと思います。
curl -I https://xxxxx.yyyyy.pages.dev/wp-content/plugins/Cache.php
HTTP/2 404
date: Thu, 24 Oct 2024 00:01:39 GMT
access-control-allow-origin
_routes.json
を使ったブロックに関する注意点
ルールは100個までしか設定できません。そのため、本当に必要になった時のために初めから全部盛りにしないほうがよさそうです。この辺りはSentryやCloudflareのログを見て、調整することになるかなと思います。
また、Pages Functionsをトリガーしなくなっているため、_routes.json
で弾くと画面表示が真っ白になります。正直なところbot / 攻撃者のUXなぞ知ったことではないので、今回のケースについてはあえてこのままにしています。
ただしexclude
ルールの使い方によっては、ユーザーがこの画面で立ち往生するリスクがあることには注意した方が良さそうです。