6


1

ユーザーが作成したDjangoテンプレートをレンダリングしても安全ですか?

ユーザーが一連の定義済み変数を使用して独自のDjangoテンプレートを作成し、このテンプレートをサーバーでレンダリングできるようにすることは安全ですか? 非常に限られたパラメーターセットのみを `render`に渡します。これらはすべて文字列です。 テンプレートは次のようになります。

hey, my name is {{name}}.

だから、質問は、ユーザーが取得するはずのない情報を取得するために悪用される可能性のあるdjangoテンプレートタグはありますか? 私は、 `{%url%}`タグについて最も心配しています。

P.S.

タイトルを記入した後にhttps://stackoverflow.com/questions/1987742/safely-rendering-user-provided-django-templates [この質問]に気づきましたが、私の質問は少し異なります。 おそらく、HTML / javascriptをまったく許可しないか、Textile / Markdownを使用するか、HTMLを非常に基本的なタグセットに制限する方法を見つけます。

3 Answer


5


3つの主なリスクがあります。

  1. データを変更するユーザー。 たとえば、レンダリング `{{request.user.kill}}`は、値の検索中に `kill()`呼び出しをトリガーします。 これを防ぐには、モデルコードで「kill.alters_data = True」を設定する必要があります。 データを変更するすべての組み込みモデルメソッドは既にマークされているため、リスクは独自のメソッドまたは不完全に記述されたサードパーティアプリによって提供されるメソッドにのみ関連付けられます。

  2. 表示すべきではないデータに直接アクセスするユーザー。 When (ほとんどの場合) `RequestContext`が使用され、テンプレートレンダリングコンテキストに多くの変数が追加されます。 ユーザー定義のテンプレートを追加すると、ユーザーは任意のコンテキストプロセッサで追加されたものを表示できるため、非常に危険な組み合わせになります。

  3. リレーションを通じて見るべきではないデータにアクセスするユーザー。 あなたが モデルインスタンスをテンプレートに渡すと、その関係は予想以上にトラバースされる可能性があります: `{{current_user.corporate_account.owner.ssn}}`おっと…​ 予防策としては、モデルの関係を慎重に確認して、デリケートなものを公開しないようにしてください。

全体として、上記のリスクを認識し、ユーザーが指定した文字列を通常のテンプレートとは別にレンダリングする限り、安全だと思います。 そして、「{%debug%}、{%include%}」を明示的に禁止してください。 {%ssi%} `テンプレートタグは、非常に機密性の高い情報を提供する可能性があるためです。 安全にプレイして、変数とフィルターのみを許可し、コントロールタグを完全に禁止することもできます。


4


includeおよびhttp://docs.djangoproject.com/en/1.1/ref/templates/builtins/#ssi[ssi ]私の好み、特に絶対パスを使用する `ssi`には危険すぎるようです。 私の意見では、これはあまりにも危険なビジネスです。


3


サーバー側の観点からは安全です(おそらく、誰も監査したことがないでしょう)が、ユーザーはXSS攻撃を実行したいJavascriptを明らかに生成できます。