Выровняйте предварительный просмотр редактора WMD HTML с серверной стороной проверка HTML (например, никакой встроенный код JavaScript)

Существует много вопросов о Переполнении стека (например, Белый список, предотвращая XSS с управлением WMD в C# и Скидке с цены WMD и серверной стороне) о том, как сделать вычищение серверной стороны Скидки с цены, произведенной редактором WMD, чтобы гарантировать, что сгенерированный HTML не содержит злонамеренный сценарий, как это:


Но я не нашел хороший способ заткнуть дыру на стороне клиента также. Клиентская проверка не является заменой для вычищения проверки на сервере, конечно, так как любой может симулировать быть клиентом и POST Вы противная Скидка с цены. И если Вы вычищаете HTML на сервере, взломщик не может сохранить плохой HTML, таким образом, никто больше не сможет видеть его позже и украсть их cookie или сессии, угнанные плохим сценарием. Таким образом, существует допустимый случай, который будет сделан этим, не может стоить осуществлять правила без сценариев в области предварительного просмотра WMD также.

Но предположите, что взломщик нашел способ получить злонамеренную Скидку с цены на сервер (например, поставленный под угрозу канал от другого сайта или содержание, добавленное, прежде чем ошибка XSS была исправлена). Ваш белый список серверной стороны, примененный при переводе скидки с цены в HTML, обычно препятствовал бы тому, чтобы та плохая Скидка с цены была показана пользователям. Но если взломщик мог бы заставить кого-то редактировать страницу (например, путем регистрации другой записи, говоря, что злонамеренная запись имела неработающую ссылку и просьбу, чтобы кто-то зафиксировал ее), затем любой, кто редактирует страницу, угнали их cookie. Это - по общему признанию угловой случай, но от этого все еще может стоить защитить.

Кроме того, это - вероятно, плохая идея позволить клиентскому окну предварительного просмотра позволять другой HTML, чем Ваш сервер позволит.

Команда Переполнения стека заткнула эту дыру путем внесения изменений в WMD. Как они делали это?

[ПРИМЕЧАНИЕ: Я уже понял это, но требовалась некоторая хитрая отладка JavaScript, таким образом, я отвечаю на свой собственный вопрос здесь для помощи другим, которые могут хотеть сделать тыс того же самого].

5
задан Community 23 May 2017 в 12:25
поделиться

2 ответа

Одно из возможных исправлений - в wmd.js, в методе pushPreviewHtml () . Вот исходный код из версии WMD для переполнения стека на GitHub :

if (wmd.panels.preview) {
    wmd.panels.preview.innerHTML = text; 
}

Вы можете заменить его некоторым кодом очистки.Вот адаптация кода, который Stack Overflow использует в ответ на этот пост , который ограничивается белым списком тегов, а для элементов IMG и A ограничивается белым списком атрибутов (и в определенном порядке тоже !). См. Сообщение Meta Stack Overflow Какие HTML-теги разрешены для Stack Overflow, Server Fault и Super User? для получения дополнительной информации о белом списке.

Примечание: этот код, безусловно, можно улучшить, например чтобы разрешить внесение атрибутов в белый список в любом порядке. Он также запрещает mailto: URL-адреса, что, вероятно, хорошо для Интернет-сайтов, но для вашего собственного сайта в интрасети это может быть не лучшим подходом.

if (wmd.panels.preview) {

    // Original WMD code allowed JavaScript injection, like this:
    //    <img src="http://www.google.com/intl/en_ALL/images/srpr/logo1w.png" onload="alert('haha');"/>
    // Now, we first ensure elements (and attributes of IMG and A elements) are in a whitelist,
    // and if not in whitelist, replace with blanks in preview to prevent XSS attacks 
    // when editing malicious Markdown.
    var okTags = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i;
    var okLinks = /^(<a\shref="(\#\d+|(https?|ftp):\/\/[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+)"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i;
    var okImg = /^(<img\ssrc="https?:(\/\/[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+)"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i;
    text = text.replace(/<[^<>]*>?/gi, function (tag) {
        return (tag.match(okTags) || tag.match(okLinks) || tag.match(okImg)) ? tag : ""
    })

    wmd.panels.preview.innerHTML = text;  // Original code 
}

Также обратите внимание, что этого исправления нет в версии WMD для переполнения стека на GitHub - очевидно, что изменение было внесено позже и не было возвращено в GitHub.

ОБНОВЛЕНИЕ: во избежание нарушения функции автоматического создания гиперссылок при вводе URL-адреса вам также потребуется внести изменения в showdown.js, как показано ниже:

Исходный код:

var _DoAutoLinks = function(text) {

    text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");

    // Email addresses: <address@domain.foo>

    /*
        text = text.replace(/
            <
            (?:mailto:)?
            (
                [-.\w]+
                \@
                [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
            )
            >
        /gi, _DoAutoLinks_callback());
    */
    text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
        function(wholeMatch,m1) {
            return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
        }
    );

    return text;
}

Исправлено код:

var _DoAutoLinks = function(text) {
    // use simplified format for links, to enable whitelisting link attributes
    text = text.replace(/(^|\s)(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\]])($|\W)/gi, "$1<$2$3>$4");
    text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, '<a href="$1">$1</a>');
    return text;
}
6
ответ дан 14 December 2019 в 04:32
поделиться

Разрешение локальному пользователю выполнять сценарии в контексте страницы не является проблемой безопасности до тех пор, пока невозможно предоставить сценарий третьей стороне. Если редактор не делает этого, пользователь всегда может ввести javascript: url, находясь на вашей странице, или использовать Firebug или что-то подобное.

2
ответ дан 14 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

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