Сведения о вопросе

GANGST1ER

05:33, 9th August, 2020

Теги

python   xss    

Очистка пользовательского ввода с помощью Python

Просмотров: 675   Ответов: 7

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



  Сведения об ответе

VERSUION

02:13, 16th August, 2020

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

Это модифицированная версия http://www.djangosnippets.org/snippets/205/, с regex на значениях атрибутов, чтобы предотвратить использование людьми href="javascript:..." и других случаев, описанных в http://ha.ckers.org/xss.html .
(например, <a href="ja&#x09;vascript:alert('hi')"> или <a href="ja vascript:alert('hi')"> и т. д.)

Как вы можете видеть, он использует библиотеку (awesome) 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 injection, поэтому это должно в значительной степени охватить вас.


  Сведения об ответе

PIRLO

00:44, 4th August, 2020

Edit: 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 (которые легко доступны в формате XML после выполнения преобразования Markdown в HTML с использованием python-markdown2, и, похоже, все прошло нормально.

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


  Сведения об ответе

screen

23:55, 22nd August, 2020

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

SQL инъекция, вопреки другому мнению, все еще возможна, если вы просто строите строку запроса. Например, если вы просто объединяете входящий параметр в строку запроса, у вас будет SQL инъекций. Лучший способ защиты от этого также не фильтрация, а скорее религиозное использование параметризованных запросов и NEVER конкатенация пользовательского ввода.

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


  Сведения об ответе

appple

21:06, 1st October, 2020

Джефф Этвуд сам описал, как StackOverflow.com очищает пользовательский ввод (в терминах non-language-specific) в блоге Stack Overflow: http://blog.stackoverflow.com/2008/06/safe-html-and-xss/

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

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


  Сведения об ответе

SKY

23:57, 10th August, 2020

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

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

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

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

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

См. также Escaping HTML


  Сведения об ответе

piter

15:09, 2nd August, 2020

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

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

datasetName = datasetName.replace("'","").replace('"',"")


  Сведения об ответе

nYU

23:11, 4th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться