2008-08-19 1 views
51

Каков наилучший способ дезинформировать ввод пользователя для веб-приложения на основе Python? Есть ли одна функция для удаления символов HTML и любых других необходимых комбинаций символов для предотвращения атаки XSS или SQL?Утилизация пользовательского ввода с использованием Python

+9

вы не должны пытаться исправить инъекции SQL с помощью дезинфицирующего пользовательский ввод! Если API базы данных правильно используется, нет никаких шансов на внедрение SQL. – 2010-03-22 20:52:57

+2

`... если используется API базы данных правильно нет возможности SQL-инъекции`. Правильно, вы имеете в виду использование параметризованных запросов? Это покрывает вас на 100%? – Medorator 2014-08-27 15:03:36

+2

@ buffer, я знаю, что ваш комментарий старый, но если вы хотите, чтобы другие люди, кроме OP, увидели ваши комментарии, вы должны вызвать их с помощью символа \ @. – user1717828 2015-10-27 19:59:07

ответ

0

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

В противном случае я бы рекомендовал использовать некоторую проверку регулярных выражений, прежде чем принимать входные данные из форм. Я не думаю, что для вашей проблемы есть серебряная пуля, но, используя модуль re, вы сможете построить то, что вам нужно.

6

Jeff Atwood сам описал, как StackOverflow.com дезинфицирует пользовательского ввода (в неязыковых конкретных условиях) на блоге переполнением стека: http://blog.stackoverflow.com/2008/06/safe-html-and-xss/

Однако, как Джастин указывает, если вы используете шаблоны Django или что-то подобное то они, вероятно, все-таки санируют ваш вывод HTML.

SQL-инъекция также не должна вызывать беспокойства. Все библиотеки баз данных Python (MySQLdb, cx_Oracle и т. Д.) Всегда дезинфицируют параметры, которые вы передаете. Эти библиотеки используются всеми объектно-реляционными картами Python (такими как модели Django), поэтому вам также не нужно беспокоиться о санитарии.

24

Ниже приведен фрагмент, который удалит все теги не в белом списке, и все атрибуты тегов не относятся к атрибутам whitelist (поэтому вы не можете использовать onclick).

Это модифицированная версия http://www.djangosnippets.org/snippets/205/, с регулярным выражением на значения атрибутов, чтобы предотвратить людей от использования href="javascript:..." и других случаях, описанных в http://ha.ckers.org/xss.html.
(например <a href="ja&#x09;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, так что это должно в значительной степени покрыть Вас.

+2

Я поддержал это, но теперь я не уверен. Я не думаю, что это защищает пользователей IE от атак src = "vbscript: msgbox ('xss'). – 2010-03-22 18:30:06

4

Я не делаю веб-разработки гораздо больше, но когда я сделал, я сделал что-то вроде так:

При отсутствии разбора не должно произойти, я обычно просто бежать данные, чтобы не мешать в базу данных когда я его храню, и избегаю всего, что я прочитал из базы данных, чтобы не мешать html при его отображении (cgi.escape() в python).

Скорее всего, если кто-то попытался ввести символы html или прочее, они действительно хотели, чтобы это отображалось как текст в любом случае. Если они этого не сделали, хорошо жуткий :)

Короче всегда избегайте того, что может повлиять на текущую цель данных.

Когда мне понадобился какой-то синтаксический разбор (разметка или что-то еще), я обычно пытался сохранить этот язык в непересекающемся наборе с html, поэтому я мог бы просто сохранить его соответствующим образом экранированным (после проверки на синтаксические ошибки) и разобрать его на html при отображении, не беспокоясь о данных, которые пользователь помещает там, мешая вашему html.

Смотрите также Escaping HTML

12

Лучший способ предотвратить XSS не попробовать и фильтровать все, а просто сделать кодировку HTML Entity. Например, автоматически поворачивайте < на & lt ;. Это идеальное решение, предполагающее, что вам не нужно принимать какие-либо входные данные html (за пределами областей форума/комментариев, где он используется как разметка, довольно редко нужно принимать HTML); есть чересчур много перестановок с помощью чередующихся кодировок, что ничего, кроме ультра-ограничительного белого списка (a-z, A-Z, 0-9, например) собирается что-то пропускать.

SQL Injection, в отличие от других мнений, по-прежнему возможна, если вы просто строите строку запроса. Например, если вы просто конкатенируете входящий параметр в строку запроса, у вас будет SQL Injection. Лучший способ защиты от этого также не фильтровать, а скорее использовать религиозные методы с параметризованными запросами и НИКОГДА не конкатенировать ввод пользователей.

Это не означает, что фильтрация не является лучшей практикой, но с точки зрения SQL Injection и XSS вы будете гораздо более защищены, если вы религиозно используете Parameterize Queries и HTML Entity Encoding.

19

Редактировать: 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 закончилась тем, что дала мне оповещения и вычеркнула страницу.

2

Чтобы отладить строковый ввод, который вы хотите сохранить в базе данных (например, имя клиента), вам нужно либо уйти от него, либо просто удалить любые кавычки (', ") из него. Это эффективно предотвращает классическую инъекцию SQL, может произойти, если вы собираете запрос SQL из строк, передаваемых пользователем

Например (если это приемлемо для удаления котировки полностью):.

datasetName = datasetName.replace("'","").replace('"',"") 
Смежные вопросы