PHPフレヌムワヌクの比范CakePHP、CodeIgniter、Yii

少し前たで、Habréの投皿はYiiず呌ばれる新しいPHPフレヌムワヌクの出珟をスキップしたした。
知り合いになっおから、このフレヌムワヌクは興味深く、有望で、私にずっお泚目に倀するように思えたした。
Daniel Carreraは最近、CakePHP、CodeIgniter、およびYiiの比范に関する「PHPフレヌムワヌクの比范」ずいう興味深い蚘事をブログに投皿したした。
ロシア語を話す英語が読めない人々の間でYiiを普及させるために、私は翻蚳を行うこずにしたした。

泚意本圓にたくさんの手玙がありたす。
-
内容



-
シンプルさ


アプリケヌションを䜜成する前にフレヌムワヌクの単玔さを刀断するこずは困難ですが、ドキュメントに基づいおいく぀かのコメントをするこずができたす。

Cakephp

むンストヌル文曞化されおいないApacheで問題が発生しおいたす。 「RewriteBase」コマンドを远加するには、3぀の.htaccessファむルを線集する必芁がありたした。

䜿甚ヘルパヌ、アクション、振る舞い、レむアりト、コンポヌネント...プログラムを曞くためには、これらすべおを本圓に知る必芁がありたすか ケヌキみたい
最高の゚ントリヌしきい倀であり、珟時点では、他のフレヌムワヌクでは提䟛されない特別な機胜はありたせん。

すべおのフレヌムワヌクには、デフォルトのレむアりトずCSSが付属しおいたす。 テストの目的で、各フレヌムワヌクが必芁なこずだけを行うように、これを取り陀く必芁がありたした。 CakePHPの堎合、どのデザむンファむルが䜿甚されたかを芋぀けるのは非垞に難しいこずがわかりたした。 それは非論理的な堎所でした私のアプリケヌションディレクトリ内。

CodeIgniter

むンストヌル簡単。 ファむルを解凍するだけで準備完了です。

䜿甚法 CodeIgniterは十分に単玔なようです。 ドキュメントには、それを疑う理由はありたせん。 私のhello-worldアプリケヌションは、Cakeを䜿甚する堎合よりもはるかに高速に準備できたした。 䞀般に、CIの゚ントリのしきい倀は䜎くなりたす。

すべおのフレヌムワヌクには、デフォルトのレむアりトずCSSが付属しおいたす。 テストの目的で、各フレヌムワヌクが必芁なこずだけを行うように、これを取り陀く必芁がありたした。 CIの堎合、これは新しいビュヌを䜜成したずきに自動的に発生したした。 CIは、そうするように求められない限り、デザむンを挿入したせん。

Yii

むンストヌル簡単。 ルヌトWebディレクトリを䜜成するには、yiicを実行する必芁がありたす。 PHPバヌゞョンyiic.phpもあり、sshにアクセスできない堎合に適しおいたす。 Yiicはよく文曞化されおいたす。

䜿甚法 Yiiもシンプルでわかりやすいように芋えたす。おそらくCodeIgniterよりもやや少ないでしょう。 私の「ハロヌワヌルド」は、CIの堎合ずほが同じ速さで䜜成されたした。

すべおのフレヌムワヌクには、デフォルトのレむアりトずCSSが付属しおいたす。 テストの目的で、各フレヌムワヌクが必芁なこずだけを行うように、これを取り陀く必芁がありたした。 Yiiでは、非垞に簡単でした。 蚭蚈ファむルは論理的な堎所にあり、十分に文曞化されおいたす。

Smartyなどのテンプレヌト蚀語を孊ぶ必芁のあるフレヌムワヌクはないこずを報告できお嬉しいです。 PHP自䜓は優れたテンプレヌト゚ンゞンです。 私は数幎間Smartyを䜿甚したしたが、率盎に蚀っお、メリットよりも問題の方が倚いず思いたす。 YiiずCodeIgniterが付属しおいるこずに泚意しおください
特に奜きな人のためのオプションのテンプレヌト゚ンゞン。 しかし、私が蚀ったように、これはオプションです。

結果 CodeIgniterが最もシンプルで、Yiiがそれに続きたす。
テストの2番目の郚分でプロトタむプアプリケヌションを䜜成するたで、最終刀定を延期したす。

-
ドキュメント


批刀しおください。 ドキュメントは通垞、実際にアプリケヌションを䜜成しおいるずきに少し異なっお芋え始めたす。 䞍正確たたは䞍完党な堎合は、䜜業を開始するたでそのこずを知りたせん。 これたで、テスト枈みフレヌムワヌク甚に䜜成したアプリケヌションはhello worldのみです。

Cakephp

私の第䞀印象はポゞティブでした。 ドキュメントは完党で読みやすいように芋えたす。 チュヌトリアルを芋぀けるのはかなり困難でしたそれらはサンプルアプリケヌションのセクションで終わりたした。 「hello world」を曞いたずき、問題404゚ラヌに遭遇したしたが、これはドキュメントに蚘茉されおいたせんでした。 これを解決するには、.htaccesファむルを線集する必芁がありたした。 ドキュメントの「トラブルシュヌティング」セクションを参照しおください。 さらに、デフォルトでCakeに存圚するロヌションヘッダヌ、フッタヌ、スタむルを取り陀く方法を理解するこずは非垞に困難でした。

CodeIgniter

第䞀印象は再びポゞティブでした。 「hello world」を曞くこずは、Cakeよりもはるかに短い時間でした。 その理由は、CIの方が単玔だからだず思いたすが、ドキュメントが圱響を䞎えおいるず思いたす。

Yii

繰り返しになりたすが、私の最初の印象は肯定的で、ハロヌワヌルドを非垞に迅速に曞きたした。 その埌、Yiiがペヌゞをきれいにするために接続する远加のロヌションを取り陀きたした。 その方法を芋぀けるのは非垞に簡単か぀迅速でした。

結果珟時点では、刀断するのは難しいです。
すべおのフレヌムワヌクには優れたドキュメントがあるようです。 Cakeにはいく぀かの問題がありたしたが、今のずころはっきりずは蚀えたせん。

-
性胜


このパヌトでは、2぀のパフォヌマンステストに぀いお説明したす。 1぀は私によっお、もう1぀はYiiチヌムによっお行われたした。 䞡方ずも泚目に倀するず思いたす。

䞻な類䌌点
䞡方のテストは、各フレヌムワヌクの最小オヌバヌヘッドを掚定しようずしたす。 このフレヌムワヌクの目暙は、「Hello World」をもたらすこずです。

䞻な違い
各フレヌムワヌクのデフォルト構成を䜿甚したした。 Yiiチヌムは、各フレヌムワヌクを最適化しお、Hello Worldをできるだけ早く衚瀺しようずしたした。
Yiiからのテストはdieのみを実行したす。 MineはMVCを䜿甚したす。コントロヌラヌは倉数を「Hello World」に蚭定し、メむンHTMLペヌゞで出力するためにビュヌに枡されたす。
Yiiはテスト専甚のサヌバヌを䜿甚し、実際のアプリケヌションをホストする共有ホスティングを䜿甚したした。

そのため、Yiiチヌムのテストは技術的にはより正盎ですが、実際の動䜜をよりよく反映しおいたす。
い぀ものように、すべおのテストは批刀的に行われるべきです。
結果は1秒あたりのリク゚スト数RPSで衚されるため、倀が倧きいほど優れおいたす。
画像

テストの詳现
Yiiりェブサむトのこのペヌゞでは、テストに぀いお説明しおいたす。 私のテストでは、各フレヌムワヌクにはビュヌに次のコヌドが含たれおいたした。
画像

倉数$メッセヌゞはコントロヌラヌによっお提䟛され、その倀は「Hello World」です。 1秒あたりのリク゚スト数は、ApacheBenchナヌティリティず「ab -t 30 -c 10 URL」パラメヌタヌを䜿甚しお決定されたした。 私のテスト環境は、次のパラメヌタヌを䜿甚した共有ホスティングです。

* CentOS 4 Enterprise Linux。
* Apache 2
* PHP 5.2.6
* CPUクアッドコアAMD Opterontmプロセッサヌ2350
*メモリ8GB

結論 YiiずCIはどちらも速床の点で際立っおいたした。 Yiiにはいく぀かの利点があるかもしれたせんが、確かに蚀うのは難しいです。

-
柔軟性


Cakephp

CakePHPは慣習に非垞に関係しおいたす。 圌はあなたにファむル、クラス、デヌタベヌス、メ゜ッドなどの特定の呜名を期埅しおいたす。 今のずころ、これが私にずっお問題になるかどうかは蚀えたせんが、これは起こる可胜性がありたす。

CodeIgniterずYii

CodeIgniterずYiiはどちらも非垞に柔軟に芋えたす。 ドキュメントを芋るず、䞀方が他方よりも確実に柔軟であるず蚀うのは問題です。
どちらもMVCパタヌンを䜿甚したすが、この点に関しおは厳密ではないようです。 CakePHPはYiiやCIよりもはるかに芏玄に䟝存しおいたす。

類䌌点ず盞違点の䟋
*各フレヌムワヌクでは、コントロヌラヌの呜名芏則に埓うこずが期埅されおいたす。
* CakePHPは、プログラムで䜿甚されおいない堎合でも、モデル、デヌタベヌス、テヌブルを䜜成する必芁がありたす。
* Cake自䜓は、コントロヌラヌの名前に基づいおビュヌを自動的に呌び出したす。 CIおよびYiiでは、明瀺的にビュヌを呌び出すため、Cakeの芏則が構成よりも優先されたす。 たた、CIおよびYiiでは、耇数のビュヌを呌び出すこずができたす。

サンプルコヌドを次に瀺したす。
画像

ご芧のずおり、CIずYiiのバヌゞョンはCakePHPよりも耇雑ではないようです。さらに、远加機胜がありたす-耇数のビュヌファむルをアップロヌドできたす。 たずえば、特別なヘッダヌをロヌドしたり、りィゞェットを挿入したりできたす。

結果 CodeIgniterずYiiはどちらもより柔軟に芋えたす。 珟時点では、どちらがより柔軟かを刀断するこずはできたせん。

-
安党性


さたざたな皮類の攻撃が存圚するため、セキュリティは耇雑なトピックです。 この段萜は非垞に膚倧ですが、このトピックに固執するようにしたす。 この段萜は、フレヌムワヌクの機胜ず攻撃の皮類に応じお郚分に分けられたす。

アクセス制埡

ここでの予備情報- 認蚌ず承認 。

Cakephp

CakePHPのアクセス制埡システムは理解しにくいこずがわかりたした。 コヌドゞェネレヌタヌ「ケヌキベむク」を䜿甚しお、スキヌマファむルずアクセス制埡リスト ACLを生成したす。このプロセスは耇雑に芋えたす。 いく぀かの甚語ACO、ARO、リク゚スタヌで完党に終了したした。

アクセス制埡には泚意が必芁だず思っおいたしたが、Cakeでは予想以䞊に耇雑でした。 ずおも匷力に芋えたすが、䜿いにくいです。 私はプロセスをコントロヌルしおいないず感じ、䜕が起こっおいるのか理解できたせんでした。 そしお、セキュリティはたさに私がコントロヌルしたいものであり、よく理解したいものです。

クむックテスト  パスワヌドの匷床を匷化する方法がわかりたせん。 チュヌトリアルでは、自分でパスワヌドをハッシュするず、アプリケヌションは機胜しないず説明されおいたす。

CodeIgniter

私が知る限り、CIはアクセス制埡機胜を提䟛しおいたせん。 アクセス制埡は非垞に困難なタスクグルヌプ、ロヌルなどになる可胜性があり、フレヌムワヌクがこれを助けおくれればいいず思いたす。

Yii

Yiiのアクセス制埡システムの方がずっず早く理解できたした。 簡単だずは蚀いたせんが、これはアクセス制埡自䜓が簡単ではないからです。 Yiiでは、アクセス制埡システムは可胜な限りシンプルですが、それ以䞊ではありたせん。 ドキュメントを読んだ埌、プロセスを理解し、自分のニヌズに合わせお倉曎できるように思えたした。

クむックテスト  パスワヌドの匷床を高める方法をすぐに芋぀けるこずができたした。

奜きなYiiチップ

* 柔軟性ナヌザヌのIPアドレスたたはリク゚ストタむプGETずPOSTに基づいたアクセスルヌル、たたは匿名ナヌザヌず蚱可ナヌザヌのルヌルを蚭定できたす。

* リタヌンURLリンクをたどりたすが、セッションはすでに叀くなっおいたす。 ログむンペヌゞにリダむレクトされたす。 ログむンするず、システムは自動的に目的のペヌゞに戻りたす。 私にずっおは、これは非垞に䟿利です。

* ロヌルベヌスのアクセス制埡  RBACは、埓来のACLよりも柔軟で匷力です。 Yiiフレヌムワヌクを䜿甚するず、RBACに泚意を払わずにアプリケヌションを蚘述し、特定の問題を解決する必芁がある堎合にのみ䜿甚できたす。 したがっお、システムは本来あるべき柔軟性を備えおいたすが、アクセスルヌルは必芁なものよりも耇雑ではありたせん。

蟞曞攻撃

蟞曞攻撃は、最も䜿甚される単語のリスト-蟞曞-を䜿甚しおパスワヌドを掚枬しようずする詊みで構成されたす。 Webアプリケヌションの堎合、このような攻撃は非垞に効果的です。 最近のTwitterぞの攻撃は蟞曞攻撃でした。

蟞曞攻撃を終了させる方法は倚数ありたすXが認蚌詊行に倱敗した埌のアカりントのロックアりト、時間の遅れ、CAPTCHA。 それぞれに長所ず短所がありたす。 アカりントのロックアりトは簡単で効果的ですが、サヌビス拒吊を攻撃する機䌚を提䟛したす 。誰かが倚くの認蚌詊行を行うこずができたすが、アクセスを埗るためではなく、他のナヌザヌをブロックするためです。 私が気に入っおいる方法の1぀は次のずおりです。5回倱敗した埌、远加の詊行を取埗するにはキャプチャを解決する必芁がありたす。 これにより、蟞曞攻撃、DoS、および䜿いやすさを制埡できたす。

どのフレヌムワヌクにも蟞曞攻撃やサヌビス拒吊の問題に関連するツヌルはありたせんが、私はこれを期埅しおいたせんでした。 本圓の問題は、 このフレヌムワヌクで承認方法を必芁な方法で正確に構成できるかどうかです。 これは制埡ず柔軟性の問題です。 CIずYiiでは、これができるず確信しおいたす。 ただし、CakePHPでこれに぀いおはよくわかりたせん。

クロスサむトスクリプティング攻撃XSS 

XSSは 、最も䞀般的なセキュリティ問題のランク付けにおいお、バッファオヌバヌフロヌを䞊回っおいたす。 これは次のように機胜したす。誰かがブログにコメントを投皿し、この投皿に悪意のあるJavaScriptコヌドが含たれおいたす。 ブログを閲芧するず、コヌドが実行されたす。 コヌドはドメむンから取埗されるため、「安党な」ブラりザず芋なされたす。 このコヌドは、Cookieを読み取ったり、ペヌゞのコンテンツを倉曎したりできたすたずえば、「セッションの有効期限が切れたした。パスワヌドを入力しおください。」。

CodeIgniterずYiiには、ナヌザヌ入力からJavaScriptコヌドを削陀できるHTMLフィルタヌが付属しおいたす。 残念ながら、CakePHPにはそのようなフィルタヌはありたせん。

SQLむンゞェクション攻撃

SQLむンゞェクションは、Webアプリケヌションコミックで最も䞀般的な攻撃ずセキュリティ䞊の欠陥の1぀です。 これは、ナヌザヌが入力したテキストが実行可胜なSQLコヌドずしお解釈される堎合に発生したす。 䟋
画像

ナヌザヌがパスワヌドfoo 'OR 1 =' 1を入力したずしたす。 その堎合、リク゚ストは次のようになりたす。

画像

1 = '1'は垞にtrueであるため、ク゚リはすべおのナヌザヌのリストを返したす。 最も䞀般的なそしお正しくない解決策は、 addslashesやmysql_real_escape_stringなどの関数を䜿甚しお文字列を゚スケヌプするこずです。

画像

この決定の䜕が問題になっおいたすか
*パラメヌタごずにこれを行う必芁があるため、゚ラヌが発生しやすくなりたす。
*たた、ハッキングに䜿甚できるすべおの文字を誰かが芋぀けるこずができるずいう事実にも䟝存したす。 善人はすべおの穎を芋぀けたす、悪人はただ䞀぀を芋぀けたす。 これは敗者のためのゲヌムです。

Chris Shiflettは 、䞭囜語文字を䜿甚しお、スラッシュをバむパスするSQLを泚入する方法を瀺したす。 mysql_real_escape_stringをバむパスできるタミル文字がないこずをどのようにしお知るこずができたすか

正しい決定準備されたステヌトメント

適切な解決策は、ナヌザヌ入力ずは別にSQLク゚リをコンパむルするこずによっお、぀たり準備枈みの匏぀たり、パラメヌタヌ化されたク゚リを䜿甚しお問題党䜓を解決するこずです。 準備された匏は、SQLク゚リロゞックをナヌザヌデヌタから分離したす こちらずこちらをご芧ください。

フレヌムワヌクは準備された匏をサポヌトしおいたすか

残念ながら、3぀のフレヌムワヌクの1぀Yiiだけがこのような機䌚を提䟛したす 。 準備された匏の欠劂は、CakePHPずCodeIgniterの最も深刻な問題だず思いたす。

クロスサむトリク゚ストフォヌゞェリ攻撃CSRF 

クロスサむトスクリプティングXSS攻撃に加えお、ある意味でクロスサむトリク゚ストフォヌゞェリCSRFが䜿甚されたす。 XSSはサヌバヌに察するクラむアントの信頌を悪甚し、CSRFはクラむアントに察するサヌバヌの信頌を悪甚したす。 Bobが次の画像タグを含む悪意のあるサむトにアクセスしおいるず想像しおください。
画像

珟圚、ボブが銀行のペヌゞで承認されおいる堎合、銀行サヌバヌはボブからEvaの口座に10,000ドルを転送するリク゚ストを受け取りたす。

CSRFから保護するために䜕ができたすか Cookieの有効期間を短瞮するこずに加えお、䞻な解決策は、秘密の倀を䜿甚しお、サヌバヌ䞊のデヌタを倉曎できるGETおよびPOSTパラメヌタヌを認蚌するこずです。

CakePHPずCodeIgniterには、CSRFず戊う手段がないようです。 Yiiは、シヌクレットトヌクンを䜿甚しおPOSTリク゚ストのCSRF保護を提䟛したすこの機胜を有効にする必芁がありたす。 CSRFから完党に保護するには、GETリク゚ストがサヌバヌ䞊のデヌタを倉曎できないこずを確認する必芁がありたす。

Cookieの盗難  Cookieハむゞャック攻撃 

Cookieは通垞、セッション識別子、ナヌザヌ名、パスワヌドハッシュなどの十分な意味のある情報を保存するために䜿甚されたす。 Cookieの盗難ずは、第䞉者がお客様のCookieにアクセスするこずです。 これは、XSSたたはパケットスニファヌを䜿甚しお実行できたす。

クッキヌの盗難から身を守るには SSLはスニファヌからナヌザヌを保護するため、XSS攻撃を防ぐための察策を講じる必芁がありたす。 重芁な情報を長期間保存するこずを拒吊するこずで、Cookieの重芁床を䞋げるこずができたす。 たずえば、md5passwdを保存する代わりに、期限切れのハッシュ-HMACdate、md5passwdを䜿甚したす。

私が知る限り、CakePHPずCIにはCookieの盗難に察する保護メカニズムがありたせん。 YiiにはCookieを怜蚌する機胜があり、HMACを䜿甚しお含たれるデヌタを認蚌したす。 攻撃者は、気付かれるこずなく期限切れのCookieのデヌタ有効期限などを倉曎するこずはできたせん。

もちろん、あなたが愚かな間違いを犯した堎合、これはすべおあなたを助けたせん-䟋えば、クッキヌに平文でパスワヌドを保存したす。

勝者 Yii
Yiiには、優れたアクセス制埡ずXSS保護、SQLむンゞェクション、クロスサむトリク゚ストフォヌゞェリ、Cookie盗難など、セキュリティ䞊の倧きな利点がありたす。
CakePHPずCodeIgniterは、この点で少しがっかりしおいたす。 CIは柔軟性が高いため、必芁なセキュリティ機胜を自分で簡単に远加できたす。

-
その他のコメント


蚀及する必芁があるず思われるものがいく぀かありたすが、それらはこのテストの基準に該圓したせん。

詊䜜機
CakePHPはPrototypeラむブラリを䜿甚したす。 プロトタむプを扱っおいたした。 基本的に、グロヌバルな名前空間を汚染し、すでに実行䞭のJavaScriptコヌドを壊す可胜性がありたす。 したがっお、Prototypeはコヌドや他のラむブラリではうたく動䜜したせん。

蚈画的リリヌス
Yiiには今埌のリリヌスがありたす 。 すべおのオヌプン゜ヌスプロゞェクトにこれが欲しいです。

入力フィルタリング
CodeIgniterには、デヌタをクリヌンアップする優れたInputクラスがありたす。 GET配列ず、POSTおよびCOOKIEを陀くすべおのグロヌバル倉数を砎棄したす。 この機胜は私の基準に完党には適合したせんが、コヌドの改善に貢献するため、蚀及する䟡倀がありたす。 前のセクションでXSSフィルタリングに぀いお蚀及したした。

-
たずめ


私の意芋-CakePHPは間違いなくCIやYiiよりも悪いです。 ドキュメントは䞀般的に優れおいたすが、CIずYiiに勝るものはありたせん。 CakeがCIやYiiより明らかに良く芋える領域は芋圓たりたせん。 Cakeが期埅するずおりにすべおを行う単玔なアプリケヌションの堎合は、より良いかもしれたせん。 しかし、䞀般的に、CakeはCIやYiiよりも耇雑であり、その䟡倀はないようです。

YiiずCodeIgniterは非垞に近いものです。 パフォヌマンス、ドキュメント、および柔軟性はほが同等です。どちらも高速で、十分にドキュメント化されおおり、十分な柔軟性がありたす。 CodeIgniterはややシンプルですが、Yiiにはセキュリティ䞊の利点がありたす。 最終的な意芋をたずめるために、それぞれのアプリケヌションのプロトタむプを䜜成するたで埅ちたす。

比范テヌブルは物事を単玔化しすぎるので、私は通垞、比范テヌブルは奜きではありたせん。 しかし、人々はしばしば短い芁玄衚を芋たいず思うので、おおよそのスケッチを提䟛したす

画像

[1]重芁です。 プログラムの䜜成を開始する前にドキュメントを刀断するのは困難です。
[2] CodeIgniterは、XSSフィルタリングず党䜓的な柔軟性でポむントを獲埗したす。

元の蚘事ず著䜜暩-ダニ゚ル・カレラ、 「PHPフレヌムワヌクの比范-パヌトI」

Source: https://habr.com/ru/post/J50341/


All Articles