Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Очистка пользовательского ввода с помощью Python
Как лучше всего очистить пользовательский ввод для веб-приложения на базе Python? Существует ли одна функция для удаления HTML символов и любых других необходимых комбинаций символов, чтобы предотвратить атаку XSS или SQL инъекций?
Вот фрагмент кода, который удалит все теги, не входящие в белый список, и все атрибуты тегов, не входящие в белый список атрибутов (поэтому вы не можете использовать onclick ).
Это модифицированная версия http://www.djangosnippets.org/snippets/205/, с regex на значениях атрибутов, чтобы предотвратить использование людьми href="javascript:..." и других случаев, описанных в http://ha.ckers.org/xss.html .
(например, <a href="ja	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, поэтому это должно в значительной степени охватить вас.
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 привела к тому, что я получил предупреждающие поля и закрыл страницу.
Лучший способ предотвратить XSS - это не пытаться фильтровать все подряд,а просто сделать кодировку HTML сущностей. Например, автоматически превратить < в <. это идеальное решение, предполагающее, что вам не нужно принимать какой-либо вход html (за пределами областей форума/комментариев, где он используется как markup, он должен быть довольно редким, чтобы принять HTML); существует так много перестановок с помощью альтернативных кодировок, что все, что угодно, кроме сверхограничительного белого списка (например, a-z,A-Z,0-9), будет пропускать что-то.
SQL инъекция, вопреки другому мнению, все еще возможна, если вы просто строите строку запроса. Например, если вы просто объединяете входящий параметр в строку запроса, у вас будет SQL инъекций. Лучший способ защиты от этого также не фильтрация, а скорее религиозное использование параметризованных запросов и NEVER конкатенация пользовательского ввода.
Это не означает, что фильтрация все еще не является лучшей практикой, но с точки зрения SQL инъекции и XSS, вы будете гораздо более защищены, если будете религиозно использовать запросы параметризации и HTML кодирования сущностей.
Джефф Этвуд сам описал, как 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), поэтому вам не нужно беспокоиться о санитарии там.
Я больше не занимаюсь веб-разработкой, но когда я это сделал, я сделал что-то вроде этого:
Когда парсинг не предполагается, я обычно просто избегаю данных, чтобы не вмешиваться в базу данных, когда я ее храню, и избегаю всего, что я читаю из базы данных, чтобы не вмешиваться в html, когда я ее отображаю (cgi.escape() в python).
Скорее всего, если кто-то пытался ввести html символ или что-то еще, они на самом деле хотели, чтобы это отображалось как текст в любом случае. А если они этого не сделали, ну что ж ... :)
Короче говоря, всегда избегайте того, что может повлиять на текущую цель для данных.
Когда мне действительно требовался какой-то синтаксический анализ (markup или что-то еще), я обычно пытался сохранить этот язык в непересекающемся наборе с html, чтобы я мог просто сохранить его соответствующим образом экранированным (после проверки на синтаксические ошибки) и проанализировать его до html при отображении, не беспокоясь о том, что данные, которые пользователь вставил туда, мешают вашему html.
См. также Escaping HTML
Для очистки строкового ввода, который вы хотите сохранить в базе данных (например, имя клиента), вам нужно либо экранировать его, либо просто удалить из него любые кавычки (',"). Это эффективно предотвращает классическую инъекцию SQL, которая может произойти, если вы собираете запрос SQL из строк, переданных пользователем.
Например (если допустимо полностью удалить кавычки):
datasetName = datasetName.replace("'","").replace('"',"")
Если вы используете фреймворк типа django, фреймворк может легко сделать это за вас, используя стандартные фильтры. На самом деле, я почти уверен, что django автоматически делает это, если вы не скажете ему этого не делать.
В противном случае я бы рекомендовал использовать какой-то вид проверки regex, прежде чем принимать входные данные из форм. Я не думаю, что есть серебряная пуля для вашей проблемы, но используя модуль re, вы должны быть в состоянии построить то, что вам нужно.