Как защитить от XSS в ASP.NET Core? - PullRequest
       11

Как защитить от XSS в ASP.NET Core?

0 голосов
/ 08 сентября 2018

В ASP.NET у нас была проверка запроса, но в ASP.NET Core такой вещи нет.

Как мы можем наилучшим образом защитить приложение ASP.NET Core от XSS?

Запрос проверки пропущен : https://nvisium.com/resources/blog/2017/08/08/dude-wheres-my-request-validation.html - этот парень рекомендует RegEx на Models вроде:

[RegularExpression(@"^[a-zA-Z0-9 -']*$", ErrorMessage = "Invalid characters detected")]
public string Name { get; set; }

... но это не работает для глобализации / интернационализации, то есть нелатинских символов, таких как æ, ø å *.

X-XSS для выполнения> ограниченная : https://dotnetcoretutorials.com/2017/01/10/set-x-xss-protection-asp-net-core/ Подобно этому, но поддержка ограничена только afaik:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("X-Xss-Protection", "1");
        await next();
    });

    app.UseMvc();
}

Документации от Microsoft два года: https://docs.microsoft.com/en-us/aspnet/core/security/cross-site-scripting?view=aspnetcore-2.1, которая на самом деле не распространяется на нее.

Я думаю сделать что-то простое, например:

myField = myField.Replace('<','').Replace('>','').Replace('&','').Repl...;
  • на всех данных - но это вроде как шатко.

Я задавал тот же вопрос для Microsoft, но мне интересно узнать, как люди решают эту проблему в реальных приложениях.

Обновление: что мы пытаемся сделать:

В нашем приложении есть веб-формы, где люди могут вводить имя, адрес электронной почты, контент и тому подобное. Данные хранятся в базе данных и будут просматриваться во внешней системе и, возможно, в других системах в будущем (например, RSS-каналы, JSON и т. Д.). Некоторые формы содержат редакторы richtext (tinymce) и позволяют пользователям разметить свои тексты. Вредоносные пользователи могут ввести <script>alert('evil stuff');</script> в полях. Что является лучшим способом удаления злых символов в ASP.NET Core до того, как он достигнет базы данных - я предпочитаю, чтобы злые скрипты вообще не сохранялись в базе данных.

Я подумал, что-то вроде этого может сработать:

const string RegExInvalidCharacters = @"[^&<>\""'/]*$";

[RegularExpression(RegExInvalidCharacters, ErrorMessage = "InvalidCharacters")]
public string Name { get; set; }

[RegularExpression(RegExInvalidCharacters, ErrorMessage = "InvalidCharacters")]
public string Content { get; set; }

...

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

В частности, что вы пытаетесь сделать здесь? Предотвратить посты, которые могут содержать контент, который может отображаться, если не проводить дезинфекцию при xss-атаке? Если да, то, как я недавно обсуждал с коллегой, вы не можете, в зависимости от вашего сайта.

Я имею в виду, что вы можете предоставить клиенту ограничения на публикуемые данные, но это, очевидно, можно обойти, так что ваши действия пытаются сделать? Предотвратить публикацию контента, который при обеззараживании представляет потенциальный риск xss?

За что вы отвечаете post endpoint? Отвечает ли он за то, как другие системы могут отображать полученные результаты?

Я бы сказал, что ваш основной xss-риск заключается в том, как приложение отображает ваши данные. Если вы не дезинфицируете / кодируете выходные данные, основанные на приложении, которое использует данные, то вы, вероятно, делаете это неправильно.

Помните, что потенциальная проблема с xss является реальной, только если вы выводите что-то на веб-страницу или что-то подобное. Это на самом деле не конечная точка, которая решает проблему данных.

0 голосов
/ 10 сентября 2018

Одним из лучших способов предотвращения сохраненного / отраженного XSS является HTML-кодирование вывода. Вы также можете кодировать перед сохранением в БД. Так как в любом случае вам не нужно, чтобы выходные данные из этих полей были в HTML.

Решение с помощью регулярных выражений не всегда работает. То, что вы делаете здесь, это то, что вы полагаетесь на черный список . Всегда лучше и безопаснее полагаться на Белый список (который в этом случае вам не нужен). Или, если возможно, HTML-кодирование вывода.

0 голосов
/ 09 сентября 2018

Вы можете использовать HtmlSanitizer libraray в ASP.NET Core.

...