Как предотвратить XSS (межсайтовый скриптинг) при разрешении ввода HTML - PullRequest
8 голосов
/ 11 августа 2011

У меня есть веб-сайт, который позволяет вводить HTML с помощью расширенного редактора TinyMCE .Его цель - разрешить пользователям форматировать текст с использованием HTML.

Этот введенный пользователем контент затем выводится другим пользователям системы.

Однако это означает, что кто-то может вставить JavaScript в HTML для того, чтобывыполнить XSS-атаку на других пользователей системы.

Каков наилучший способ отфильтровать код JavaScript из строки HTML?

Если я выполняю регулярныйПроверка выражения для тегов <SCRIPT> - это хорошее начало, но злодей может все же присоединить JavaScript к атрибуту onclick тега.

Есть ли надежный способ написать весь код JavaScript,оставляя остальную часть HTML нетронутой?

Для моей конкретной реализации я использую C #

Ответы [ 5 ]

7 голосов
/ 11 августа 2011

Microsoft выпустила собственную анти-XSS библиотеку, Microsoft Anti-Cross Site Scripting Library V4.0 :

Microsoft Anti-Cross Site Scripting Library V4.0(AntiXSS V4.0) - это библиотека кодирования, разработанная, чтобы помочь разработчикам защитить свои веб-приложения ASP.NET от атак XSS.Он отличается от большинства библиотек кодирования тем, что использует технику белого списка, иногда называемую принципом включений, для защиты от атак XSS.Этот подход сначала определяет допустимый или допустимый набор символов и кодирует все, что находится за пределами этого набора (недопустимые символы или потенциальные атаки).Подход белого списка обеспечивает несколько преимуществ по сравнению с другими схемами кодирования.Новые функции в этой версии библиотеки Microsoft Anti-Cross Site Scripting включают: - Настраиваемый безопасный список для кодирования HTML и XML - Улучшения производительности - Поддержка приложений ASP.NET со средним уровнем доверия - Поддержка именованных HTML-объектов - Неправильное обнаружение Unicode - Улучшенный суррогатПоддержка символов для кодирования HTML и XML - улучшения кодировки LDAP - поддержка кодировки application / x-www-form-urlencoded

Используется подход белого списка для удаления потенциального содержимого XSS.

Вот некоторые соответствующие ссылки, относящиеся к AntiXSS :

4 голосов
/ 11 августа 2011

Питер, я хотел бы познакомить вас с двумя понятиями в области безопасности:

Черный список - запретить то, что вы знаете, плохо.

Белый список - разрешить все, что вы знаете, хорошо.*

Хотя оба имеют свое применение, черный список по своей конструкции небезопасен.

То, что вы спрашиваете, фактически является черным списком.Если бы существовала альтернатива <script> (например, <img src="bad" onerror="hack()"/>), вы не сможете избежать этой проблемы.

Белый список, с другой стороны, позволяет вам указать точные условиявы разрешаете.

Например, у вас будут следующие правила:

  • разрешать только эти теги: b, i, u, img
  • разрешать только этиатрибуты: src, href, style

Это только теория.На практике вы должны соответствующим образом анализировать HTML, поэтому необходим правильный анализатор HTML.

2 голосов
/ 16 августа 2011

Если вы хотите разрешить некоторый HTML, но не все, вы должны использовать что-то вроде OWASP AntiSamy, которое позволяет вам создавать политику из белого списка, по которой вы допускаете теги и атрибуты.

HTMLPurifier также может быть альтернативой.

Ключевое значение имеет подход с использованием белого списка, так как новые атрибуты и события постоянно добавляются в HTML5, поэтому любой черный список может потерпеть неудачу в течение короткого времени, и знание всех «плохих» атрибутов также сложно.

Редактировать: Да, и регулярное выражение здесь довольно сложно сделать.HTML может иметь много разных форматов.Теги могут быть не закрыты, атрибуты могут начинаться с или без кавычек (одинарные или двойные), вы можете иметь разрывы строк и все виды пробелов внутри тегов, чтобы назвать несколько проблем.Я бы положился на хорошо проверенную библиотеку, подобную той, что упоминала выше.

1 голос
/ 11 августа 2011

Регулярные выражения - неподходящий инструмент для работы, вам нужен настоящий анализатор HTML, иначе все будет плохо. Вам необходимо проанализировать строку HTML, а затем удалить все элементы и атрибуты, кроме разрешенных (подход белого списка, черные списки по своей природе небезопасны). Вы можете взять списки, используемые Mozilla в качестве отправной точки. Там также есть список атрибутов, которые принимают значения URL - вам нужно убедиться, что это либо относительные URL, либо используется разрешенный протокол (обычно только http: / https: / ftp:, в частности, не javascript: data:). После удаления всего, что не разрешено, вы сериализуете свои данные обратно в HTML - теперь у вас есть что-то, что можно безопасно вставить на веб-страницу.

0 голосов
/ 28 сентября 2016

Я пытаюсь заменить формат элемента тега следующим образом:

public class Utility
{
    public static string PreventXSS(string sInput) {
        if (sInput == null)
            return string.Empty;
        string sResult = string.Empty;
        sResult = Regex.Replace(sInput, "<", "< ");
        sResult = Regex.Replace(sResult, @"<\s*", "< ");
        return sResult;
    }
}

Использование перед сохранением в БД:

    string sResultNoXSS = Utility.PreventXSS(varName)

У меня есть тест, который у меня есть входные данные, такие как:

<script>alert('hello XSS')</script>

enter image description here

будет запущено в браузере.После добавления Anti XSS приведенный выше код будет выглядеть следующим образом:

< script>alert('hello XSS')< /script>

(после < есть пробел)

И в результате скрипт не будет запущен в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...