CakePHPでのセキュリティ対策メモ

百式さんのブログIDEA*IDEAの記事「CakePHPのAuthComponentではまったところ」から、以前に小生が「人力検索はてな」でした質問にリンクされた記念(同じ問題に直面したようで嬉しい)として、CakePHPのセキュリティ対策について途中までまとめて放置していたメモをアップします。

CakePHPで開発した「30日ブログ」は、不特定多数が利用するウェブアプリケーションであるためセキュリティ対策にはかなり気を使いました(一応ウェブディレクターの端くれとしてもこの辺は慎重に)。
そしてウェブアプリケーションの一般的な脆弱性については、CakePHPがある程度まで自動的に処理してくれます(フレームワークの素晴らしいメリット)。
そこでCakePHPと代表的な脆弱性3つについてまとめました。
●SQLインジェクション
・概要:ユーザーが任意のSQLを実行できデータベースが不正操作される。価格.comが昔くらった。
・PHPの対策:入力値をエスケープする。DBごとに関数が異なるので使い分ける〔mysql_real_escape_string(),pg_escape_string()〕。
・CakePHPの対策findreadなどの組込関数は自動処理されるので対策不要。ただし自分でSQLを組み立てて実行している場合はセオリー通りの対策が必要。
●クロスサイト・スクリプティング(XSS)
・概要:ユーザー入力がそのままHTMLに表示され任意のコードが実行される。はまちさんの得意技。
・PHPの対策:HTML出力時にサニタイジングする〔htmlspecialchars($str,ENT_QUOTES)〕。
・CakePHPの対策viewでサニタイジングする。省略記法h()。echoも含めてe(h($value))で覚えよう。
●クロスサイト・リクエスト・フォージェリ(CSRF)
・概要:管理者権限をもつユーザーにURLをクリックさせて不正な操作を強いる。相手は死ぬ。
・PHPの対策:ワンタイムチケットを発行する。
・CakePHPの対策:・・・
今回CakePHPで開発していてMVCモデルを採用するCakePHPはCSRFの脆弱性が生じやすいのではと思いました(素人の感想です)。
MVCモデルではhttp://example.co.jp/モデル/コントローラ/パラメータとなりますが、プログラムの作り方によってはhttp://example.co.jp/user/delete/1というURLをクリックすることでuser_id=1が削除されてしまいます。
そこで「ログインしたユーザーしか自分のIDは削除できないことにすれば」という処理を加えても、ログインしたユーザーが<a href=http://example.co.jp/user/delete/1>エロ動画</a>なんでリンクを思い余ってクリックしたら、ログイン状態が継続している場合は同様に実行されてしまうのです。
CakePHPでの対策方法を調べると色々あるのですが、急に敷居が上がってしまい、また同一ページ内に複数のフォームがあった場合にSecurityコンポーネントがうまく動きませんでした。
"クロスサイトリクエストフォージェリ対策" フォーラム – CakePHP Users in Japan
(小生は無理やりな対策を施しましたが現在のバージョンでは正式な対応方法があるのでしょうか?)
CakePHPだからCSRFが危険と言うわけではないですが、参考書通りに作成すると危ないなーと感じた次第です。

フレームワークのメリットはアプリケーションの機能に集中して開発ができるところだと考えています。
CakePHPもセキュリティ面をカバーしてくれるので安心して開発ができました。
セキュリティの専門家に怒られそうですが・・・。

コメント

タイトルとURLをコピーしました