Djangoにはすでにデザイナー向けの優れたテンプレートシステムがあることは知っていますが、特定のテンプレートタグとフィルターの使用を制限することは可能かどうか疑問に思います。
テンプレート開発をよりオープンにするために、デザイナー向けのDjangoプラグインを構築していますが、djangoテンプレートシステムのロジックを非表示にして、必要なものだけをデザイナーに公開したいと考えています。
例:{% load %}
テンプレートタグの使用を防ぎ、必要なタグのみをプリロードするにはどうすればよいですか?
このデコレータを試してください:安全なテンプレートデコレータ
著者の説明から:
関数内でテンプレートのロードと解析に使用できるタグとフィルターを制限するデコレーター。
これは主に、ユーザーにDTLの権限を付与するときに使用することを目的としています。明らかに、悪意のある可能性のあることをユーザーが実行できるようにしたくはありません。
たとえば、{%ssi%}タグは、不適切に構成されている場合に機密データを表示するために使用される可能性があります。
{%load%}を使用すると、テンプレートタグに記述した無制限のPythonコードすべてにアクセスできます。{%load sudo%} {%sudo rm -rf /%} o_0
「load」タグ(とりわけ)は、デフォルトのタグホワイトリストにリストされていないことに注意してください。これで装飾された関数でテンプレートを(ただし間接的に)解析すると、リストされていない組み込みタグは未定義のタグのように動作します(つまり、TemplateSyntaxErrorが発生します)。
{%load%}はホワイトリストに登録されていないため、便宜上、いくつかのカスタムタグまたはフィルターを「組み込み」として含めることができます。ライブラリへのモジュールパスを配置するだけで、extrakwargまたはextra_librariesリストに含めることができます。これらのライブラリは注意深く防御的にプログラムする必要があるため、通常、これは推奨されません。
注:これは、レンダリングコンテキストのクリーンアップについては何もしません!それは完全にあなた次第です!これは、テンプレートで許可されるタグとフィルターを制限するだけです。
例:
from django.template.loader import get_template
safe_get_template = use_safe_templates(get_template)
tmpl = safe_get_template('myapp/some_template.html')
from django.template import Template
use_safe_templates(Template)('{% load sudo %}')
# TemplateSyntaxError: Invalid block tag 'load'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加