なぜテンプレートを使うのか?
なぜPHPでテンプレートシステムを使用する必要があるのか?
PHP自体がテンプレート言語なのに、なぜPHPでテンプレートシステムを使うのか?
まずは、興味深い紆余曲折を経たこの言語の歴史を簡単に振り返ってみましょう。HTMLページの生成に使われた最初のプログラミング言語のひとつにC言語がある。しかし、C言語をHTMLの生成に使うのは現実的でないことがわかった。そこでラスマス・レンドルフは、C言語をバックエンドに動的なHTMLを生成するPHPを開発した。PHPはもともとテンプレート言語として設計されましたが、時間の経過とともに機能が追加され、本格的なプログラミング言語となりました。
それでもなお、テンプレート言語として機能しています。PHP ファイルは HTML
ページを含むことができ、その中で変数が出力されます。
<?= $foo ?>
などがあります。
PHPの歴史の初期に、外観(HTML/CSS)とアプリケーションロジックを厳密に分離する目的で、Smartyテンプレートシステムが作成されました。これは、意図的にPHP自体よりも制限された言語を提供し、例えば、開発者がテンプレートからデータベースクエリを作成することなどができないようにしました。その反面、プロジェクトに依存する部分が増え、複雑さを増し、プログラマーは新たにSmarty言語を習得する必要がありました。このような利点は賛否両論あり、テンプレートにはプレーンなPHPが使われ続けました。
時が経つにつれ、テンプレートシステムは便利なものになり始めました。テンプレートシステムは、継承、サンドボックスモードなどの概念を導入し、純粋なPHPと比較してテンプレート作成を大幅に簡素化する様々な機能を備えています。そして、セキュリティの話題、XSSのような脆弱性の存在、エスケープの必要性がクローズアップされるようになりました。テンプレートシステムでは、プログラマーがエスケープを忘れて深刻なセキュリティホールを作ってしまうリスクを排除するために、自動エスケープを導入しました(これには一定の落とし穴があることは、すぐにわかります)。
現在、テンプレートシステムのメリットは、その導入にかかるコストをはるかに上回っています。だから、使うことに意味があるのです。
TwigやBladeよりもLatteの方が優れているのはなぜですか?
理由はいくつかありますが、楽しいものもあれば、ものすごく便利なものもあります。ラテは、心地よさと便利さを兼ね備えています。
*LatteはPHPと同じ構文です。唯一の違いはタグの表記で、<?=
や?>
の代わりに、より短い{
や}
を好みます。つまり、新しい言語を学ぶ必要がないのです。トレーニングの費用も最小限に抑えられます。最も重要なのは、開発中に、PHP言語とテンプレート言語を常に「切り替える」必要がないことです。これは、Python言語を使用するTwigテンプレートとは異なり、プログラマーは2つの異なる言語を切り替えることを余儀なくされます。
*Twig、Blade、Smartyのようなすべてのテンプレートシステムは、自動エスケープという形でXSSに対する保護を含むように進化してきました。より正確には、htmlspecialchars()
関数を自動的に呼び出すことです。しかし、Latteの制作者たちは、これがまったく正しい解決策ではないことに気づきました。というのも、文書の異なる部分には異なるエスケープ方法が必要だからです。ナイーブな自動エスケープは、誤った安心感を与えるため、危険な機能です。
自動エスケープが機能的で信頼できるものであるためには、データが文書中のどこに出力されているかを認識し(これをコンテキストと呼ぶ)、それに応じてエスケープ関数を選択する必要があります。従って、文脈を考慮したものでなければならない。そして、これがLatteにできることなのです。ラテはHTMLを理解する。テンプレートを単なる文字列として認識するのではなく、タグや属性などが何であるかを理解している。そのため、HTMLテキスト内、HTMLタグ内、JavaScript内などで異なるエスケープを行います。
Latteは、文脈依存のエスケープを持つ最初で唯一のPHPテンプレートシステムです。また、真に安全な唯一のテンプレートシステムです。
*LatteはHTMLを理解するため、他にもとても楽しい機能を提供しています。例えば、n:attributes。あるいはリンクをチェックする機能。その他にもたくさんあります。
エスケープとは何ですか?
エスケープとは、ある文字列を別の文字列に挿入する際に、特殊な意味を持つ文字を対応する配列に置き換えて、不要な効果やエラーを防止する処理である。例えば、HTMLテキストに文字列を挿入する際、<
という文字がタグの先頭を示すという特別な意味を持つ場合、これを対応する配列であるHTMLエンティティ<
に置き換えます。これにより、ブラウザは<
の記号を正しく表示することができます。
PHPのコードを書くときに直接エスケープする簡単な例として、バックスラッシュを前に置いて引用符を文字列に挿入することができます。
エスケープについては、「XSSを防御する方法」の章で詳しく説明しています。
ラテのテンプレートからデータベースのクエリを実行することは可能ですか?
テンプレートでは、プログラマが渡したオブジェクトを操作することができます。プログラマがその気になれば、テンプレートにデータベース・オブジェクトを渡してクエリを実行することができます。そうしようと思えば、それを妨げる理由はない。
クライアントや外部のコーダーにテンプレートを編集させる場合は、別の状況が発生します。この場合、彼らにデータベースへのアクセス権を与えたくないのは間違いありません。もちろん、テンプレートにデータベース・オブジェクトを渡すことはしませんが、他のオブジェクトを通してアクセスできる場合はどうでしょうか。その解決策がサンドボックスモードで、テンプレートで呼び出せるメソッドを定義することができます。このおかげで、セキュリティ侵害を心配する必要はありません。
Latte、Twig、Bladeなどのテンプレートシステムの主な違いは何ですか?
Latte、Twig、Bladeといったテンプレートシステムの違いは、主に構文、セキュリティ、フレームワークとの統合にある:
- Latte:PHP言語の構文を使用するため、学習と使用が容易です。XSS攻撃に対して最高レベルの保護を提供します。
- Twig: Pythonのような構文を使用しており、PHPとは全く異なる。文脈を区別せずにエスケープすることができます。Symfonyフレームワークとうまく統合されています。
- Blade:PHPとカスタム構文のミックスを使用します。文脈を区別することなくエスケープします。Laravelの機能およびエコシステムと緊密に統合されています。
企業がテンプレートシステムを使うことに意義はあるのか?
まず、トレーニングにかかる費用、使用方法、そして全体的な利点は、システムによって大きく異なります。テンプレートシステム「Latte」は、PHPの文法を使っているため、PHPに慣れているプログラマーにとっては、学習が非常に簡単になる。プログラマーがLatteを十分に使いこなせるようになるには、通常数時間かかるため、トレーニングコストを削減し、技術の導入を加速させ、最も重要な日常使用における効率化を実現します。
さらに、Latteは、独自のコンテキストアウェアエスケープ技術により、XSS脆弱性に対する高度な保護を提供します。この保護機能は、Webアプリケーションのセキュリティを確保し、ユーザーや企業データを危険にさらす攻撃のリスクを最小化するために極めて重要です。また、Webアプリケーションのセキュリティは、企業の評判を維持するためにも重要です。セキュリティの問題は、顧客からの信頼を失い、市場における企業の評判を損なうことにつながります。
また、Latteを使うことで、開発コストとメンテナンスコストの両方が簡単になり、全体的なコストダウンにもつながります。したがって、テンプレートシステムを使うことは、間違いなく価値があります。
LatteはWebアプリケーションのパフォーマンスに影響を与えるか?
Latteのテンプレートは高速に処理されますが、この点はあまり重要ではありません。なぜなら、ファイルの解析は最初の表示時に一度だけ行われるからです。その後、PHPコードにコンパイルされ、ディスクに保存され、再コンパイルを必要とせずに、その後のリクエストごとに実行されます。
本番環境ではこのように動作しています。開発中、Latteのテンプレートは内容が変わるたびに再コンパイルされるため、開発者は常に最新版を見ることができます。