Как использовать C # для дезинфекции ввода на странице html?
Есть ли библиотека или приемлемый метод для дезинфекции входа на страницу html?
В этом случае у меня есть форма с указанием имени, номера телефона и адреса электронной почты.
Код должен быть C #.
- Как сохранить веб-страницу в Firefox - сохраненная версия снова отображает «просмотр предыдущих комментариев»
- HashSet по сравнению с словарем wrt время поиска, чтобы узнать, существует ли элемент
- Изменение цвета всплывающей подсказки
- В браузере, как узнать, какой десятичный разделитель использует операционная система?
- Автозаполнение HTML-тега в Notepad ++?
Например:
"John Doe"
должен стать "John Doe"
- Как конвертировать HTML-теги в RTF или любой текст в формате форматирования из командной строки Linux
- Лучший способ справиться с безопасностью и избежать XSS с введенными пользователями URL-адресами
- Какие бесплатные онлайн-альтернативы существуют на FrontPage?
- В чем смысл правильного CSS / HTML?
- Не удалось декодировать загруженный шрифт
- Разбор локального HTML-файла
- Есть ли функция автоматического отступа HTML или плагин для Sublime Text (aka prettify / beautify / format)?
- Как использовать локальную страницу html в качестве рабочего стола / фона
Это более старый, но все же актуальный вопрос.
Мы используем библиотеку HtmlSanitizer .Net, которая:
- является открытым исходным кодом (MIT) – ссылка GitHub
- активно поддерживается
- не имеет таких проблем, как библиотека Microsoft Anti-XSS ,
- Проверено ли устройство с помощью обходного листа OWASP XSS Filter Evasion
- специально разработан для этого (в отличие от HTML Agility Pack , который является парсером – не дезинфицирующим средством)
- Не использует регулярные выражения (HTML не является обычным языком!)
Также на NuGet
Если путем дезинфекции вы имеете в виду УДАЛИТЬ tags полностью, пример RegEx, на который ссылается Bryant, – это тип решения, которое вы хотите.
Если вы просто хотите убедиться, что код НЕ вовлекается в ваш дизайн и визуализирует пользователя. Вы можете использовать метод HttpUtility.HtmlEncode, чтобы предотвратить это!
Основываясь на комментариях к этому ответу, вы можете найти полезную информацию в этом вопросе:
https://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site
Вот пример с параметризованным запросом. Вместо этого:
string sql = "UPDATE UserRecord SET FirstName='" + txtFirstName.Text + "' WHERE UserID=" + UserID;
Сделай это:
SqlCommand cmd = new SqlCommand("UPDATE UserRecord SET FirstName= @FirstName WHERE UserID= @UserID"); cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = txtFirstName.Text; cmd.Parameters.Add("@UserID", SqlDbType.Integer).Value = UserID;
Изменить: поскольку инъекции не было, я удалил часть ответа, связанного с этим. Я оставил основной пример с параметризованным запросом, так как это может быть полезно для всех, кто читает вопрос.
–Joel
Как использовать библиотеку скриптов Microsoft Anti-Cross Site ?
Похоже, у вас есть пользователи, которые отправляют контент, но вы не можете полностью доверять им, и все же вы по-прежнему хотите отображать контент, который они предоставляют, как супербезопасный HTML. Вот три метода: HTML кодирует все, HTML кодирует и / или удаляет только злые части, или использует DSL, который компилируется в HTML, с которым вам удобно.
-
Должна ли она стать «Джоном Доу»? Я бы кодировал HTML эту строку и позволял пользователю «John Doe» (если это действительно его настоящее имя …), иметь глупое имя
. Он не должен был завертывать свое имя в тегах сценариев или любых тегах в первую очередь. Это подход, который я использую во всех случаях, если нет действительно хорошего бизнес-примера для одного из других методов.
-
Принимайте HTML от пользователя, а затем дезинфицируйте его (на выходе) с помощью белого списка, например, метода очистки. Как правильно это сделать (чрезвычайно) сложно, и я откладываю это на большие умы. Обратите внимание, что некоторые дезинфицирующие средства будут кодировать HTML, когда другие будут полностью удалять оскорбительные биты.
-
Другой подход – использовать DSL, который «компилирует» HTML. Удостоверьтесь в том, что ваш DSL-компилятор должен выполнить whitehat, потому что некоторые (например, MarkdownSharp ) позволят произвольный HTML- код, например tags
и злые атрибуты через unencoded (что, кстати, вполне разумно, но может и не быть тем, что вам нужно или ожидать). Если это так, вам нужно будет использовать технику № 2 и дезинфицировать то, что выдает ваш компилятор.
Заключительные мысли:
- Если нет сильного бизнес-кейса для техники № 2 или № 3, тогда уменьшите риск и сэкономьте усилия и используйте заботы, пойдите с техникой № 1.
- Не считайте свой сейф, потому что вы использовали DSL. Например: оригинальная реализация Markdown позволяет использовать HTML, unencoded. «Для любой разметки, которая не охвачена синтаксисом Markdown, вы просто используете сам HTML. Нет необходимости предисловие к ней или ее разграничение, чтобы указать, что вы переключаетесь с Markdown на HTML, вы просто используете tags».
- Кодировка при выходе. Вы также можете кодировать ввод, но это может привести к связыванию. Если вы неправильно закодировали и сохранили это, как вы получите исходный вход обратно, чтобы вы могли повторно кодировать после исправления неисправного кодировщика?
Вы ищете class RegEx и для шаблона типа <(.|\n)*?>
.
Вы можете найти много примеров в Google .