То, что вы пытаетесь сделать, это дезинфицировать пользовательский ввод, однако использование JavaScript и Regex - неправильный способ сделать это.
Не беспокойтесь о проверке пользовательского ввода на внешнем интерфейсе, по крайней мере пока, внимание должно быть сосредоточено на проверке его сначала на стороне сервера, и лучший инструмент для работы - HtmlSanitizer. По их словам:
HtmlSanitizer — это .NET-библиотека для очистки фрагментов HTML и документов от конструкций, которые могут привести к XSS-атакам.
HtmlSanitizer можно настроить на нескольких уровнях:
- Настройте разрешенные теги HTML с помощью свойства AllowedTags.
- Настройте разрешенные атрибуты HTML с помощью свойства AllowedAttributes.
- Настройте разрешенные имена свойств CSS с помощью свойства AllowedCssProperties.
- Настройте разрешенные at-правила CSS с помощью свойства AllowedAtRules.
- Настройте разрешенные схемы URI с помощью свойства AllowedSchemes.
- Настройте атрибуты HTML, содержащие URI (например, «src», «href» и т. д.)
- Укажите базовый URI, который будет использоваться для разрешения относительных URI.
- Отменяемые события возникают перед удалением тега, атрибута или стиля.
Я смоделировал демонстрацию на dotnetfiddle.net, используя эту библиотеку, чтобы вы могли поиграть с ней.
void Main()
{
var allowedTags = new[]{"LineBreak", "Link"};
var allowedAttributes = new[]{"attr"};
var sanitizer = new HtmlSanitizer(allowedTags: allowedTags, allowedAttributes: allowedAttributes);
//sanitizer.
var html = @"<script>alert('xss')</script><div onload=""alert('xss')""" + @"style=""background-color: test"">Test<img src=""test.gif""" + @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>
<LineBreak></LineBreak>
<Link attr=""v123""/>";
var sanitized = sanitizer.Sanitize(html);
Console.WriteLine(sanitized);
}
Редактировать
Но хотел бы знать, почему «регулярное выражение - неправильный способ сделать это».
Regex не создан для такого типа задач, вам нужно иметь возможность анализировать html-документ, то есть анализировать его теги, атрибуты и значения в этих атрибутах в древовидной структуре, чтобы иметь возможность правильно его дезинфицировать, потому что их слишком много. крайние случаи, которые слишком сложно покрыть только регулярным выражением. Regex лучше использовать для извлечения данных из источника, который уже имеет предсказуемую структуру, пользовательский ввод не является одной из таких вещей.
Несмотря на то, что ваш вариант использования достаточно прост, вы по-прежнему позволяете пользователям вводить HTML, который будет повторно отображаться другим пользователям в его необработанном формате, поэтому все, что вы пропустите, вызовет у вас головную боль в будущем.
Вот Шпаргалка по уклонению от фильтра XSS от OWASP, если Regex сможет охватить все, что здесь перечислено, Я бы сказал, хорошо, но добиться этого в Regex настолько сложно, что это просто не имеет смысла.
HtmlSanitizer, с другой стороны, охватывает проблемы, перечисленные в этой шпаргалке, он также активно поддерживается и специально создан именно для такого рода приложений, он также ни в коем случае не является громоздким, он может выполнять большие задачи дезинфекции со временем обработки в 50 секунд. -100 мс диапазон.
person
Aydin
schedule
29.09.2018