5
2

More than 1 year has passed since last update.

DjangoでXSS対策を確認してみた

Posted at

環境

以下のサイトを参考に入力した値を取得するようにしています
https://docs.djangoproject.com/ja/4.1/intro/tutorial01/
https://bsf40.blogspot.com/2020/02/djangoform.html

2022-09-05-13-28-12.png
2022-09-05-13-29-05.png

Djangoは自動でサニタイズをしている

結果としてはDjangoはデフォルトで文字列のサニタイズを行っているようでした
そのためHTMLタグを含んだ文字を入力しても問題なく表示されていました

2022-09-05-13-53-47.png

サニタイズとは?

HTMLなどで使用される特殊文字(「<」や「&」など)を置き換える処理になります
例えば「<」をサニタイズすると「&lt;」となります

サニタイズ無効化

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タグが有効になりました

2022-09-05-14-24-31.png

  • 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>


複数の変数のサニタイズを無効化できていることが確認できました

2022-09-05-14-26-04.png

pythonによるサニタイズ

今度はDjangoのデフォルトのサニタイズではなく、pythonのサニタイズ方法を調べてみました

bleachというライブラリでサニタイズを行えるようなので、2度手間ですがautoescapeでサニタイズを無効化し、受け取った値をbleachでサニタイズしてみました

bleachの使い方は簡単で、 bleach.cleanでサニタイズできるようです


import bleach

text = "文字列"

bleach.clean(text)

実際に受け取った値をbleachを使用することでサニタイズできました

2022-09-05-14-40-25.png

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2