Допустим, у меня есть простое приложение для ведения блога ASP.NET MVC, и я хочу разрешить читателям добавлять комментарии к сообщению в блоге. Если я хочу предотвратить любые типы XSS-махинаций, я мог бы HTML-кодировать все комментарии, чтобы они становились безопасными при рендеринге. Однако что, если бы мне понадобились некоторые базовые функции, такие как гиперссылки, выделение жирным шрифтом, курсив и т. Д.?

Я знаю, что StackOverflow использует WMD Markdown Editor, который кажется отличным выбором для того, что я пытаюсь выполнить, если бы не тот факт, что он поддерживает оба HTML и Markdown, который оставляет его открытым для XSS-атак.

10
Kevin Pang 15 Янв 2009 в 03:11
1
Для целей поиска может быть полезно изменить заголовок на «Предотвращение XSS (межсайтовый скриптинг)». Тем, кто не знает его понятного имени, XSS, может быть труднее найти эту ветку.
 – 
BuddyJoe
15 Янв 2009 в 04:01

7 ответов

Лучший ответ

Если вы не хотите использовать редактор, вы можете рассмотреть возможность использования OWASP AntiSamy.

Вы можете запустить пример здесь: http://www.antisamy.net/

8
Flory 15 Янв 2009 в 18:21

Сколько HTML вы собираетесь поддерживать? Полужирным шрифтом / курсивом / основным шрифтом? В этом случае вы можете преобразовать их в синтаксис уценки, а затем удалить остальную часть HTML.

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

3
Gerrit 15 Янв 2009 в 03:15
Право на. Используйте подход с использованием белого списка, а не черного списка.
 – 
Michael Haren
15 Янв 2009 в 03:17

Если вам нужно сделать это в браузере: http://code.google. ru / p / google-caja / wiki / JsHtmlSanitizer

2
Mike Samuel 16 Янв 2009 в 04:43
Вы никогда не можете доверять пользовательскому вводу, все, что исходит из браузера, может быть подделано
 – 
rjlopes
14 Окт 2010 в 22:06
- Это не проблема, если вы пытаетесь очистить контент с сервера для представления на клиенте.
 – 
Mike Samuel
19 Окт 2010 в 04:58
По моей вине я предположил, что это должно было применяться на клиенте перед отправкой информации на сервер. Однако в этом конкретном случае (вы контролируете сервер) нет смысла проводить дезинфекцию на клиенте. Единственный случай, когда это может быть полезно, - это когда вы выполняете ajax-запросы к сторонним веб-сайтам.
 – 
rjlopes
19 Окт 2010 в 13:49
Это может произойти и на клиенте законно, но не так, как сервер. Тяжелому приложению Ajax часто требуется синхронизировать состояние ч / б браузера и сервера. Когда пользователь что-то меняет, клиент оптимистично обновляет свою модель перед отправкой на сервер для обновления авторитетной модели, чтобы приложение ajax выглядело отзывчивым. Поле редактирования комментария - хороший пример. Редактор вопросов Stack overflow позволяет пользователю писать некоторую смесь разметки / HTML, которую он может отображать в панели предварительного просмотра без обращения к серверу по мере ввода пользователем.
 – 
Mike Samuel
30 Окт 2010 в 21:31

Я предлагаю вам использовать только синтаксис уценки. Во внешнем интерфейсе клиент может ввести уценку и иметь предварительный просмотр HTML (так же, как SO), но только на стороне сервера отправить синтаксис уценки. Затем вы можете проверить его, сгенерировать HTML, избежать его и сохранить.

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

Если есть что-то конкретное, что вы хотите сделать с HTML, вы можете настроить его с помощью наследования CSS ».comment a {color: # F0F; } ', интерфейс JS или просто пройдитесь по сгенерированному HTML от разметки Markdown перед его сохранением.

1
Filip Dupanović 15 Янв 2009 в 03:27

Почему бы тебе не использовать код Джеффа? http://refactormycode.com/codes/333-sanitize-html

1
dr. evil 15 Янв 2009 в 03:41

Я бы проголосовал за FCKEditor, но вам нужно сделать несколько дополнительные шаги к возвращаемому результату тоже.

1
Community 23 Май 2017 в 15:17

Вы можете использовать белый список HTML, чтобы можно было использовать определенные теги, но все остальное было заблокировано.

Есть инструменты, которые могут сделать это за вас. SO использует код, который Связано с Slough.

0
Community 23 Май 2017 в 15:25