Совместите предварительный HTML-код редактора ОМУ с проверкой HTML на стороне сервера (например, без встроенного кода JavaScript)

Есть много вопросов переполнения стека (например,Белый список, предотвращающий XSS с контролем ОМУ в C # а такжеУценка ОМУ и на стороне сервера) о том, как выполнить очистку Markdown на стороне сервера, созданную редактором WMD, чтобы убедиться, что созданный HTML-файл не содержит вредоносного скрипта, например:

<img onload="alert('haha');" 
   src="http://www.google.com/intl/en_ALL/images/srpr/logo1w.png" />

Но я не нашел хорошего способа закрыть отверстие на стороне клиента. Конечно, проверка клиента не является заменой очистки проверки на сервере, так как любой может притвориться клиентом и ПОСЛАТЬ вам грязную Markdown. И если вы чистите HTML-код на сервере, злоумышленник не может сохранить плохой HTML-код, поэтому никто другой не сможет увидеть его позже и украсть свои файлы cookie или перехватить сеанс с помощью плохого сценария. Таким образом, есть веские аргументы в пользу того, что не стоит применять правила без сценариев на панели предварительного просмотра ОМУ.

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

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

Команда переполнения стека закрыла эту дыру, внеся изменения в ОМУ. Как они это делают?

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

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

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