2013-11-01 4 views
3

Моего сайта позволяет сайт-пользователям писать блог-сообщенияПозволить только некоторые HTML-теги в качестве входных данных пользователя

class BlogPost 
{ 
[AllowHtml] 
public string Content; 
} 

Сайт создан с использованием шаблона приложения MVC5 Интернета и использует самозагрузку 3 для его CSS. Поэтому я решил использовать http://jhollingworth.github.io/bootstrap-wysihtml5, чтобы позаботиться обо всем части JavaScript Rich Text Editor.

Это работает как шарм. Но для того, чтобы сделать POST, мне пришлось добавить атрибут [AllowHtml], как в приведенном выше коде. Так что теперь я боюсь опасных вещей, которые могут попасть в базу данных и быть в очереди отображены для всех пользователей.

Я пытался дать значения, как <script>alert("What's up?")</script> и т.д. в форме, и это, казалось, было хорошо ... текст отображался точно таким же образом (<script> стал &lt;script&gt;. Но это преобразование, казалось, быть сделано яваскриптом плагиным я использовал.

Так что я использовал скрипач, чтобы составить запрос POST с тем же тегом сценария и на этот раз, на странице фактически выполняется код JavaScript.

есть ли способ, я могу понять, уязвимый вход как <script> и даже <a href="javascript:some_code">Link</a>. ..?

ответ

3

К сожалению, вам необходимо самостоятельно деактивировать HTML. Смотрите их на том, как люди сделали это:

  1. How to sanitize input from MCE in ASP.NET? - белый список с помощью Html Agility пакет
  2. .NET HTML Sanitation for rich HTML Input - черный список, используя Html Agility пакет

альтернативой принятия HTML должен принять markdown или BBCode вместо этого. Оба они широко используются (markdown используется stackoverflow!) И устраняют необходимость дезинфекции ввода. Также есть богатые редакторы.

Редактировать

Я обнаружил, что библиотека Microsoft Web Protection может дезинфицировать HTML вход через AntiXss.GetSafeHtml и AntiXss.GetSafeHtmlFragment. Документация действительно неудовлетворительна, и кажется, что вы не можете настроить, какие теги действительны.

+2

Это неверно, что уценка не нуждается в вводе HTML для дезинфекции. Markdown позволяет произвольный HTML. Вы все еще должны его дезинфицировать. –

1

Я столкнулся с той же проблемой, которая дезинфицирует содержимое wysihtml5 на стороне сервера. Я был довольно очарован тем, как wysihtml5 выполнял санацию на стороне клиента и реализовал это с помощью Html Agility Pack: HtmlRuleSanitizer on Github Также доступен как NuGet package.

Причина, по которой Анти-Антивирус Microsoft не использует, заключается в том, что невозможно установить более подробные правила, например, что делать с тегами. Это приводит к тому, что теги полностью удаляются, когда, например, имеет смысл сохранить текстовое содержимое. Кроме того, я хотел использовать белый листинг для всего (CSS, теги и атрибуты).