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ルールの使い方によっては、ユーザーがこの画面で立ち往生するリスクがあることには注意した方が良さそうです。

    参考

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark