Каков наилучший способ дезинформировать ввод пользователя для веб-приложения на основе Python? Есть ли одна функция для удаления символов HTML и любых других необходимых комбинаций символов для предотвращения атаки XSS или SQL?Утилизация пользовательского ввода с использованием Python
ответ
Если вы используете фреймворк вроде django, инфраструктура может легко сделать это для вас, используя стандартные фильтры. На самом деле, я уверен, что django автоматически сделает это, если вы не скажете об этом.
В противном случае я бы рекомендовал использовать некоторую проверку регулярных выражений, прежде чем принимать входные данные из форм. Я не думаю, что для вашей проблемы есть серебряная пуля, но, используя модуль re, вы сможете построить то, что вам нужно.
Jeff Atwood сам описал, как StackOverflow.com дезинфицирует пользовательского ввода (в неязыковых конкретных условиях) на блоге переполнением стека: http://blog.stackoverflow.com/2008/06/safe-html-and-xss/
Однако, как Джастин указывает, если вы используете шаблоны Django или что-то подобное то они, вероятно, все-таки санируют ваш вывод HTML.
SQL-инъекция также не должна вызывать беспокойства. Все библиотеки баз данных Python (MySQLdb, cx_Oracle и т. Д.) Всегда дезинфицируют параметры, которые вы передаете. Эти библиотеки используются всеми объектно-реляционными картами Python (такими как модели Django), поэтому вам также не нужно беспокоиться о санитарии.
Ниже приведен фрагмент, который удалит все теги не в белом списке, и все атрибуты тегов не относятся к атрибутам whitelist (поэтому вы не можете использовать onclick
).
Это модифицированная версия http://www.djangosnippets.org/snippets/205/, с регулярным выражением на значения атрибутов, чтобы предотвратить людей от использования href="javascript:..."
и других случаях, описанных в http://ha.ckers.org/xss.html.
(например <a href="ja	vascript:alert('hi')">
или <a href="ja vascript:alert('hi')">
и т.д.)
Как вы можете видеть, он использует (удивительный) BeautifulSoup библиотеку.
import re
from urlparse import urljoin
from BeautifulSoup import BeautifulSoup, Comment
def sanitizeHtml(value, base_url=None):
rjs = r'[\s]*(&#x.{1,7})?'.join(list('javascript:'))
rvb = r'[\s]*(&#x.{1,7})?'.join(list('vbscript:'))
re_scripts = re.compile('(%s)|(%s)' % (rjs, rvb), re.IGNORECASE)
validTags = 'p i strong b u a h1 h2 h3 pre br img'.split()
validAttrs = 'href src width height'.split()
urlAttrs = 'href src'.split() # Attributes which should have a URL
soup = BeautifulSoup(value)
for comment in soup.findAll(text=lambda text: isinstance(text, Comment)):
# Get rid of comments
comment.extract()
for tag in soup.findAll(True):
if tag.name not in validTags:
tag.hidden = True
attrs = tag.attrs
tag.attrs = []
for attr, val in attrs:
if attr in validAttrs:
val = re_scripts.sub('', val) # Remove scripts (vbs & js)
if attr in urlAttrs:
val = urljoin(base_url, val) # Calculate the absolute url
tag.attrs.append((attr, val))
return soup.renderContents().decode('utf8')
Как и другие плакаты уже говорил, почти все библиотеки Python DB заботиться о инъекции SQL, так что это должно в значительной степени покрыть Вас.
Я поддержал это, но теперь я не уверен. Я не думаю, что это защищает пользователей IE от атак src = "vbscript: msgbox ('xss'). – 2010-03-22 18:30:06
Я не делаю веб-разработки гораздо больше, но когда я сделал, я сделал что-то вроде так:
При отсутствии разбора не должно произойти, я обычно просто бежать данные, чтобы не мешать в базу данных когда я его храню, и избегаю всего, что я прочитал из базы данных, чтобы не мешать html при его отображении (cgi.escape() в python).
Скорее всего, если кто-то попытался ввести символы html или прочее, они действительно хотели, чтобы это отображалось как текст в любом случае. Если они этого не сделали, хорошо жуткий :)
Короче всегда избегайте того, что может повлиять на текущую цель данных.
Когда мне понадобился какой-то синтаксический разбор (разметка или что-то еще), я обычно пытался сохранить этот язык в непересекающемся наборе с html, поэтому я мог бы просто сохранить его соответствующим образом экранированным (после проверки на синтаксические ошибки) и разобрать его на html при отображении, не беспокоясь о данных, которые пользователь помещает там, мешая вашему html.
Смотрите также Escaping HTML
Лучший способ предотвратить XSS не попробовать и фильтровать все, а просто сделать кодировку HTML Entity. Например, автоматически поворачивайте < на & lt ;. Это идеальное решение, предполагающее, что вам не нужно принимать какие-либо входные данные html (за пределами областей форума/комментариев, где он используется как разметка, довольно редко нужно принимать HTML); есть чересчур много перестановок с помощью чередующихся кодировок, что ничего, кроме ультра-ограничительного белого списка (a-z, A-Z, 0-9, например) собирается что-то пропускать.
SQL Injection, в отличие от других мнений, по-прежнему возможна, если вы просто строите строку запроса. Например, если вы просто конкатенируете входящий параметр в строку запроса, у вас будет SQL Injection. Лучший способ защиты от этого также не фильтровать, а скорее использовать религиозные методы с параметризованными запросами и НИКОГДА не конкатенировать ввод пользователей.
Это не означает, что фильтрация не является лучшей практикой, но с точки зрения SQL Injection и XSS вы будете гораздо более защищены, если вы религиозно используете Parameterize Queries и HTML Entity Encoding.
Редактировать: bleach является оберткой вокруг html5lib, что делает его еще более простым в использовании в качестве санитария на белом фоне.
html5lib
поставляется с белым списком на основе HTML очистителя - это легко подкласс, чтобы ограничить тег и атрибуты пользователей разрешено использовать на вашем сайте, и даже попытку санировать CSS, если вы позволяете использовать style
атрибут.
Вот теперь я использую его в sanitize_html
функции полезности моего переполнению стека клона:
http://code.google.com/p/soclone/source/browse/trunk/soclone/utils/html.py
Я бросил все атаки, перечисленные в ha.ckers.org's XSS Cheatsheet (которые сподручно available in XML format на него после выполнения Markdown в HTML-преобразование с использованием python-markdown2 и, похоже, поддерживалось нормально.
Компонент редактора WMD, который в настоящее время использует Stackoverflow, - проблема, на самом деле мне пришлось отключить JavaScript, чтобы протестировать XS S Cheatsheet, так как вставка их всех в WMD закончилась тем, что дала мне оповещения и вычеркнула страницу.
Чтобы отладить строковый ввод, который вы хотите сохранить в базе данных (например, имя клиента), вам нужно либо уйти от него, либо просто удалить любые кавычки (', ") из него. Это эффективно предотвращает классическую инъекцию SQL, может произойти, если вы собираете запрос SQL из строк, передаваемых пользователем
Например (если это приемлемо для удаления котировки полностью):.
datasetName = datasetName.replace("'","").replace('"',"")
- 1. Веб-утилизация с использованием python
- 2. Проблемы с созданием массивов с использованием пользовательского ввода в Python
- 3. Django Python Утилизация мусора
- 4. Утилизация и безопасность ввода текста
- 5. Проблемы с использованием пользовательского ввода между функциями
- 6. Запись в файл с использованием пользовательского ввода в Python
- 7. Python - анализ пользовательского ввода с использованием подробного регулярного выражения
- 8. Поиск и замена в списке с использованием пользовательского ввода (python)
- 9. Веб-утилизация - извлечение данных со страницы с использованием python
- 10. numpy slicing с использованием пользовательского ввода
- 11. Конвертер температуры Ruby с использованием пользовательского ввода
- 12. Рекурсивная функция с использованием пользовательского ввода (JAVA)
- 13. Предоставление имен с использованием пользовательского ввода
- 14. Заполнение ввода с использованием пользовательского jquery dropdown
- 15. Как вызвать метод с использованием пользовательского ввода
- 16. Как разбить петлю с использованием пользовательского ввода?
- 17. Ruby с использованием пользовательского ввода как целого
- 18. Задать месяц Zend_Date с использованием пользовательского ввода
- 19. Выбор уникальных значений с использованием пользовательского ввода
- 20. Отправка пользовательского ввода POST с использованием AJAX
- 21. Загрузка тела сайтов с использованием пользовательского ввода
- 22. Получение пользовательского ввода с использованием PHP
- 23. Изменение переменных с использованием пользовательского ввода
- 24. Проблема с использованием пользовательского ввода из JTextField
- 25. Динамический калькулятор с использованием пользовательского ввода?
- 26. Объектно-ориентированное программирование с использованием пользовательского ввода
- 27. Показывать статус сервера с использованием пользовательского ввода
- 28. Калькулятор разбора пользовательского ввода с использованием regex
- 29. Python: Печать общей буквы с пользовательского ввода
- 30. Расчет формул Python с пользовательского ввода
вы не должны пытаться исправить инъекции SQL с помощью дезинфицирующего пользовательский ввод! Если API базы данных правильно используется, нет никаких шансов на внедрение SQL. – 2010-03-22 20:52:57
`... если используется API базы данных правильно нет возможности SQL-инъекции`. Правильно, вы имеете в виду использование параметризованных запросов? Это покрывает вас на 100%? – Medorator 2014-08-27 15:03:36
@ buffer, я знаю, что ваш комментарий старый, но если вы хотите, чтобы другие люди, кроме OP, увидели ваши комментарии, вы должны вызвать их с помощью символа \ @. – user1717828 2015-10-27 19:59:07