ヤザマキ
春のCake祭り
2012/3/7CakePHP study
Yasushi Ichikawa
I amYasushi Ichikawa
@cakephperhttp://d.hatena.ne.jp/cakephper
Services
KANAELhttp://kanael.net
ATND::Paymenthttp://atndpay.eizoku.com
Tipsharehttp://tipshare.info
CakePHP2.1の紹介Cake2.1 PerformanceMass AssignmentCakePHP TipsStream Wrapper
@ichikaway http://cake.eizoku.com/blog/
CakePHP 2.1
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
祝 安定版リリース!!
2012/3/5
CakePHP2.1
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●JsonView / XMLView の追加
●View の継承
●element('FooPlugin.bar');●柔軟なイベントシステム
●Callback に優先度の設定
●深い階層の配列データの保存
● ex. User – Post - Comment
CakePHP2.1
@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
Cake2.1 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
@ichikaway http://cake.eizoku.com/blog/
Cake2 PerformanceBake しただけの画面を対象に計測
● 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
Mass AssignmentVulnerability
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●2012/3/5 Github がハックされる
● 脆弱性の Issue を上げたけど無視された
● ハックして自分が RoR の Master repo にコミット
するデモを披露
●Rails の MassAssignmentVlunerability● Post されたデータをそのまま保存
Mass Assignment vulnerability
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
// In controller$this->User->save($this->data);
// PostDatadata[User][name] = 'Ichi'
Mass Assignment vulnerability
@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
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●CakePHP での対応方法
● SecurityComponent の利用
● デフォルトでフォーム改竄チェックが有効に
● save データの限定
● Model::whitelist プロパティで保存可能なフィー
ルドを絞る
● Model::save() の第 3 引数で保存可能なフィー
ルドを定義
Mass Assignment vulnerability
CakePHP2 Tips
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●Security Component でフォーム改竄チェックをは
ずす (CSRF 対応のみ利用したい)
CakePHP2 Tips
// In controllerpublic $components = array( 'Security' => array('validatePost' => false),);
@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));
@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
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●コントローラ、モデルを階層管理
● CakePHP2 ではパスを指定
CakePHP2 Tips
// in bootstrap.phpApp::build(array( 'Controller' => array( '/app/Contoroller/Admin/', '/app/Contoroller/User/' )));
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●コントローラ、モデルを階層管理
● CakePHP2 でも自動探索したい!
CakePHP2 Tips
AutoAppBuild Pluginhttps://github.com/ichikaway/AutoAppBuild
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●コントローラ、モデルを階層管理
● AutoAppBuild ● app/Plugin/AutoAppBuild に設置
CakePHP2 Tips
// in bootstrap.phpCakePlugin::load(array(
'AutoAppBuild' => array('bootstrap' => true)));
Stream Wrapper
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●エレメントの内容を DB に入れて管理したい
● エレメントには html タグ、 php コードが混在
● ファイルの場合は、 include すれば html/php がレ
ンダリングされて出力
● DB 内のエレメントコンテンツを入れた変数を
include したい! <- これどうやるの?
Motivation
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●PHP のストリーム
● ファイルの入出力のように様々なプロトコルを透過
的に扱う仕組み
● fopen('http://example.com/foo/bar');● fopen('file://foo/bar.txt');
Stream
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●PHP のストリーム
● ftp://● php://● zlib://● data://● ssh2://● php://
Stream
@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
@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 している
@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
●PHP のストリームに必須なメソッド
● url_stat()● stream_stat()● stream_open() 変数の読込み
● stream_read() 読込んだ変数を返す
● stream_tell() 読込んだポジション
● stream_eof() 読込み終了判定
Stream
CakePHP2.1の紹介Cake2.1 PerformanceMass AssignmentCakePHP TipsStream Wrapper
@ichikaway http://cake.eizoku.com/blog/
THANK YOU
@cakephper http://cake.eizoku.com/blog/