Jinja: デフォルトで無効になっている自動エスケープは危険なデフォルトです

作成日 2016年01月06日  ·  4コメント  ·  ソース: pallets/jinja

私は今日、外部から報告されたXSSを通じて、Jinjaがデフォルトで自動エスケープをオンにしないことを発見しました。 これは危険なデフォルトであり、2007年以降デフォルトで自動エスケープが有効になっているDjangoテンプレートに関する以前の知識を通じて、多くの人がJinjaに紹介されるという事実によってさらに危険になっています。

インターネットで見ると、この事実はあまり知られていないようです。 実際、ウェブサイトにjinja2を使用し、自動エスケープをオフのままにすることを推奨する本(Python 3オブジェクト指向プログラミング、第12章、cc @buchuki)も見つけました。 Githubプロジェクトのランダムなサンプルは、ほとんどの人がautoescape = Trueまたはautoescape拡張機能をプロジェクトに追加しないことも示しています。

その時点でより安全なデフォルトに移行するのはおそらく苦痛だと私は理解していますが、ドキュメントは少なくとも自動エスケープがデフォルトでオフになっていることを明らかにする必要があります。 おそらく、jinja2.Environmentオブジェクトを作成するすべての例にautoescape = Trueを追加したり、ドキュメントの非常に早い段階でセクションを追加したりします。

docs

最も参考になるコメント

プルリクエストの良い候補のように聞こえます:)

全てのコメント4件

JinjaはHTMLだけでなく、汎用のテンプレートエンジン用です。 ほとんどの人がFlaskでJinjaを使用していると思います。これにより、HTMLテンプレートの自動エスケープがデフォルトで有効になります。 テンプレートエンジンを独自のフレームワークに統合する場合は、それを安全に使用する方法に関するドキュメントを読む必要があります。

そうは言っても、HTMLを生成するときにおそらく自動エスケープを使用する必要があることをドキュメントで明確にすることは良い提案だと思います。

私はほとんどの主要なフレームワークがこれを正しく行うと思います(より多くの目、より少ないバグなど)が、この間違いを犯すJinjaを手動で統合する小さなプロジェクトもたくさんあります。

そして率直に言って、Jinjaのドキュメントはその主題に関して本当に貧弱です。 Jinjaのドキュメントを開いたときに最初に表示されるものは次のとおりです。

Jinja2は、Djangoのテンプレートをモデルにした、Python用のモダンでデザイナーフレンドリーなテンプレート言語です。 オプションのサンドボックステンプレート実行環境を使用すると、高速で広く使用され、安全です。

「Djangoのテンプレートをモデルにした」および「セキュア」は、自動エスケープなどのDjangoのテンプレートセキュリティ機能を備えていると考える可能性があります。

次に、HTMLである例。 そしてその直後、機能のリストで:

XSS防止のための強力な自動HTMLエスケープシステム

これはオプションであり、デフォルトでは有効になっていないことについては触れていません。

「基本的なAPIの使用法」のドキュメントページには、自動エスケープが有効になっていることは表示されませんが、HTMLも表示されないので、問題ないと思います。 しかし、 APIの「基本」ページに移動すると

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')

最初の例は、些細なXSSに対して脆弱です。 人々は混乱するのは当然です。

プルリクエストの良い候補のように聞こえます:)

みんなのコードを壊さずにこれをオフにすることはできません。 ただし、それに応じてドキュメントを更新できてうれしいです。 これを修正として閉じますが、ドキュメントの更新のためにPRを開いてください。

このページは役に立ちましたか?
0 / 5 - 0 評価