20120307 CakePHP Study in Tokyo

33
ヤザマキ 春の Cake 祭り 2012/3/7 CakePHP study Yasushi Ichikawa

Transcript of 20120307 CakePHP Study in Tokyo

Page 1: 20120307 CakePHP Study in Tokyo

ヤザマキ

春のCake祭り

2012/3/7CakePHP study

Yasushi Ichikawa

Page 2: 20120307 CakePHP Study in Tokyo

I amYasushi Ichikawa

@cakephperhttp://d.hatena.ne.jp/cakephper

Page 3: 20120307 CakePHP Study in Tokyo

Services

KANAELhttp://kanael.net

ATND::Paymenthttp://atndpay.eizoku.com

Tipsharehttp://tipshare.info

Page 4: 20120307 CakePHP Study in Tokyo

CakePHP2.1の紹介Cake2.1 PerformanceMass AssignmentCakePHP TipsStream Wrapper

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

Page 5: 20120307 CakePHP Study in Tokyo

CakePHP 2.1

Page 6: 20120307 CakePHP Study in Tokyo

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

祝 安定版リリース!!

2012/3/5

CakePHP2.1

Page 7: 20120307 CakePHP Study in Tokyo

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

●JsonView / XMLView の追加

●View の継承

●element('FooPlugin.bar');●柔軟なイベントシステム

●Callback に優先度の設定

●深い階層の配列データの保存

● ex. User – Post - Comment

CakePHP2.1

Page 8: 20120307 CakePHP Study in Tokyo

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

●php ファイルで ACL 定義

● app/Config/acl.php●Router::defaultRouteClass() 追加

●Auth でユーザ検索の recursive 指定

●SQL Debug に Prepared Statements のパラメータ

表示

●app/Model/AppModel.php 必須

● Controller 、 Helper も

CakePHP2.1

Page 9: 20120307 CakePHP Study in Tokyo

Cake2.1 Performance

Page 10: 20120307 CakePHP Study in Tokyo

● 環境● 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

Page 11: 20120307 CakePHP Study in Tokyo

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

Cake2 PerformanceBake しただけの画面を対象に計測

Page 12: 20120307 CakePHP Study in Tokyo

● CakePHP1.3.11● 29 req/sec

● CakePHP2.0.4 ● 40 req/sec

● CakePHP2.1.0● 38 req/sec

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

Cake2 Performance

Page 13: 20120307 CakePHP Study in Tokyo

Mass AssignmentVulnerability

Page 14: 20120307 CakePHP Study in Tokyo

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

●2012/3/5 Github がハックされる

● 脆弱性の Issue を上げたけど無視された

● ハックして自分が RoR の Master repo にコミット

するデモを披露

●Rails の MassAssignmentVlunerability● Post されたデータをそのまま保存

Mass Assignment vulnerability

Page 15: 20120307 CakePHP Study in Tokyo

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

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

// PostDatadata[User][name] = 'Ichi'

Mass Assignment vulnerability

Page 16: 20120307 CakePHP Study in Tokyo

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

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

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

Mass Assignment vulnerability

Page 17: 20120307 CakePHP Study in Tokyo

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

●CakePHP での対応方法

● SecurityComponent の利用

● デフォルトでフォーム改竄チェックが有効に

● save データの限定

● Model::whitelist プロパティで保存可能なフィー

ルドを絞る

● Model::save() の第 3 引数で保存可能なフィー

ルドを定義

Mass Assignment vulnerability

Page 18: 20120307 CakePHP Study in Tokyo

CakePHP2 Tips

Page 19: 20120307 CakePHP Study in Tokyo

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

●Security Component でフォーム改竄チェックをは

ずす (CSRF 対応のみ利用したい)

CakePHP2 Tips

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

Page 20: 20120307 CakePHP Study in Tokyo

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

●Prepared Statements を利用

● Cake1 の query() は PreparedStatement ではない

CakePHP2 Tips

// 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));

Page 21: 20120307 CakePHP Study in Tokyo

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

●コントローラ、モデルを階層管理

● CakePHP1 では自動探索で無問題

CakePHP2 Tips

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

App/Controller/User/PostController.php

Page 22: 20120307 CakePHP Study in Tokyo

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

●コントローラ、モデルを階層管理

● CakePHP2 ではパスを指定

CakePHP2 Tips

// in bootstrap.phpApp::build(array( 'Controller' => array( '/app/Contoroller/Admin/', '/app/Contoroller/User/' )));

Page 23: 20120307 CakePHP Study in Tokyo

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

●コントローラ、モデルを階層管理

● CakePHP2 でも自動探索したい!

CakePHP2 Tips

AutoAppBuild Pluginhttps://github.com/ichikaway/AutoAppBuild

Page 24: 20120307 CakePHP Study in Tokyo

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

●コントローラ、モデルを階層管理

● AutoAppBuild ● app/Plugin/AutoAppBuild に設置

CakePHP2 Tips

// in bootstrap.phpCakePlugin::load(array(

'AutoAppBuild' => array('bootstrap' => true)));

Page 25: 20120307 CakePHP Study in Tokyo

Stream Wrapper

Page 26: 20120307 CakePHP Study in Tokyo

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

●エレメントの内容を DB に入れて管理したい

● エレメントには html タグ、 php コードが混在

● ファイルの場合は、 include すれば html/php がレ

ンダリングされて出力

● DB 内のエレメントコンテンツを入れた変数を

include したい! <- これどうやるの?

Motivation

Page 27: 20120307 CakePHP Study in Tokyo

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

●PHP のストリーム

● ファイルの入出力のように様々なプロトコルを透過

的に扱う仕組み

● fopen('http://example.com/foo/bar');● fopen('file://foo/bar.txt');

Stream

Page 28: 20120307 CakePHP Study in Tokyo

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

●PHP のストリーム

● ftp://● php://● zlib://● data://● ssh2://● php://

Stream

Page 29: 20120307 CakePHP Study in Tokyo

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

●PHP のストリーム

● data:// の text/plain で実現できそう

Stream

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

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

Page 30: 20120307 CakePHP Study in Tokyo

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

●PHP のストリームを自作することに

● https://gist.github.com/1832549●

Stream

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

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

Page 31: 20120307 CakePHP Study in Tokyo

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

●PHP のストリームに必須なメソッド

● url_stat()● stream_stat()● stream_open() 変数の読込み

● stream_read()  読込んだ変数を返す

● stream_tell()   読込んだポジション

● stream_eof()   読込み終了判定

Stream

Page 32: 20120307 CakePHP Study in Tokyo

CakePHP2.1の紹介Cake2.1 PerformanceMass AssignmentCakePHP TipsStream Wrapper

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

Page 33: 20120307 CakePHP Study in Tokyo

THANK YOU

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