11時33分42秒 [Web関連]
ウェブ上の入力フォームから送信したときに、「500 Internal Server Error」ではなく「403 Forbidden」になる現象に遭遇しました。
必ずなるわけではなく、フォームに入力した内容によって、正常に送信できたり、Forbiddenエラーになったりします。
試行錯誤の結果、ウェブサーバ側に導入されたWAF(ウェブアプリケーション・ファイアーウオール)が原因だということが分かったんですが。^^;
それほど特殊な文字列を入力しているわけでは全然なく、なんと「A and B in box (white)」のような文字列だけでもエラーになります。
もっと短い文字列でもエラーになります。例えば、
のいずれでもエラーになります。(^_^;;;
たったこれだけの記述がプレーンテキストで含まれているだけで、CGIが実行されずに403 Forbiddenになるのがすごく謎でした。
単純に「and」や「in」などの文字列が含まれているだけで無条件にエラーになるわけではありません。例えば、以下の文字列ではエラーにはならずに正常に送信できました。
いろいろ試行錯誤して調べたところ、以下の3条件に合致する場合に、Forbiddenエラーになることが分かりました。(後から追加の情報を頂いたところ、上記の条件以外でも同エラーが発生するパターンがあるようでしたが。)
なんだこれ……。(^_^;;;
CGI側に何らかの問題があるのかな……と思って結構悩みました。^^;;;
何にしても、英単語「and」と「in」と丸カッコなんて、たとえ英語サイトでなかったとしても、使われる頻度は高い文字列です。
これらが含まれているだけで送信エラーになってしまうと、入力フォームとして役に立たなくなってしまいます。
もしCGI側(Perlソースの中身)に問題があるのなら、「403 Forbidden」エラーではなく、「500 Internal Server Error」になるはずですよね。
なので、もしかしてサーバ側のセキュリティ関係に何か問題があるんじゃないかな? と思ったのでした。
試しに、私が個人で利用しているサーバ上に同CGIを置いてみたところ、送信エラーは特に発生しませんでした。
どうも、レンタルサーバによっては、ウェブ上での不正な通信をブロックする「WAF(ウェブアプリケーション・ファイアーウオール)」なるツールがデフォルトで有効になっているみたいですね。
サーバのコントロールパネルから、WAFの設定を「無効」にするよう設定をお願いしたところ、問題の403 Forbiddenエラーは出なくなりました!(^_^;;;
というわけで、CGIを使って何らかの文字列をサーバに送信する仕組みを用意しているときに、文字列によって送信できたり送信できなかったりする場合で、サーバが「403 Forbidden」エラーを吐く場合は、WAF(ウェブアプリケーション・ファイアーウオール)の影響を確認してみるのが良さそうです。
うーむ、そんなことがあるんですねえ……。
しかしこれ、今回検証した条件でエラーを吐くなら、明らかに過剰検出じゃないか……?
WAFは、CGIとかのプログラムをウェブ上で使わないことが前提みたいな感じなんだろうか……?(^_^;;;
※注:上記の話のレンタルサーバは、私が契約しているサーバではありません。(つまり、さくらインターネットの話ではありません。別の会社です。)
この日記へのコメントはお気軽に! コメント数:0件
(前の記事) « 「ユーフォリ・テクニカ」の外伝短編小説が電子書籍で出てた
前後のエントリ
< 旧 / 新 >
コメント数: 0件