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

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

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

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

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

Amazon LightSailでコーポレートサイトを最適化する

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

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

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

太陽光発電システム/家庭用蓄電池 販売会社さま 顧客管理システム

太陽光発電システム/家庭用蓄電池の販売・施工を行う会社さまの顧客管理システムを構築いたしました。 ■… [続きを読む]

某独立行政法人さま 支援事業案件管理システム

独立行政法人さまの支援事業案件管理システムを開発いたしました。 ■問題点/課題 現システムはWind… [続きを読む]

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

クイックコンタクト

閉じる

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

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

お名前

{{errors.name}}

メールアドレス

{{errors.mail}}

お問い合わせ内容

{{errors.body}}

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