CakePHP3で意図しないフィールドの変更を防ぐ

弊社ではPHP開発の際のフレームワークとしてCakePHP3を採用しております。
CakePHP3は非常に柔軟でありながらセキュアな開発を行うことが可能ですが、インターネット上にあるサンプルコードなどを容易に参考にすると脆弱なアプリケーションとなることがあります。
今回はよく陥りがちでありながら影響の大きい「想定しないフィールドの変更」を紹介したいと思います。

意図しないPOSTデータの送信

例えば以下のようなテーブル構造のデータ(foods)があり、このデータを変更するフォームを作るとします。
id,name,owner_id
owner_idはこのデータの所有権を表しています。
データ変更フォームではこの中でnameのみを変更したいとします。

上記のコードはPOSTデータを既存データとマージし、DBに保存するというシンプルなコードです。
一見問題のなさそうなコードですが、POSTデータというのはHTMLの構造に関係なく常に改竄される可能性があると認識しなくてはいけません。
Chromeのデベロッパーツールなどを利用すれば簡単にPOSTデータを変更することができます。
例えば以下のようなフォームに改竄することができます。

これをそのままPOSTされれば自由にfoodの所有権を変更されてしまいます。
つまり
$this->patchEntity($entity, $data);
の部分には変更できるデータを制限する仕組みは一切ないことになります。(モデル側のvalidateなどを考慮しない場合)

対処方法1:変更できるフィールドを制限する

以下のように変更可能なフィールド名を明示的に指定する方法です。

これによってfieldList以外の項目は無視されます。

対処方法2:エンティティモデルで制限する

以下のようにモデルの_accessibleに一括代入で変更可能かを指定する方法です。

参照:エンティティー 一括代入(cakebook)

対処方法3:フォーム改ざん防止機能を利用する

SecurityComponentを利用し、ユーザーがフォームを改竄をすることを防止することができます。
参照:セキュリティ フォーム改ざん防止(cakebook)

以下のような制限をかけることができます。(マニュアルより抜粋)

  • フォームに新規フィールドを追加することはできません。
  • フォームからフィールドを削除することはできません。
  • hidden フィールドの値を更新することはできません。

このようにフレームワークを利用する場合であっても公式マニュアル等をしっかりと確認しないと重大なセキュリティホールを作ってしまう可能性があります。
特にCakePHPの初学者の方はCakebookのセキュリティ部分を読むことをおすすめします。

エイミーではシステムの機能や最新技術だけでなくセキュリティ対策の研究にも力を入れております。
今後もお客さまが安心して利用できるシステムを開発できるよう努力してまいります。

News & Topics

(一社)日本チームマネージメント協会さま 「リスクの見える化」サービス

一般社団法人 日本チームマネージメント協会さまが提供する、事故削減プログラム「リスクの見える化」サー… [続きを読む]

Amazon S3で大量のファイルを低コストで運用する

システム運用時のサーバー選定ではストレージ容量の予測が非常に重要でした。 少なすぎるとすぐにストレー… [続きを読む]

WordPressのセキュリティ対策を一挙に行える「SiteGuard WP Plugin」

WordPressの普及率が高くなるにつれて攻撃者の数も増え、WordPressでのWEBサイト運用… [続きを読む]

社内システムサーバーとしてのQNAP

業務システムのWEBシステム化を行った際、大きな検討事項はサーバーの選定です。 多くのケースで故障リ… [続きを読む]

Amazon LightSailで中小企業のコーポレートサイトを最適化する

御社のWEBサイトを設置しているサーバーは適切なスペックやコストでしょうか? サーバー環境はAWSを… [続きを読む]

ClamAVを用いたWEB業務システムにおけるウイルス対策

Linuxではウイルス対策の必要性は薄いと言われておりますが、ユーザーがファイルをアップロードできる… [続きを読む]

ご相談・ご提案は無料です。お気軽にお問い合わせください
お問い合わせはこちら

クイックコンタクト

閉じる

お問い合わせありがとうございました。
通常1営業日以内にご記載頂いたメールアドレス宛にご連絡させていただきます。

以下よりお問い合わせいただけます。通常1営業日以内にご返信いたします。
営業メールなどを送付することはございませんのでお気軽にご質問ください。

お名前

{{errors.name}}

メールアドレス

{{errors.mail}}

お問い合わせ内容

{{errors.body}}

ご記載頂いた内容はお問い合わせのご返信のみに使用いたします。