サンドボックス

Latteには、フードの直下に装甲された砦があります。これはサンドボックスモードと呼ばれ、信頼できないソースからテンプレートを使用するアプリケーションを保護するための重要な機能です。例えば、ユーザー自身が編集している場合などです。

サンドボックス・モードは、砂が箱の外に出ないようにするものです。したがって、タグ、フィルター、関数、メソッドなどへのアクセスが制限されます。 どのように機能するのでしょうか?テンプレートで許可したいものを定義するだけです。最初は、すべてが禁止されており、徐々に許可を与えていきます。

次のコードは、テンプレートが{block},{if},{else},{=} タグ(後者は変数や式を表示するタグ)とすべてのフィルタを使用することを許可しています。

$policy = new Latte\Sandbox\SecurityPolicy;
$policy->allowTags(['block', 'if', 'else', '=']);
$policy->allowFilters($policy::All);

$latte->setPolicy($policy);

また、グローバルな関数、メソッド、オブジェクトのプロパティへのアクセスも許可することができます。

$policy->allowFunctions(['trim', 'strlen']);
$policy->allowMethods(Nette\Security\User::class, ['isLoggedIn', 'isAllowed']);
$policy->allowProperties(Nette\Database\Row::class, $policy::All);

これってすごいことだと思いませんか?非常に低いレベルですべてをコントロールすることができるのです。もしテンプレートが未承認の関数を呼び出したり、未承認のメソッドやプロパティにアクセスしようとすると、例外がスローされますLatte\SecurityViolationException.

すべてが禁止された状態でゼロからポリシーを作成するのは不便なので、安全な基礎から始めることができます。

$policy = Latte\Sandbox\SecurityPolicy::createSafePolicy();

これは、contentType,debugbreak,dump,extends,import,include,layout,php,sandbox,snippet,snippetArea,templatePrint,varPrint,widget を除いて、すべての標準タグが許可されていることを意味します。 datastream,noescape,nocheck を除くすべての標準的なフィルタも許可されています。最後に、オブジェクト$iterator のメソッドとプロパティへのアクセスも許可されています。

このルールは、新しい {sandbox}タグで挿入されるテンプレートにも適用されます。これは{include} のようなものですが、サンドボックスモードをオンにし、外部変数を一切渡さないようにしています。

{sandbox 'untrusted.latte'}

したがって、レイアウトと個々のページは、以前のようにすべてのタグと変数を使用することができ、制限はテンプレートにのみ適用されますuntrusted.latte.

禁止されているタグやフィルタの使用など、一部の違反はコンパイル時に検出されます。また、オブジェクトの許可されていないメソッドを呼び出すなどの違反は、実行時に検出されます。 テンプレートは、その他のバグを含むこともできます。サンドボックス化されたテンプレートから例外が発生し、レンダリング全体が中断するのを防ぐために、独自の例外ハンドラを定義し、例えば、単にログを記録することができます。

すべてのテンプレートに対して直接サンドボックスモードをオンにしたい場合は、簡単です。

$latte->setSandboxMode();