Webサイトにおける最も一般的な重大な脆弱性は、クロスサイト・スクリプティング(XSS)です。 これは、攻撃者が悪意のあるスクリプトをページに挿入し、疑うことを知らないユーザーのブラウザで実行させることができます。 XSSは、ページを改ざんしたり、機密情報を取得したり、ユーザーの身元を盗んだりすることができます。
テンプレートシステムは、XSSに対する防御に失敗しています。Latteは、文脈依存のエスケープ機能により、効果的な防御を行うことができる唯一のシステムです。
安全なウェブサイトを望むなら、誰でもLatteを使う。
出典Acunetix社 Web脆弱性レポート
いくつかの異なるコンテキストで変数$text
を自動的にエスケープする例(一番上のテンプレートを編集することができます)。
{var $text = "O'Neill"} - をテキストで表示する。<span>テキスト{$text}で</span> - を属性で指定します。<span title={$text}></span> - 引用符で囲まれていない属性。<span title={$text}></span> - JavaScriptで<script>var = {$text}</script>
- をテキストで表示します。<span>オニール</span> - を属性で指定します。<span title='O'Neill'></span> - 引用されていない属性で<span title="O'Neill"></span> - JavaScriptで<script>var = "O'Neill"</script>
冗談ではなく、あなたはすでにラテ語を知っています。その中でどのように式を書くかも知っています。実際、PHPと全く同じように書かれています。 ですから、Latteでどのように書けばいいのか考える必要はありません。ドキュメントを見る必要もありません。 他の言語を学ぶ必要もありません。ただPHPのように書けばいいのです。 Latteの構文についての詳細
<ul>
{foreach $users as $user}
<li>{$user->name}</li>
{/foreach}
</ul>
{if $post->status === Status::Published}
Read post
{elseif count($posts) > 0}
See other posts
{/if}
{$product?->getDiscount()}
{$foo[0] + strlen($bar[Bar::Const])}
{array_filter($nums, fn($n) => $n < 100)}
LatteはPHPをベースにしていますが、TwigはPythonをベースにしています。Latteのデザイナーは、2つの異なる規約を常に切り替える必要がありません。
例えば、テンプレートのfor person in people
、PHPのforeach $people as $person
間です。
Latteには一つの区切り記号{...}
あるので、どこで{% %}
使い、どこで{{ }}
使うかを考える必要もないのです。
Twig to Latte tool を試してみてください。
<ul>
{foreach $foo->items as $item}
<li>{$item->name}</li>
{/foreach}
</ul>
<ul>
{% for item in foo.items %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
この機能はユーザーから好評です。私たちはこれを「n:attributes」と呼んでいます。{if} ... {/if}
..のような、HTML要素を包む対になるタグはすべて、そのn:if属性として書くことができます。{if} ... {/if}
ように、HTML要素を包むペアタグは、そのn:if
属性として記述することができる。
これは非常に効率的な記法である.属性はinner-
tag-
接頭辞を持つこともでき、その場合、動作はそれぞれ要素の内側で、開始と終了のHTMLタグに適用されます。
n-attributesの詳細
n:属性を使う。
<ul n:if="count($menu) > 1" class="menu">
<li n:foreach="$menu as $item">
<a n:tag-if="$item->href" href={$item->href}>
{$item->caption}
</a>
</li>
</ul>
そして、それがなくても同じ。
{if count($menu) > 1}
<ul class="menu">
{foreach $menu as $item}
<li>
{if $item->href}<a href={$item->href}>{/if}
{$item->caption}
{if $item->href}</a>{/if}
</li>
{/foreach}
</ul>
{/if}
LatteはHTMLを理解する次世代テンプレートシステムです。他のシステムが文字の束しか見ていないのに対し、LatteはHTMLの要素を見ています。 これが「文脈依存のエスケープ」や「n:属性」といった驚くべき機能を備えている理由です。
Blade、Twig、その他のシステムによるテンプレートの見方
░░░░░░░░░░░░░░░
░░░░░░
░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░@yield ('description')░
░░░░░░░
░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░
@foreach ($navigation as $item)
░░░░░░░░░░░░{{$item->link}}░{{$item->title}}░░░░░░░
@endforeach
░░░░░
░░░░░░░░
░░░░░░░░░░░░{{ $appName }}░
░░░░░░░░░
░░░░░░░
░░░░░░░
Latteはテンプレートをどのように見ているか
<!DOCTYPE html>
<html>
<head>
<title>It's all about context</title>
<meta name="description" content={include description}>
</head>
<body>
<ul class="navigation">
{foreach $navigation as $item}
<li><a href={$item->link}>{$item->title}</a></li>
{/foreach}
</ul>
<script>
var appName = {$appName};
</script>
</body>
</html>
洗練されたテンプレートの「再利用と継承」メカニズムにより、各テンプレートには固有のコンテンツのみが含まれ、繰り返される要素や構造は再利用されるため、生産性が向上します。
Latteはフードのすぐ下に装甲されたバンカーを備えています。これはサンドボックスモードと呼ばれ、ユーザー自身が編集したテンプレートなど、信頼できないソースからテンプレートを隔離します。 タグやフィルター、関数、メソッドなどへのアクセスも制限されます。「どうやって使うんだ?
Latteは、作業と同時にテンプレートを最適なPHPコードにコンパイルします。だから、まるで純粋にPHPで作成したかのような速さです。 コンパイルされたPHPコードは明瞭で、デバッグが容易です。テンプレートは、ソースファイルを変更するたびに自動的に再コンパイルされます。
Latteの開発には15年以上の歴史があります。そのため、私たちが提供するライブラリは、非常に成熟し、安定しており、広く使用されています。また、多くのグローバル企業や重要なウェブサイトから信頼を得ています。 「Latteを使う人、信頼する人は?
読者は、ドキュメントのわかりやすさや完成度を高く評価しています。快適な読書をお楽しみください。
Latteはオープンソースで、完全に無料で使用することができます。
The first version of Latte 2 was released in 2014 as part of the then revolutionary splitting of the framework into a collection of standalone libraries. Version 3 of Latte, representing a major evolutionary leap was released just over a year ago.
How can you detect errors in templates in a timely manner? You have several methods at your disposal.