またGMOかあのね、率直に言ってGMO系のAdSenseを全部ブロックしてる(自分のブラウザーに広告ブロックを入れている、という意味ではなくて、このサイトに表示してるAdSenseにGMO系が出ないように)ぐらいGMOはおすすめしないんですが、それでも不可抗力で使わないといけないこともあるわけです。ただ安いってだけで。
そんな折に出会ったロリポップ!での403 Forbiddenの話。

いやまあ、そんなに怒気を帯びるようなことでもないんですけどね。
ただ例によって、こんな初心者じゃ解決できないような設定を最初からONにしやがって、と思ってるわけです。

何をやったのか

1.フツーにWordPressをインストールしてサイトを制作。普通に。
2.メールフォームが必要になったので例によって「Contact Form 7」をインストール。まあこれも普通に。
3.確認画面を使いたかったので、プラグイン「Contact Form 7 Add Confirm」をインストール。フォームのコードに確認画面用ボタンのショートコード(というんだろうか?)を設置。
4.確認画面になった時にちょっとした処理をしたかったので、Contact Form 7の設定画面の「その他の設定」というテキストエリアに、以下のように1行入力。

on_confirm:"cf7_confirm();"

これで、確認画面が表示されたと同時に、cf7_confirm()という関数が実行されます。このcf7_confirm()は自分で定義する関数なので、別にどんな名前でもいいです。
あとはサイトの全てのページから読み込まれるjsファイルにこう書けば、

function cf7_confirm(){
  alert('確認画面です。よく確認して!');
}

確認画面に遷移した時に哀願するようなメッセージが表示される、という感じです。
(もちろん実際には、特定の要素にクラス名を設定したりとか、Ajaxで何かするとかいう用途になると思うんですが)

で本題なんですが、「その他の設定」エリアにon_confirm:”cf7_confirm();”と入力して、保存ボタンを押すと、なぜか403 Forbiddenが出る。
何度やり直しても一緒で、必ず403 Forbiddenになってしまう。ハハッまあロリポだしな、などと時間が解決してくれるのを待ってみても403。自分の入力した内容に何か問題があるのかもと改行コードを消したり書き加えたりしてみても403。コピペしないで自分でキーボードで1から入力してみても403。どうなってんのこれ。

で、関数名が悪いのかと思って試しにon_confirm:”aaaa();”と入力して保存してみる。
そしたら普通に保存できる。
ということは、関数名cf7_confirm()が悪かったということになる。なんだそりゃ。ちょっと思い返してみて欲しいんだけど、今まで貴方はコードを色々書いてきていると思うんだけど、特殊なマルチバイト文字とかでもないのにこんな状況に陥ったことあるか? 私はなかった。

管理画面見て気づいた

もういいよ、先にメールフォーム送信先のメールアドレスを設定するべ、とロリポップ!の管理画面にログインして、ふと気づいた。

WAFが有効になっているかも。

で確認したら案の定WAFがONになってて、検知ログを見てみたらコレですよ。

lolipop-waf-wordpress-cf7-01
仕事をするWAFさんの図

ぶっちゃけこれを書いている今もWAFが一体どういうものなのか、というのを詳細には調べてないんですが、まあクロスサイトスクリプティングだと思われてブロックされたんでしょうね。この人xssをtryしてる! って考えたんだと思います。ええ。かわいいやつですね。

で何でxssと間違えられたかはここまでくると見当がついて、まず間違いなくconfirmという単語が何らかの問題になっているんでしょうね。もちろん単純にconfirmという単語を見つけてブロックしてるわけではなく、おそらく

1.WAFたん「ここ『confirm』て書いてある……ヤバイかも……」
2.WAFたん「なにこれ……『confirm』の後ろに『()』まで書いてある……これってもしかして……」
3.WAFたん「ぎゃああああなんかつついたら動いたぁああああああ!!!!」
4.403 Forbidden

て感じでしょうかね。
まあWAFのこと何もわかってないので想像で書きました。
confirm()というのはJavaScriptの関数のひとつで、「はい」と「いいえ」ボタンを付いたダイアログを出すやつです。

実際のところWAFたんはconfirm()というくだりだけで反応しちゃうような頭の悪い子ではないと思うので、ぶっちゃけなんだろうなぁと思ってます。でもそれが何かを言うと全国のContact Form 7ファンの皆さんから猛烈にアタックされるかもしれないから言わないでおこうと思います。私は今日も自分の身がかわいいです。

何がいいたいのか

ロリポップ!さんとしてはWAFをデフォルトでONにすることでセキュリティ万全なサーバーを自負したいんでしょうが、一方ロリポさんが一方的にライバル視してるっぽいさくらのレンタルサーバーではWAFをデフォルトでOFFにしてるわけです。でもロリポップの方がセキュリティ的に優れているんだよ、なんて話は全く聞きません。そう考えると、WAFをデフォルトでONにしててもちっとも偉くないと思うし、長い目で見て「さくらよりいくらか安いけど意味不明なエラーが出て怖い」とか思われちゃうのはマイナスなんじゃないかなーと思います。個人的には。
まあ私はそう思うってだけです。まあもうここらへんは人徳、もとい鯖徳がないといったところでしょうね。かわいそうなロリポ。世界の片隅のブロガーにここまで書かれちゃうロリポ。君とはプライベートで付き合わなくなってもう何年にもなるけれど。

あとせめて403ページに「WAFたんが泣いてるかもよ」くらい書いたほうがいいんじゃね? という感じでしょうか。それだけ。

(追記)解決策

そういえば解決策も書かないと、と思って追記しようとしてるんだけどなかなか難しいな。
というのもセキュリティの事考えると「OFFにしろ」とも言えないし、ググったら出てくるようなやりかたもなかなか手間で面倒だしまず初心者向きではないし……。

ま、私はOFFにしましたけどね。これオフレコで。

Tweet about this on TwitterShare on FacebookShare on Google+Share on TumblrEmail this to someone