環境
以下のサイトを参考に入力した値を取得するようにしています
https://docs.djangoproject.com/ja/4.1/intro/tutorial01/
https://bsf40.blogspot.com/2020/02/djangoform.html
Djangoは自動でサニタイズをしている
結果としてはDjangoはデフォルトで文字列のサニタイズを行っているようでした
そのためHTMLタグを含んだ文字を入力しても問題なく表示されていました
サニタイズとは?
HTMLなどで使用される特殊文字(「<」や「&」など)を置き換える処理になります
例えば「<」をサニタイズすると「<」となります
サニタイズ無効化
Djangoでサニタイズを無効化する方法があるようなので、そちらも試してみました
方法は2つ
safeフィルターとautoescapeフィルターの2つが主な方法のようです
- safeフィルター
safeフィルターは変数の後ろに|safe
とつけることでサニタイズを無効化できます
変数の後ろにつけることになるので、複数一気に無効化するには向いていません
今回だとmessageのサニタイズを無効化したいので、そこにsafeをつけています
<form action="" method="GET">
<label>{{ form.chat_bot.label }} {{ form.chat_bot }}</label><br/>
<input type="submit" value="送信">
<br/>
<br/>
{{ message|safe }}
</form>
サニタイズを無効化したことでHTMLタグが有効になりました
- autoescapeフィルター
autoescapeフィルターは {% autoescape off %}
と {% endautoescape %}
で挟んだ変数のサニタイズが無効化されます
複数を無効化したい場合に向いています
<form action="" method="GET">
<label>{{ form.chat_bot.label }} {{ form.chat_bot }}</label><br/>
<input type="submit" value="送信">
<br/>
<br/>
{% autoescape off %}
{{ message }}
{{ message }}
{% endautoescape %}
</form>
複数の変数のサニタイズを無効化できていることが確認できました
pythonによるサニタイズ
今度はDjangoのデフォルトのサニタイズではなく、pythonのサニタイズ方法を調べてみました
bleachというライブラリでサニタイズを行えるようなので、2度手間ですがautoescapeでサニタイズを無効化し、受け取った値をbleachでサニタイズしてみました
bleachの使い方は簡単で、 bleach.cleanでサニタイズできるようです
import bleach
text = "文字列"
bleach.clean(text)
実際に受け取った値をbleachを使用することでサニタイズできました