• 2018-06-07
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/06/djangoautoescape.html

Djangoのタグ「autoescape」でエスケープ解除 クロスサイトスクリプティングに注意

クロスサイトスクリプティングという言葉があります。

Webサイトの中にJavaScript等を仕込んでサイトをぶっ壊したりする行為ですが、これは「<」や「>」といったHTML上で特別な意味のある記号を別の文字に置き換えることで防ぐことが出来ます。
これを「エスケープ」と言います。

Djangoでは、このエスケープ処理が自動で発動(auto escape)しているのですが、諸事情により意図的にエスケープを停止したい時は、組み込みタグ「autoescape」を使用することで対応可能です。


autoescapeでエスケープのON/OFF

以下のようなクロスサイトスクリプティングが再現するソースがあるとします。

view.py

def autoescape(request):
    context = {"param": "<script>alert('日本一平凡なクロスサイトスクリプティング');</script>"}

    return render(request, 'tag_samples/autoescape.html', context)

対して、テンプレート側では「autoescape on/off」を使うことで、エスケープしたりしなかったりを切り替えることが出来ます。

view.py

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>日本一平凡なサンプル</title>
</head>
<body>

▼何もしなければ autoescape は on である。<br/>
{{param}}です。

<hr/>

▼autoescape はデフォルトでonだが、デフォルトでoffにしている場合はこれでonに出来る。<br/>
{% autoescape on %}
    {{param}}
{% endautoescape %}

<hr/>

▼autoescape を off にすることでクロスサイトスクリプティング発動。<br/>
{% autoescape off %}
    {{param}}
{% endautoescape %}

</body>
</html>

結果

予想通りに autoescape off にしたところでクロスサイトスクリプティングになりました。

出展

公式サイトはこちら。


バックナンバー

0 件のコメント:

コメントを投稿

お気軽にコメント下さい。