SlideShare a Scribd company logo
ヤザマキ

春の Cake 祭り

      2012/3/7
   CakePHP study

   Yasushi Ichikawa
I am
Yasushi Ichikawa




@cakephper
http://d.hatena.ne.jp/cakephper
Services
KANAEL
http://kanael.net

ATND::Payment
http://atndpay.eizoku.com

Tipshare
http://tipshare.info
CakePHP2.1 の紹介
Cake2.1 Performance
Mass Assignment
CakePHP Tips
Stream Wrapper

   @ichikaway   http://cake.eizoku.com/blog/
CakePHP 2.1
CakePHP2.1



           祝 安定版リリース!!
                         2012/3/5


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2.1
 ●JsonView / XMLView の追加
 ●View の継承
 ●element('FooPlugin.bar');
 ●
  柔軟なイベントシステム
 ●Callback に優先度の設定
 ●深い階層の配列データの保存
     ●   ex. User – Post - Comment


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2.1
 ●php ファイルで ACL 定義
     ●   app/Config/acl.php
 ●Router::defaultRouteClass() 追加
 ●Auth でユーザ検索の recursive 指定
 ●SQL Debug に Prepared Statements のパラメータ
 表示
 ●app/Model/AppModel.php 必須
         ●   Controller 、 Helper も
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Cake2.1
Performance
Cake2 Performance
●
    環境
●   Dell SC440(Pen, 2Gmem) Ubuntu
●   PHP5.3.5(APC), Apache2, MySQL5.1
●
    計測ツール
●   siege -c 10 -b -t 3S
●
    アプリケーション
●     Bake した index アクション
    ●
       paginate, many link

       @ichikaway   http://cake.eizoku.com/blog/
Cake2 Performance
Bake しただけの画面を対象に計測




  @ichikaway   http://cake.eizoku.com/blog/
Cake2 Performance
● CakePHP1.3.11
  ● 29 req/sec

● CakePHP2.0.4

  ● 40 req/sec

● CakePHP2.1.0

  ● 38 req/sec




    @ichikaway   http://cake.eizoku.com/blog/
Mass
Assignment
Vulnerability
Mass Assignment vulnerability

 ●2012/3/5 Github がハックされる
     ●   脆弱性の Issue を上げたけど無視された
     ●   ハックして自分が RoR の Master repo にコミット
         するデモを披露
 ●Rails の MassAssignmentVlunerability
         ●   Post されたデータをそのまま保存


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Mass Assignment vulnerability

 // In controller
 $this->User->save($this->data);



 // PostData
 data[User][name] = 'Ichi'



@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Mass Assignment vulnerability

 // In controller
 $this->User->save($this->data);



 // PostData
 data[User][name] = 'Ichi'
 data[User][is_admin] = '1'


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Mass Assignment vulnerability
 ●CakePHP での対応方法
     ●   SecurityComponent の利用
         ●   デフォルトでフォーム改竄チェックが有効に
     ●   save データの限定
         ●   Model::whitelist プロパティで保存可能なフィー
             ルドを絞る
         ●   Model::save() の第 3 引数で保存可能なフィー
             ルドを定義
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2
Tips
CakePHP2 Tips

 ●Security Component でフォーム改竄チェックをは
 ずす (CSRF 対応のみ利用したい)

 // In controller
 public $components = array(
     'Security' => array('validatePost' => false),
 );


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2 Tips

 ●Prepared Statements を利用
     ●   Cake1 の query() は PreparedStatement ではない

// In controller
$sql = 'select * from posts as Post
    where Post.id = :foo OR Post.id = :bar';
$result = $this->Post->getDatasource()->fetchAll(
    $sql, array('foo'=>1, 'bar' => 2));

@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2 Tips

 ●
  コントローラ、モデルを階層管理
     ●   CakePHP1 では自動探索で無問題


App/Controller/Admin/AdminController.php
App/Controller/Admin/FooController.php

App/Controller/User/PostController.php


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2 Tips

 ●
  コントローラ、モデルを階層管理
     ●   CakePHP2 ではパスを指定
// in bootstrap.php
App::build(array(
    'Controller' => array(
       '/app/Contoroller/Admin/',
       '/app/Contoroller/User/'
    )));

@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2 Tips

 ●
  コントローラ、モデルを階層管理
     ●   CakePHP2 でも自動探索したい!


     AutoAppBuild Plugin
     https://github.com/ichikaway/AutoAppBuild




@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2 Tips
 ●コントローラ、モデルを階層管理
     ●   AutoAppBuild
     ●   app/Plugin/AutoAppBuild に設置

// in bootstrap.php
CakePlugin::load(array(
    'AutoAppBuild' => array('bootstrap' => true)
));


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Stream
Wrapper
Motivation
 ●エレメントの内容を DB に入れて管理したい
     ●   エレメントには html タグ、 php コードが混在
     ●   ファイルの場合は、 include すれば html/php がレ
         ンダリングされて出力
     ●   DB 内のエレメントコンテンツを入れた変数を
         include したい! <- これどうやるの?




@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Stream
 ●PHP のストリーム
     ●   ファイルの入出力のように様々なプロトコルを透過
         的に扱う仕組み
     ●   fopen('http://example.com/foo/bar');
     ●   fopen('file://foo/bar.txt');




@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Stream
 ●PHP のストリーム
     ●   ftp://
     ●   php://
     ●   zlib://
     ●   data://
     ●   ssh2://
     ●   php://


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Stream
 ●PHP のストリーム
     ●   data:// の text/plain で実現できそう

$data = 'hello <?php echo "world"; ?>';
include('data://text/plain,' .$data);

php.ini の下記条件が必須
allow_url_fopen = ON
allow_url_include = ON

@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Stream
 ●PHP のストリームを自作することに
     ●   https://gist.github.com/1832549
     ●

App::import('Vendor', 'VariableStream');
stream_wrapper_register("var", "VariableStream");

$val = 'Hello <?php echo "World"; ?>';
include("var://".urlencode($val));
// 内部で urldecode している

@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
Stream
 ●PHP のストリームに必須なメソッド
     ●   url_stat()
     ●   stream_stat()
     ●   stream_open() 変数の読込み
     ●   stream_read()  読込んだ変数を返す
     ●   stream_tell()   読込んだポジション
     ●   stream_eof()   読込み終了判定


@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
CakePHP2.1 の紹介
Cake2.1 Performance
Mass Assignment
CakePHP Tips
Stream Wrapper

   @ichikaway   http://cake.eizoku.com/blog/
THANK YOU


@cakephper   http://cake.eizoku.com/blog/

More Related Content

PDF
CakePHP最新情報 PHPカンファレンス関西2012
PDF
CakePHP 1 to 2 Migration tips 100
PDF
Customize CakePHP bake
PDF
behatエクステンションの作り方
PDF
Ruby on Rails Tutorial
PPT
Gaej Explorer
PDF
開発エンジニアがChefで テスト駆動サーバー設定してみた #biglobetechtalk
PDF
NetBeansではじめる FuelPHP
CakePHP最新情報 PHPカンファレンス関西2012
CakePHP 1 to 2 Migration tips 100
Customize CakePHP bake
behatエクステンションの作り方
Ruby on Rails Tutorial
Gaej Explorer
開発エンジニアがChefで テスト駆動サーバー設定してみた #biglobetechtalk
NetBeansではじめる FuelPHP

What's hot (20)

PDF
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
PDF
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
PPTX
<第1回>Laravelハンズオンセミナー
PDF
20091030cakephphandson 01
PDF
Chefで作る開発環境
PPT
Shibuya Pm Tt08 Advanced Mogilefs
PPTX
Aizu.LT::Tokyo #4
PDF
Laravel5を使って開発してみた
PDF
React入門-JSONを取得して表示する
PPTX
20111006 cakephp2.0 study
PPT
Jenkinsプラグイン開発
PDF
REACT & WEB API
PDF
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
PPT
Cakephp tokyo5
PPTX
今、最も勢いのあるWebフレームワーク「fuel php」
PPTX
Alfresco勉強会#30 alfrescoとshareのJavaScriptをデバッグしよう
PDF
NetBeans plugin for wordpress
PPTX
Fuelphp1.8を始めたい
PDF
明日から使えるgradle
PDF
Cakephp2.1 ViewBlock view-inheritance
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
gulp + sass で目指せ倍速コーディング(東区フロントエンド勉強会 2015年 第1回) 環境準備編
<第1回>Laravelハンズオンセミナー
20091030cakephphandson 01
Chefで作る開発環境
Shibuya Pm Tt08 Advanced Mogilefs
Aizu.LT::Tokyo #4
Laravel5を使って開発してみた
React入門-JSONを取得して表示する
20111006 cakephp2.0 study
Jenkinsプラグイン開発
REACT & WEB API
gulp + sass で目指せ倍速コーディング(第2回 gulpfile.jsの分割管理と画像作成の効率化)
Cakephp tokyo5
今、最も勢いのあるWebフレームワーク「fuel php」
Alfresco勉強会#30 alfrescoとshareのJavaScriptをデバッグしよう
NetBeans plugin for wordpress
Fuelphp1.8を始めたい
明日から使えるgradle
Cakephp2.1 ViewBlock view-inheritance
Ad

Similar to 20120307 CakePHP Study in Tokyo (20)

PDF
CakePHP2.0 performance, upgrade shell
PDF
FukuokaPHP 3
PPT
Cakephp勉強会@tokyo #4
PPT
Cake Php開発事例
PPT
How to manage Cakephp @CakePHP_Fukuoka_2
PPT
Cakephpstudy5 hacks jp
KEY
8分で分かる最近のCakePHP
KEY
10分で分かる最近のCakePHP
PDF
CakePHP - The point of upgrade
PPT
CakeにTestがやってきた
PDF
実"戦"CakePHP Plugin
PDF
Cakephp
PDF
FutureSync 世界の開発者とコラボしよう
PDF
baserCMSにみられるCakePHPノウハウ蓄積法
PDF
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
PDF
Sencha と CakePHP の連携について
PDF
CakeRequest::onlyAllow() について
PDF
CakePHP2 Loading (Japanese)
PDF
第2回webデザイナー向けcake php勉強会
PDF
WTM53 phpフレームワーク いまさらcodeigniter
CakePHP2.0 performance, upgrade shell
FukuokaPHP 3
Cakephp勉強会@tokyo #4
Cake Php開発事例
How to manage Cakephp @CakePHP_Fukuoka_2
Cakephpstudy5 hacks jp
8分で分かる最近のCakePHP
10分で分かる最近のCakePHP
CakePHP - The point of upgrade
CakeにTestがやってきた
実"戦"CakePHP Plugin
Cakephp
FutureSync 世界の開発者とコラボしよう
baserCMSにみられるCakePHPノウハウ蓄積法
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Sencha と CakePHP の連携について
CakeRequest::onlyAllow() について
CakePHP2 Loading (Japanese)
第2回webデザイナー向けcake php勉強会
WTM53 phpフレームワーク いまさらcodeigniter
Ad

More from ichikaway (20)

PDF
forteeに脆弱性検査をかけてみた VAddy編
PDF
Understanding Computer Architecture with NES Emulator
PDF
VAddyの課金システムを Stripeに乗り換えた話
PDF
Hello, Worldまで3ヶ月 Golangでファミコンエミュレータ実装 #gocon fukuoka 2019
PDF
ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019
PDF
現場で使える脆弱性検査サービス VAddy
PDF
OS入門 Fukuoka.php vol.18 LT資料
PDF
Yapc8oji: セキュリティテストサービスを開発運営してきた2年
PDF
VAaddyとは VAddyミートアップvol3_20160629
PDF
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
PDF
脆弱性もバグ、だからテストしよう DevSummiFukuoka
PDF
Vulnerabilities are bugs, Let's test for them!
PDF
脆弱性もバグ、だからテストしよう!
PDF
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
PDF
継続的Webセキュリティテスト testing casual talks2
PDF
Ctf2015 ichikawa Eizoku PM2.5 dial
PDF
VAddy - CI勉強会 fukuoka
PDF
Jenkinsを使った継続的セキュリティテスト
PDF
継続的セキュリティテストVaddy説明資料
PDF
VAddy at LL Diver LT
forteeに脆弱性検査をかけてみた VAddy編
Understanding Computer Architecture with NES Emulator
VAddyの課金システムを Stripeに乗り換えた話
Hello, Worldまで3ヶ月 Golangでファミコンエミュレータ実装 #gocon fukuoka 2019
ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019
現場で使える脆弱性検査サービス VAddy
OS入門 Fukuoka.php vol.18 LT資料
Yapc8oji: セキュリティテストサービスを開発運営してきた2年
VAaddyとは VAddyミートアップvol3_20160629
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう DevSummiFukuoka
Vulnerabilities are bugs, Let's test for them!
脆弱性もバグ、だからテストしよう!
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
継続的Webセキュリティテスト testing casual talks2
Ctf2015 ichikawa Eizoku PM2.5 dial
VAddy - CI勉強会 fukuoka
Jenkinsを使った継続的セキュリティテスト
継続的セキュリティテストVaddy説明資料
VAddy at LL Diver LT

20120307 CakePHP Study in Tokyo

  • 1. ヤザマキ 春の Cake 祭り 2012/3/7 CakePHP study Yasushi Ichikawa
  • 4. CakePHP2.1 の紹介 Cake2.1 Performance Mass Assignment CakePHP Tips Stream Wrapper @ichikaway http://cake.eizoku.com/blog/
  • 6. CakePHP2.1 祝 安定版リリース!! 2012/3/5 @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 7. CakePHP2.1 ●JsonView / XMLView の追加 ●View の継承 ●element('FooPlugin.bar'); ● 柔軟なイベントシステム ●Callback に優先度の設定 ●深い階層の配列データの保存 ● ex. User – Post - Comment @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 8. CakePHP2.1 ●php ファイルで ACL 定義 ● app/Config/acl.php ●Router::defaultRouteClass() 追加 ●Auth でユーザ検索の recursive 指定 ●SQL Debug に Prepared Statements のパラメータ 表示 ●app/Model/AppModel.php 必須 ● Controller 、 Helper も @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 10. Cake2 Performance ● 環境 ● Dell SC440(Pen, 2Gmem) Ubuntu ● PHP5.3.5(APC), Apache2, MySQL5.1 ● 計測ツール ● siege -c 10 -b -t 3S ● アプリケーション ● Bake した index アクション ● paginate, many link @ichikaway http://cake.eizoku.com/blog/
  • 11. Cake2 Performance Bake しただけの画面を対象に計測 @ichikaway http://cake.eizoku.com/blog/
  • 12. Cake2 Performance ● CakePHP1.3.11 ● 29 req/sec ● CakePHP2.0.4 ● 40 req/sec ● CakePHP2.1.0 ● 38 req/sec @ichikaway http://cake.eizoku.com/blog/
  • 14. Mass Assignment vulnerability ●2012/3/5 Github がハックされる ● 脆弱性の Issue を上げたけど無視された ● ハックして自分が RoR の Master repo にコミット するデモを披露 ●Rails の MassAssignmentVlunerability ● Post されたデータをそのまま保存 @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 15. Mass Assignment vulnerability // In controller $this->User->save($this->data); // PostData data[User][name] = 'Ichi' @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 16. Mass Assignment vulnerability // In controller $this->User->save($this->data); // PostData data[User][name] = 'Ichi' data[User][is_admin] = '1' @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 17. Mass Assignment vulnerability ●CakePHP での対応方法 ● SecurityComponent の利用 ● デフォルトでフォーム改竄チェックが有効に ● save データの限定 ● Model::whitelist プロパティで保存可能なフィー ルドを絞る ● Model::save() の第 3 引数で保存可能なフィー ルドを定義 @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 19. CakePHP2 Tips ●Security Component でフォーム改竄チェックをは ずす (CSRF 対応のみ利用したい) // In controller public $components = array( 'Security' => array('validatePost' => false), ); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 20. CakePHP2 Tips ●Prepared Statements を利用 ● Cake1 の query() は PreparedStatement ではない // In controller $sql = 'select * from posts as Post     where Post.id = :foo OR Post.id = :bar'; $result = $this->Post->getDatasource()->fetchAll( $sql, array('foo'=>1, 'bar' => 2)); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 21. CakePHP2 Tips ● コントローラ、モデルを階層管理 ● CakePHP1 では自動探索で無問題 App/Controller/Admin/AdminController.php App/Controller/Admin/FooController.php App/Controller/User/PostController.php @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 22. CakePHP2 Tips ● コントローラ、モデルを階層管理 ● CakePHP2 ではパスを指定 // in bootstrap.php App::build(array( 'Controller' => array( '/app/Contoroller/Admin/', '/app/Contoroller/User/' ))); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 23. CakePHP2 Tips ● コントローラ、モデルを階層管理 ● CakePHP2 でも自動探索したい! AutoAppBuild Plugin https://github.com/ichikaway/AutoAppBuild @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 24. CakePHP2 Tips ●コントローラ、モデルを階層管理 ● AutoAppBuild ● app/Plugin/AutoAppBuild に設置 // in bootstrap.php CakePlugin::load(array( 'AutoAppBuild' => array('bootstrap' => true) )); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 26. Motivation ●エレメントの内容を DB に入れて管理したい ● エレメントには html タグ、 php コードが混在 ● ファイルの場合は、 include すれば html/php がレ ンダリングされて出力 ● DB 内のエレメントコンテンツを入れた変数を include したい! <- これどうやるの? @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 27. Stream ●PHP のストリーム ● ファイルの入出力のように様々なプロトコルを透過 的に扱う仕組み ● fopen('http://example.com/foo/bar'); ● fopen('file://foo/bar.txt'); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 28. Stream ●PHP のストリーム ● ftp:// ● php:// ● zlib:// ● data:// ● ssh2:// ● php:// @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 29. Stream ●PHP のストリーム ● data:// の text/plain で実現できそう $data = 'hello <?php echo "world"; ?>'; include('data://text/plain,' .$data); php.ini の下記条件が必須 allow_url_fopen = ON allow_url_include = ON @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 30. Stream ●PHP のストリームを自作することに ● https://gist.github.com/1832549 ● App::import('Vendor', 'VariableStream'); stream_wrapper_register("var", "VariableStream"); $val = 'Hello <?php echo "World"; ?>'; include("var://".urlencode($val)); // 内部で urldecode している @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 31. Stream ●PHP のストリームに必須なメソッド ● url_stat() ● stream_stat() ● stream_open() 変数の読込み ● stream_read()  読込んだ変数を返す ● stream_tell()   読込んだポジション ● stream_eof()   読込み終了判定 @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  • 32. CakePHP2.1 の紹介 Cake2.1 Performance Mass Assignment CakePHP Tips Stream Wrapper @ichikaway http://cake.eizoku.com/blog/
  • 33. THANK YOU @cakephper http://cake.eizoku.com/blog/