当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

サガワドラゴン大量フォーム投稿対策:cakephpでGoogle reCaptchaを使う。

サガワドラゴン大量フォーム投稿対策:cakephpでGoogle reCaptchaを使う。


お客様でサガワドランゴン名乗るフォーム登録で多数の迷惑メールを短時間で700通弱送るトラブルがあった。この問題のおかげでGoogle G Suite のアカウントが通数制限で送受信できなくなる問題が発生しフォームが使えなくなった。G SuiteやGmailは一日の通数制限があるのでスパマーが大量に送るとアカウントが一時的に送受信が凍結してしまう。但し一日立つと復活します。Gのメールフィルターはあまりよくない。それは、一度受信した上でフィルターをかけるため通数制限の問題に対して解決にならないのだ。

結局cakephpのバージョンが古くて2系であったためCaptchaプラグインが使えなくなっているものや、現代のSpam事情を考慮すると実装上の課題があるものが多いため、改めてGoogleのCaptchaを使うことにした。おそらく下手なcakephpプラグインを使うよりも実装は簡単で効果は高い。本音はWORDPRESSでフォームを作っていれば簡単にGoogle Captcha使えるのにね!と思います。まあ、フレームワークで作る場合は人それぞれの個性が出るので作り方のトレースをある程度行った上で導入が必要になる。 今回の環境はcakephpでしたがおそらくcakephpのどのバージョンでも使えると思う。まあ、参考にしてみてください。GoogleのreCaptchaを使うには予めユーザ登録とドメイン登録が必要。サイトキーやシークレットキーもここで取得します。やり方は過去記事のここを参考にしてみてください.Google reCaptcha

ヘッダに設置

フォームに設置

コントローラに設置

次のコードを適宜書き換えてフォームを表示する部分の処理において内容チェック処理を行う部分もしくはSubmitする直前に挿入してみてください。

特定のヘッダ項目で比較チェック

※メールのヘッダ項目やBODYの内容で特徴あるパターンでトラップさせる。サンクスメールの送信前や確認表示の前に入っているバッファで 文字列比較すると良いと思います。

文字列はUTF-8でエンコーディングという前提です。項目は攻撃を仕掛けられたサイト毎に異なるため、事前に届いている攻撃メールを調べて共通項を調べてみてください。意外とどのメールにも共通した文字列が潜んでいるものです。そこを文字列含む関数比較(preg_match)を使って検出すると良いです。後は問題あるものは適当なページへ飛ばす事です。

タグ: , , , , , ,

備忘録:cakephp2.xでSSL化した場合のトラブル「The request has been black-holed」の対処


今年は7月からGoogle Chromeブラウザの非httpsなサイトをSSL化するための仕事で大忙し。 よくある問題は何かと言うと、表題の「The request has been black-holed」がcakephpで作られた環境でSSL化すると頻発するアクシデントに見舞われる。 この問題はよくある既知の問題なのでネット上にも対処方法はそこそこ見つけることができる。


しかし、人それぞれ、独特の作りかたをしているため、他人のソースコードを読み取って適材適所にコードを埋め込んだり修正するのは大変。 もう、cakephp絡みで今月に入ってから5件の案件で遭遇した。短い時間で修正すべきソースコードとその箇所を見つけるのはなかなかしんどい。

ということで、また遭遇するだろうからメモを残しておく。

対象Controllerを修正する

概ね以下のようなコードを挿入する。システムの作り方によるが修正箇所は大抵「app/Controller/」「app/Plugin/Admin」の下にあるメインコントローラか、機能単位のコントローラに入れることになるだろう。

cakephpのSSL化でインターナルサーバエラーの場合の回避策の一つapp/Config/core.phpの編集でエラーレベルを抑制

php.iniで既にエラーレベルが「E_ALL & ~E_DEPRECATED & ~E_STRICT」に設定されてれば問題ないが、サーバ上にある特定のアプリのみ制御するならcakephpであれば下記を修正します。

タグ: , , , , ,