Почему Джанго позволяет пользователю войти alert(«hello») in form CharField without throwing an error?

#javascript #python #django #xss

#javascript #python #django #xss

Вопрос:

Я новичок в Django, и в моем приложении Django у меня есть модель, которая содержит основную информацию о транспортном средстве (название, модель, марка, год выпуска). Я добавляю информацию через форму. Проблема в том, что если пользователь должен ввести «alert(«ошибка»)», тогда форма разрешит это, и оно будет сохранено как действительный ввод. Поэтому, когда страница обновляется, на странице появится предупреждение, и поле теперь будет пустым. Как запретить пользователю вводить JavaScript в поле символов?

У меня нет ‘autoescape off’ нигде в базе кода, и я не использую ключевое слово ‘safe’ в html. У меня нет проверки ‘def clean’ для такого ввода, поскольку у меня сложилось впечатление, что Django позаботится о такой инъекции. Заранее спасибо!

Комментарии:

1. Используете ли вы шаблоны Django? Если нет, то как преобразовать данные из пользователя / базы данных в текст на экране?

2. @HenryWoody Я использую шаблоны Django, и странно то, что я вижу предупреждение, когда отображаю его в одной из моих таблиц данных. У меня есть несколько таблиц, но только одна показывает предупреждение. Мне также сообщили, что мой вызов ajax имеет флаг «ProcessData: false» и, следовательно, не экранирует вывод.

Ответ №1:

Это совершенно корректный ввод. Но это не приведет к появлению предупреждения на странице — потому что Django автоматически экранирует вывод.

Комментарии:

1. Дело в том, что предупреждение отображается, но не везде. Только когда одна из моих таблиц данных содержит скрипт. Я упомянул @HenryWoody, что мне также сообщили, что это может быть связано с тем, что мой вызов ajax, который сохраняет информацию в базе данных, имеет значение флага «ProcessData: false» и, следовательно, не кодирует данные и приводит к отображению предупреждения скрипта. Мой обходной путь на данный момент заключается в явном вызове функции escape() для переменной со сценарием оповещения.

Ответ №2:

Это можно решить с помощью функций strip_tags()

попробуйте это

 from django.utils.html import strip_tags

string_value = "<b>Iam </b> <button>Nancy</button> moree. <span>Thanks</span>"
sanitize_value = strip_tags(string_value)
print(sanitize_value)
  

Примечание:

Если вы используете strip_tags() , то вам следует обновить свой django как минимум до версий Django 1.6 и 1.7 и выше. Это связано с тем, что эксперты по безопасности нашли способ обойти strip_tags в версии django ниже версии 1.6. см

ссылка на источник

Решение 2:

Если вы используете шаблоны django, вы также можете попробовать этот фильтр шаблонов striptags() на ваш взгляд.

 {{ value|striptags }}
  

если значение равно "<b>Iam </b> <button>Nancy</button> moree. <span>Thanks</span>"

результатом будет «Я Нэнси Мори. Спасибо «.

ссылка на источник

решение 3:

вы также можете очистить библиотеку python с помощью метода clean() источник