Уценка и XSS

Итак, я читал об уценке здесь, в SO и в других местах, и шаги между пользовательским вводом и БД обычно задаются как

конвертировать уценку в HTMLдезинфицировать HTML (с белым списком)вставить в базу данных

но для меня имеет смысл сделать следующее:

очистить уценку (удалить все теги - без исключений)преобразовать в HTMLвставить в базу данных

Я что-то пропустил? Мне кажется, что это почти что XSS-доказательство

 Marnen Laibow-Koser25 дек. 2013 г., 17:55
Обратите внимание, что обе процедуры имеют недостатки. Это'Лучше хранить Markdown в базе данных и конвертировать его в HTML на выходе. Среди прочего, это облегчает пользователю редактирование уценки позже.

Ответы на вопрос(5)

http://michelf.com/weblog/2010/markdown-and-xss/

> hello <a name="n"> href="javascript:alert('xss')">*you*</a>

Becomes∴

<blockquote>
 <p>hello <a name="n" href="javascript:alert('xss')"><em>you</em></a></p>
</blockquote>

 Вы должны продезинфицироватьпосле преобразование в HTML.

 Chinni03 июл. 2015 г., 18:20
Это должен быть принятый ответ.
конвертировать уценку в HTMLдезинфицировать HTML (с белым списком)вставить в базу данных

Учитывая опасный HTML, дезинфицирующее средство может производить безопасный HTML.Определение безопасного HTML не изменится, поэтому, если оно безопасно, когда я вставляю его в БД, оно безопасно, когда я его извлекаю.очистить уценку (удалить все теги - без исключений)преобразовать в HTMLвставить в базу данных

Учитывая опасную уценку, дезинфицирующее средство может создать уценку, которая при конвертации в HTML другой программой будет безопасна.Определение безопасного HTML не изменится, поэтому, если оно безопасно, когда я вставляю его в БД, оно безопасно, когда я его извлекаю.

Дезинфицирующее средство для уценки должно знать не только об опасном HTML и опасной уценке, но и о том, как уценивать->HTML конвертер делает свою работу. Это делает его более сложным и, скорее всего, ошибочным, чем более простой unsafeHTML->Функция safeHTML выше.

В качестве конкретного примераудалить все теги " предполагает, что вы можете идентифицировать теги, и не будет работать против атак UTF-7. Там могут быть другие атаки кодирования, которые делают это предположение спорным, или может быть ошибка, которая вызывает уценку->HTML программа для конвертации (полная ширина '<', экзотические символы пробела, урезанные уценкой, SCRIPT) в тег.

Наиболее безопасным будет:

очистить уценку (удалить все теги - без исключений)конвертировать уценку в HTMLочистить HTMLвставить в столбец БД помеченный как рискованныйповторно очищать HTML каждый раз, когда вы извлекаете этот столбец из БД

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

удаление / экранирование всех тегов сделало бы язык разметки более безопасным. Однако весь смысл Markdown заключается в том, что он позволяет пользователям включать произвольные теги HTML, а также свои собственные формы разметки (*). Когда вы разрешаете HTML, вы все равно должны чистить / белый список выходных данных, так что вы можете сделать это после преобразования уценки, чтобы поймать все.

*: Это'это дизайнерское решение, я нене согласен с этим вообще, и тот, который, я думаю, не оказался полезным в SO, но этоявляется дизайнерское решение, а не ошибка.

Кстати, шаг 3 должен быть ‘вывод на страницу ’; это обычно происходит на этапе вывода, когда база данных содержит необработанный отправленный текст.

 Marnen Laibow-Koser28 дек. 2013 г., 05:17
но ты'вполне вероятно, захочется использовать
 Marnen Laibow-Koser25 дек. 2013 г., 17:53
Помимо XSS, почему неВы согласны с дизайнерским решением о включении HTML в Markdown? По моему опыту, этоЭто очень полезно, и одна из вещей, которая спасает Markdown от еще одного тупика, чрезмерно ограниченного языка разметки.
 Marnen Laibow-Koser28 дек. 2013 г., 05:20
В настоящее время вы должны знать, какие символы являются специальными в MD и HTML, прежде чем писать что-либо ». На самом деле, нет. Средний пользователь уценки (кто нене знает HTML) недолжен знать, что
 bobince28 дек. 2013 г., 00:41
Я считаю, что для таких целей, как дискуссионные сайты, это мешает гораздо чаще, чем помогает: в общем, вывряд ли захочется сделать что-то умное, чтобы доктор медицины могне делай этого, но тывполне вероятно, захочется использовать
 bobince28 дек. 2013 г., 00:46
Я бы нене быть против HTML в MD, если (а) он был выключен по умолчанию, или существовал стандартный способ его отключения, и (б) он был отделен от разметки MD вместо того, чтобы создавать действительно странные взаимодействия, когда вы использовали оба. В настоящее время вы должны знать, какие символы являются особенными в MDа также в HTML, прежде чем писать что-либо. Для такого приложения, как комментарии к статье или форум, это слишком глубоко для обычного пользователя, чтобы справиться с ним. Это только критика для приложений, таких как веб-комментарии / форумы - этоЯсно, что гораздо больше подходит для использования, как техническая документация. "
вставить в базу данныхконвертировать уценку в HTMLдезинфицировать HTML (с белым списком)Perl
use Text::Markdown ();
use HTML::StripScripts::Parser ();

my $hss = HTML::StripScripts::Parser->new(
   {
       Context         => 'Document',
       AllowSrc        => 0,
       AllowHref       => 1,
       AllowRelURL     => 1,
       AllowMailto     => 1,
       EscapeFiltered  => 1,
   },
   strict_comment => 1,
   strict_names   => 1,
);

$hss->filter_html(Text::Markdown::markdown(shift))

Я непользователи не смогут форматировать сообщения. Например, вы использовали Markdown для создания нумерованных списков. В предлагаемом мире без тегов и исключений яЯ не вижу, как конечный пользователь сможет сделать такую вещь.Значительно важнее: При использовании Markdown в качестве "родные" язык форматирования и внесение в белый список других доступных тегов, вы ограничиваете не только входную сторону мира, но и вывод. Другими словами, если ваш движок отображения ожидает Markdown и разрешает вывод контента только из белого списка, даже если (не дай Бог) кто-то попадает в базу данных и внедряет вредоносный код, загруженный вредоносными программами, в кучу постов, сам сайт и его пользователи защищены. потому что вы также дезинфицируете его при демонстрации.

В Интернете есть несколько хороших ресурсов по очистке выходных данных:

Очистка пользовательских данных: где и как это сделатьСанация выхода (Один из моих клиентов, который должен остаться безымянным, и чья уязвимая система былане разработанный мной, был поражен именно этим червем. С тех пор мы защитили эти системы, конечно.)BizTech: лучшие практики: никогда не слышали о XSS?
 Alan H.11 мар. 2011 г., 00:18
Что касается пункта № 1, я думаю, вы неправильно поняли ОП. Вы по-прежнему будете использовать нумерованные списки в стиле Markdown, без проблем, потому что произойдет удаление HTML-тегадо Уценка конвертирована1. Foo вFoo
 Stijn de Witt28 нояб. 2018 г., 00:12
Похоже, OP предлагает хранить HTML в БД, что делает невозможным редактирование, поскольку сохраненные теги HTML считаются недействительными, если они передаются в качестве входных данных.
 Stijn de Witt28 нояб. 2018 г., 00:15
... который напоминает мне об одном изправила Мне нравится использовать при разработке: "принять свой собственный вывод в качестве ввода ", Дон»Вы просто ненавидите его, когда копируете, вставляете вывод (скажем, номер счета) в поле ввода, и он выигрывает 'не принимаете это перед тем, как удалить или добавить что-то к нему? Вы часто видите это с телефонными номерами, где они будут выводить это, например.+31 555 1234 5678, а затем сказать вам, что символ плюс является недопустимым символом или чтоs слишком длинный или содержит пробелы при попытке ввода.

Ваш ответ на вопрос