Как использовать С# для очистки ввода на html-странице?

Есть ли библиотека или приемлемый метод для очистки ввода на html-странице?

В этом случае у меня есть форма только с именем, номером телефона и адресом электронной почты.

Код должен быть C#.

Например:

"<script src='bobs.js'>John Doe</script>" должно стать "John Doe"


person NotMe    schedule 09.10.2008    source источник


Ответы (5)


Мы используем библиотеку .Net HtmlSanitizer, которая:

Также на NuGet.

person Julian    schedule 03.10.2016

Основываясь на комментарии, который вы сделали к этому ответу, вы можете найти полезную информацию в этом вопросе:
https://stackoverflow.com/questions/72394/what-should-a-developer-know-передсозданиемобщедоступноговеб-сайта

Вот пример параметризованного запроса. Вместо этого:

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

person Joel Coehoorn    schedule 09.10.2008
comment
Вообще-то, нет. Я просто пытался быть активным с некоторыми новыми разработками. Отличная информация, однако. - person NotMe; 10.10.2008
comment
Убедитесь, что вы видели последнее редактирование: я добавил очень полезную ссылку внизу. - person Joel Coehoorn; 10.10.2008
comment
Кстати, я все равно уже использую s'procs. Я просто хочу убедиться, что нижестоящие системы (которые я абсолютно не контролирую) не обрабатывают входные данные неправильно. - person NotMe; 10.10.2008

Если под очисткой вы подразумеваете полное УДАЛЕНИЕ тегов, пример RegEx, на который ссылается Брайант, — это тип решения, которое вам нужно.

Если вы просто хотите убедиться, что код НЕ мешает вашему дизайну и не отображается пользователю. Вы можете использовать метод HttpUtility.HtmlEncode, чтобы предотвратить это!

person Mitchel Sellers    schedule 09.10.2008
comment
Есть ли причина делать это вместо более простого регулярного выражения Якуба? - person NotMe; 10.10.2008
comment
Решение с регулярным выражением удалит код, оно работает... но требует времени. HtmlEncode, просто форматирует его безопасным образом для отображения в Интернете. - person Mitchel Sellers; 10.10.2008
comment
Общеизвестно, что санировать HTML сложно. Есть так много способов, которыми злоумышленник может заставить код JavaScript сработать. Рассмотрим <a href="javascript:alert('Evil')">Click me</a>, и это только вершина айсберга. Вывод пользовательского ввода, закодированного в формате HTML, является верным подходом к рендерингу безопасного HTML. - person Jeremy Cook; 04.10.2013

Как насчет использования библиотеки Microsoft Anti-Cross Site Scripting Library?

person Community    schedule 10.11.2009
comment
Интересный. Когда у меня будет время, я поиграю с ним. Хотя выглядит многообещающе. - person NotMe; 11.11.2009
comment
Ссылка выше относится к версии 3.1 библиотеки сценариев анти-межсайтового взаимодействия. Версия 4.0 является самой последней версией. - person CBono; 10.10.2011
comment
приведенная выше ссылка также устарела, отредактировал ответ, включив правильную ссылку на библиотеку MSACSS. - person Adam; 23.05.2012
comment
Устарело на сегодняшний день - person Nabeel; 14.10.2020

Похоже, у вас есть пользователи, которые отправляют контент, но вы не можете им полностью доверять, и все же хотите отображать контент, который они предоставляют, как супер безопасный HTML. Вот три метода: HTML-кодирование всего, HTML-кодирование и/или удаление только плохих частей или использование DSL, который компилируется в HTML, который вам удобен.

  1. Должен ли он стать "Джон Доу"? Я бы HTML закодируйте эту строку и позвольте пользователю "John Doe" (если это действительно его настоящее имя...) иметь глупое имя <script src='bobs.js'>John Doe</script>. Он вообще не должен заключать свое имя в теги сценария или любые другие теги. Это подход, который я использую во всех случаях, если нет действительно хорошего экономического обоснования для одного из других методов.

  2. Принимать HTML от пользователя, а затем очищать его (на выходе), используя подход с использованием белого списка, такой как метод дезинфекции @Bryant упомянул. Сделать это правильно (чрезвычайно) сложно, и я откладываю это на более высокие умы. Обратите внимание, что некоторые дезинфицирующие средства будут кодировать в HTML зло, в то время как другие полностью удалили бы оскорбительные биты.

  3. Другой подход заключается в использовании DSL, который "компилируется" в HTML. Убедитесь, что ваш компилятор DSL whitehat, потому что некоторые (например, MarkdownSharp) позволит использовать произвольный HTML, например теги <script>, и вредоносные атрибуты в незакодированном виде (что, кстати, вполне разумно, но может не соответствовать вы нуждаетесь или ожидаете). Если это так, вам нужно будет использовать метод № 2 и очистить то, что выводит ваш компилятор.

Заключительные мысли:

person Jeremy Cook    schedule 04.10.2013