WordPress投稿画面で公開・更新時「HTTP 403 Forbidden」になる原因と対処法

WordPressの投稿画面で公開ボタンや更新ボタンを押した後にこんな画面が出て反映できない、そんな経験はないでしょうか?その事象、もしかすると「WAF設定」が関係しているかもしれません。

WAF設定とは

WAF(Web Application Firewall)の設定とは、一言で言えば「Webサイトへの通信を検査し、悪意のある攻撃だけをブロックするためのフィルターを構築すること」です。一般的なファイアウォール(ネットワーク層の保護)では防げない、Webアプリケーション特有の攻撃(SQLインジェクションなど)を食い止めるために行います。

WAFの主な設定内容は以下となります。

① ルール(シグネチャ)の選定:「何を守るか」を決めます。
② アクション(動作)の設定:ルールに合致した通信をどう扱うかを決めます。
③ 除外設定:例外のルールを決めます。

WAF設定は通常レンタルサーバー側で設定され、管理画面から有効化・無効化が可能です。

WordPressでエラーが出る要因

WordPressでエラーが出るのは、レンタルサーバーのWAF設定によって管理画面上の操作が攻撃とみなされて弾かれるためです。以下事例となります。

記号系のブロックパターン

特に %/ が絡むものが危険です。

  • ../ (ディレクトリトラバーサル)
    • 上の階層へ移動するコードとみなされます。画像パスなどをカスタムフィールドに入れた際に発生しやすいです。
  • http://https://(リモートファイルインクルージョン)
    • URLそのものを入力すると、「外部サイトの悪意あるファイルを読み込ませようとしている」と判断されることがあります。
  • <script><iframe>(クロスサイトスクリプティング)
    • HTMLタグ、特にJavaScriptを動かすタグは、保存ボタンを押した瞬間にほぼ確実に弾かれます。
  • %0a%0d(改行コード)
    • %20(スペース)と同様、URLエンコードされた改行も「ヘッダインジェクション」という攻撃を疑われます。

データベース操作を連想させる単語(SQLインジェクション)

英単語そのものではなく、**「記号+単語」**の組み合わせで判定されます。

  • ' OR '1'='1(ログイン突破の定番)
  • SELECT, UNION, DROP, UPDATE, INSERT
    • これらが単体でブロックされることは稀ですが、前後に引用符('")やスペース(%20)があるとアウトになります。
    • 例:... item SELECT ... のような自然な文章でも、WAFには「データベースから情報を抜こうとしている」と見えます。

OSコマンドを連想させる記号(OSコマンドインジェクション)

サーバーのシステムを直接操作する際に使われる記号です。

  • ;(セミコロン)
    • 命令の区切り。
  • |(パイプ)
    • 命令を次に渡す記号。
  • &(アンパサンド)
    • 特に、URLのパラメータ名としてではなく、値の中に & が含まれていると警戒されます。

カスタムフィールドでエラーが出やすい

WordPress管理画面で特にWAF設定でエラーが出やすいのがカスタムフィールドとなります。

WordPressの本文はもともと安全性を確保する制御が入っているのと、一般的に文章量が多いため問題となる箇所の記述の占める割合が少なくなることからそのまま通る場合がほとんどとなります。

一方でカスタムフィールドの方はそれよりも脆弱な入力箇所となり、また本文と比較して問題となる箇所に占める割合が多いことからエラー判定されるケースが多くなります。

対処法

エラーを回避するということで言えば最も確実なのはWAF設定の無効化です。しかしそうすればサイトの脆弱性は増します。

ですので、エラーの要因がWAF設定にあること、またカスタムフィールドでエラーが発生しやすいことやどういった記述がエラーに繋がりやすいのかを理解して運用することが大切になります。

サーバー側をいじれる場合は除外設定を行うことを検討するのもよいでしょう。難しい場合は、日本語URLを避ける、またできるだけインジェクションとみなされそうな文字列を使わないなどを意識してください。

投稿者プロフィール

たーさん

Follow me!