web-dev-qa-db-ja.com

送信されたフォームデータのHTMLのサニタイズ

送信されたフォームからすべてのhtml /スクリプトを確実に削除するために使用できる一般的な「フォームサニタイザー」はありますか? form.clean()はそれを何もしていないようです-htmlタグはすべてまだcleaned_dataにあります。または、実際にこれをすべて手動で行う(そしてフォームのclean()メソッドをオーバーライドする)ことが私の唯一のオプションですか?

29
abolotnov

Djangoには striptags というテンプレートフィルターが付属しており、テンプレートで使用できます。

value|striptags

strip_tagsにある関数Django.utils.htmlを使用します。フォームデータのクリーンアップにも利用できます。

from Django.utils.html import strip_tags
message = strip_tags(form.cleaned_data['message'])
29

strip_tagsは実際に入力からタグを削除しますが、これは意図したものではない可能性があります。

文字列を、山かっこ、アンパサンド、引用符を対応するHTMLエンティティに変換した「安全な文字列」に変換するには、 escape filterを使用できます。

from Django.utils.html import escape
message = escape(form.cleaned_data['message'])
47
simao

または、Pythonライブラリと呼ばれる bleach

Bleachは、ホワイトリストベースのHTMLサニタイズおよびテキストリンク化ライブラリです。これは、someHTMLで信頼できないユーザー入力を受け取るように設計されています。

Bleachはhtml5libを使用して、ブラウザと同じ方法でドキュメントフラグメントを解析するため、正規表現ベースのサニタイザーよりもはるかに優れた未知の攻撃に対する耐性が非常に高くなります。

例:

import bleach
message = bleach.clean(form.cleaned_data['message'], 
                       tags=ALLOWED_TAGS,
                       attributes=ALLOWED_ATTRIBUTES, 
                       styles=ALLOWED_STYLES, 
                       strip=False, strip_comments=True)
20
Wtower