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

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

Не могли бы вы просто использовать void foo(char p[10], int plen); ?

58
задан ɢʀᴜɴᴛ 10 July 2017 в 15:42
поделиться

7 ответов

Вот отрывок, который удалит все теги не в белом списке и все атрибуты тега не в белом списке attribues (таким образом, Вы не сможете использовать 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')">, и т.д.)

, Как Вы видите, это использует (потрясающий) библиотека 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 заботятся о Внедрении SQL, таким образом, это должно в значительной степени покрыть Вас.

26
ответ дан tghw 7 November 2019 в 05:35
поделиться

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

html5lib идет с основанным на белом списке дезинфицирующим средством HTML - это легко разделить его на подклассы для ограничения тегов и приписывает пользователей, позволяются использовать на сайте, и это даже пытается санировать CSS при разрешении использования эти style атрибут.

Вот теперь, я использую его в своем клоне Переполнения стека sanitize_html служебная функция:

http://code.google.com/p/soclone/source/browse/trunk/soclone/utils/html.py

я бросил все нападения, перечисленные в XSS Cheatsheet ha.ckers.org (которые являются ловко доступны в формате XML в нем после работающей Скидки с цены к преобразованию HTML с помощью python-markdown2 , и это, кажется, поддержало хорошо.

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

21
ответ дан Jonny Buchanan 7 November 2019 в 05:35
поделиться

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

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

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

13
ответ дан user17898 7 November 2019 в 05:35
поделиться

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

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

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

6
ответ дан Eli Courtwright 7 November 2019 в 05:35
поделиться

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

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

Возможности, если кто-то пытался ввести символы HTML или материал, они на самом деле хотели, чтобы это было отображено как текст так или иначе. Если они не сделали, хорошо жесткий:)

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

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

См. также HTML

Выхода
4
ответ дан Henrik Gustafsson 7 November 2019 в 05:35
поделиться

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

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

0
ответ дан Justin Standard 7 November 2019 в 05:35
поделиться

To sanitize a string input which you want to store to the database (for example a customer name) you need either to escape it or plainly remove any quotes (', ") from it. This effectively prevents classical SQL injection which can happen if you are assembling an SQL query from strings passed by the user.

For example (if it is acceptable to remove quotes completely):

datasetName = datasetName.replace("'","").replace('"',"")
1
ответ дан 7 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: