Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5応用編⑥】CAPTCHA他

B美

今回は「CAPTCHAキャプチャ」を組み込もうと思うんだけど、ちょっと難しいのよね
なので、私が主導していきます。

まずは「Captcha Plugin for CakePHP(dereuromark/cakephp-captcha)」をcomposerでインストールしましょう

cd html/bbsapp[Enter]
composer require dereuromark/cakephp-captcha[Enter]

A子

OK、できたよ

B美

次にプラグインをロードします
bin/cake plugin load Captcha[Enter]

それから、必ずデータベーステーブルを作らないといけないから、以下のコマンドを実行してね
bin/cake migrations migrate -p Captcha[Enter]

あと(念のためにだけど)キャッシュをクリアしておきましょう
bin/cake cache clear_all[Enter]



C菜

migrations migrate」とか「cache clear_all」とか、意味は分からないですけど、とりあえず実行してみました~

B美

まぁ、必要な手順だと思っておけば良いよ(苦笑)

次に、このプラグインをロードするための記述を「bbsapp/config」の中の「plugins.php」というファイル内に記述するんだけど、さっきbakeコマンドを実行したから基本形はすでにできてます

'Captcha' => [],

そこに以下の一文を追記してね

'Captcha' => [
    'engine' => 'Default',
],



B美

次は「bbsapp/src/View」の中にある「AppView.php」の「initialize」メソッドの中に次の一文を追加します

parent::initialize();

$this->loadHelper('Captcha.Captcha');

これでViewビューファイル内でCaptchaヘルパーが利用できるようになるの
(もしも「parent::initialize();」が無かったら追記してね)

C菜

ということは~

次は「bbsapp/templates/Posts」の中の「add.php」を書き換えるんですね~?

B美

その通り!
<table>タグ内に下記を追加します

<tr>
    <td colspan="2"><?= $this->Captcha->render() ?></td>
</tr>

これにより「投稿」ボタンのすぐ上に「CAPTCHAキャプチャ」画像が埋め込まれるわ

A子

面倒くせぇ…

B美

何、言ってるのよ
自分で「CAPTCHAキャプチャ」を一から作ることを考えたら、超・楽なんだけど!

さて、一番の問題はControllerコントローラーである「PostsController.php」なのよね

use Cake\ORM\TableRegistry;

を上のほうに記述して、「initialize」メソッド内に以下の一文を追加してね

$this->loadComponent('Captcha.Captcha');

B美

add」メソッド内では、データベーステーブルにアクセスして、正解の値($captcha->result)を取得するの
(隠し属性のデータ…$captcha_id…が送信されてくるから、その値で検索するってわけ)

あとはユーザが入力した値($captcha_result)と正解の値を照合して、一致していればCAPTCHAキャプチャ認証に成功よ

$captcha_result = $this->request->getData('captcha_result');
$captcha_id = $this->request->getData('captcha_id');
$captchasTable = TableRegistry::getTableLocator()->get('Captcha.Captchas');
$captcha = $captchasTable->find()->where(['id' => $captcha_id])->first();

if ($captcha_result != $captcha->result) {
  (認証失敗)
} else {
  (認証成功)
}

分かってしまえば簡単なんだけどさ
ネット上にサンプルコードが存在しないから、ここまで解析するのにすっげぇ苦労したわ(苦笑)


C菜

B美部長はこれを独力で見つけ出したんですか~?

すごいですぅ~

B美

ChatGPTの助けも借りたけどね(苦笑)
(というか、ChatGPTと話し合いながら、協力して正解を見つけた…って感じかな)

というか、ChatGPTの言う通りにコードを打ち込んで、プログラムがまともに動いたことがこれまでほとんど無い…(笑)
(今回、正解パターンをChatGPTが学習したはずだから、今後は大丈夫だと思うけどね)

A子

まだまだAIが人間のプログラマを超える日は来ないってことかー(苦笑)

まぁ、それはともかく、さっそくテストしてみようよ

C菜

あまりぐにゃぐにゃしてないですね~

これって「60-3」って入力すれば良いんでしょうか~?

A子

「60_3」かもよ

B美

二人とも間違いよ

60から3を引くと何?

C菜

え?
57ですけど~

A子

まさかとは思うけど、それを入れてみよう



C菜

お~
投稿成功です~

あ、投稿番号が跳んでいるのは5番と6番は削除した(削除フラグを立てた)からですね~

A子

今度はわざと間違った値を入れてみよう



C菜

すごいです~

きちんと判定されてますね~

A子

ぐにゃぐにゃ文字の判別はイライラするから嫌いなんだけど、これはちょっと面白いね

あ、だけどこれじゃちょっと分かりづらいわよ
「bbsapp/templates/Posts」の中の「add.php」をこう書き換えようよ

<tr>
    <th>計算結果は?</th>
    <td><?= $this->Captcha->render() ?></td>
</tr>




C菜

いいと思います~
これで「63-9」って入力する人は、いなくなるはずです~

あっ!

A子

ん?
どした?

C菜

タイトルと本文が空欄のまま、CAPTCHAキャプチャ入力欄に正解の値を入れて「投稿」を押しちゃいました~

A子

あれ?
登録されたね

たしかデータベース設計のとき、タイトル(title)と本文(body)は「not null」にしたはずだけど…?

B美

から文字列はNULLじゃないわよ

まぁ、データベースエラーの画面をユーザの目にさらしたくはないから、別に良いんじゃないの?

C菜

タイトルが空欄のときは「(無題)」って入れるようにしませんか~?

本文は空欄のままでも構わないですけど~
(画像だけをアップロードする場合もあると思いますし…)

A子

うん、それいいね
んじゃ、「PostsController.php」を書き換えてみよう

if ($title == '') {
    $title = '(無題)';
}

これを適切な位置に埋め込んでっと…

C菜

それじゃ、テストしてみます~



A子

完璧ね
もう、この程度のコードだったらすぐに書けるよ

あ、そうだ!
あと、画像を選択するダイアログなんだけどさ

以下の画面を見ても分かるように「すべてのファイル」ってなってんだよね
これって画像のみに限定できないの?

B美

簡単よ
「bbsapp/templates/Posts」の中の「add.php」に以下の赤字部分を追加するだけでOK

<?= $this->Form->file('upload', ['id' => 'upload', 'label' => false, 'div' => false, 'accept' => '.jpg,.gif,.png']) ?>

C菜

打ち込んだので、テストしてみるです~

A子

あっさりできたね
超・簡単じゃん!

あ、あとついでに拡張子チェックも行っておいたほうが良いかな?

if ($extension == 'jpg' || $extension == 'gif' || $extension == 'png') {
    //OK
} else {
    //NG
}

…って感じで…

C菜

分かりました~

あ、でも「else」は要らないと思うのです~
それでコードを書いてみますね~

A子

んじゃテストしてみよう

ファイルとしてPDFファイルを選択してっと…



C菜

OKだと思います~

次に、本来の画像ファイルのテストもやっておきますね~
コードを修正したので、再テスト



A子

完璧ね

B美

さて、これで要求定義(CakePHP5応用編①を参照)は全て満たしたわけだけど、どうよ

まだ何か機能を追加する?

C菜

書込みがあったとき、管理者のメールアドレス宛てにメールで通知するなんて、ちょっと難しいですかね~?

A子

おぉ!良いじゃん、それ!

メール送信のやり方を覚えておくと、あとあと役に立つかもしれないしね

B美

良いわね
よし!それでは、その機能はあなたたち自身の手で組み込んでみなさい

あなたたち自らネットで調べて、解決策を見つけ出すこと!
(ただし、ChatGPT等の生成AIには頼らないように!)

A子

えぇー、できるかな?

C菜

B美部長が「今の私たちだったらできる」と思ってるからこそ…ですよ~(多分)

やってみるです~

B美

では今回はここまで

次回はさっきの課題の成果発表とシステムテストについて説明していきましょう