Как мы все знаем к настоящему времени, XSS-атаки опасны и их действительно легко осуществить . Различные фреймворки позволяют легко кодировать HTML, как это делает ASP.NET MVC:
<%= Html.Encode("string"); %>
Но что происходит, когда ваш клиент требует, чтобы он мог загружать свой контент прямо из документа Microsoft Word?
Вот сценарий: люди могут копировать и вставлять содержимое из Microsoft Word в редактор WYSIWYG (в данном случае tinyMCE ), а затем эта информация публикуется на веб-странице.
Веб-сайт является общедоступным, но только члены этой организации будут иметь возможность размещать информацию на веб-странице.
Как мне справиться с этими требованиями безопасным способом? В настоящее время не выполняется проверка того, что клиент публикует (поскольку только «доверенные» пользователи могут публиковать сообщения), но я не особенно доволен этим и хотел бы заблокировать его в дальнейшем в случае взлома учетной записи.
Единственный концептуальный метод, который мне известен и который отвечает этим требованиям, состоит в том, чтобы внести белые теги в HTML-теги и пропустить их . Есть ли другой способ? Если нет, то каков безопасный способ разрешить пользователю хранить входные данные в базе данных в любой форме, но только отображать их правильно закодированными и лишенными неверных тегов?
Связанный вопрос
источник
Ответы:
Самый простой способ (для вас, как разработчика) - это реализовать один из многих вариантов Markdown , например Markdown.NET или, что еще лучше (imho), wmd-редактор .
Тогда ваши пользователи смогут вставить простой HTML, но ничего опасного, и они смогут просмотреть свои введенные данные и исправить любые сомнения даже перед публикацией ...
источник
Белый список действительно является лучшим способом предотвращения XSS-атак, когда пользователи могут вводить HTML либо напрямую, либо с помощью Rich Text Editor.
О других ваших вопросах:
Я не думаю, что это может сработать. Для этого вам необходим код на стороне сервера, и RTE работает на клиенте.
TinyMCE фильтрует теги, если вы хотите, но так как это происходит в браузере, вы не можете доверять ему. Смотрите extended_valid_elements . TinyMCE (Moxie) также предлагает белый список, см. Здесь .
Вы должны всегда фильтровать HTML, если только нет особых причин (очень редко). Некоторые причины: а) функциональность, которая предназначена для внутренних пользователей сегодня, может быть, для общественности завтра б) несанкционированный доступ будет иметь меньшее влияние
Это способ, которым я предпочитаю это. Я не люблю менять пользовательский ввод перед вставкой в базу данных по разным причинам.
источник
Я делаю то же самое. Я использую TinyMCE и разрешаю вставку из документов Word. Только определенные люди, которые поддерживают сайт, могут сделать это через область администратора. Это обеспечивается членством ASP.Net. Я просто делаю HTML.Encode, когда он отправляется на публичный сайт.
Вы можете использовать приведенный ниже код, если хотите, прежде чем он будет помещен в базу данных, но не знаете, какой удар это даст вам. Возможно, вам придется пойти со своим белым списком.
источник
Одним из вариантов может быть HTML Edit Control для .NET (который я написал).
Это WYSIWYM HTML-редактор для .NET, который поддерживает только подмножество элементов HTML , исключая
<script>
элементы: таким образом, он действует как белый список.Если это для внутреннего использования (то есть сайт интрасети), то элемент управления может быть встроен в веб-страницу .
Я не интегрировал поддержку вставки из Word, но у меня есть компонент, который является шагом в этом направлении: конвертер Doc в HTML ; поэтому у меня есть строительные блоки, которые вы можете использовать в ASP.NET для преобразования документа в HTML, отображения HTML в редакторе и т. д.
источник
Мое ИМХО продолжаю доверять вашим пользователям, пока вы не станете публичным
Ну, нет надежного способа удовлетворить ваши потребности. Например, любой редактор WYSIWYG не может защитить форму, вставляя изображения с URL-адресами (отслеживание косвенного использования, недопустимый контент) или текстом (недопустимый текст, текст с ошибками, пропущенный текст).
Моя точка зрения заключается в том, что если вы можете доверять своим пользователям, просто разрешите все, просто предупредите пользователей, если есть ЗНАНИЯ опасной разметки (чтобы избежать их ошибок).
Если вы не доверяете, используйте специальную разметку (например, Markdown).
В моем проекте мы используем специальные типы для потенциально опасного контента и специальные методы для рендеринга и приема такого контента. Этот код имеет высокую оценку в нашей модели потоков, и внимание к нему очень высокое (например, каждое изменение должно проверяться двумя независимыми программистами, у нас есть комплексный набор тестов и т. Д.).
источник