django webappでJSONデータを安全にレンダリングするにはどうすればよいですか?
django のサーバーで JSON データを生成し、その JSON データを django テンプレートでレンダリングします。JSON には、html のスニペットが含まれることがあります。ほとんどの場合、それで問題ありません</script>
が、レンダリング時にタグが JSON データ内にある場合、周囲の JavaScript が破壊されます。
例えば...
サーバー上では、Python でこれを使用します。
template_data = {
'my_json' : '[{"my_snippet": "<b>Happy HTML</b>"}]'
}
# pass the template data to the django template
return render_to_response('my_template.html', template_data, context_instance = c)
そして、テンプレートで:
<script type="text/javascript">
var the_json = {{my_json|safe}};
</script>
... some html ...
結果のhtmlは正常に動作し、次のようになります。
<script type="text/javascript">
var the_json = [{"my_snippet": "<b>Happy HTML</b>"}];
</script>
... some html ...
ただし、サーバー上で JSON が次のようになると、問題が発生します。
template_data = {
'my_json' : '[{"my_snippet": "Bad HTML</script>"}]'
}
return render_to_response('my_template.html', template_data, context_instance = c)
レンダリングすると、次のようになります。
<script type="text/javascript">
var the_json = [{"my_snippet": "Bad HTML</script>"}];
</script>
... some html ...
JSON コード内の終了スクリプト タグは、スクリプト ブロック全体を終了するものとして扱われます。そうすると、すべての JavaScript が壊れます。
考えられる解決策の 1 つは、テンプレート データをテンプレートに渡すときにチェックする</script>
ことですが、もっと良い方法があるように感じます。