Dans ASP.NET, nous avions demandé à valider, mais dans ASP.NET Core, cela n’existait pas.
Comment pouvons-nous protéger une application ASP.NET Core contre XSS de la meilleure façon?
La validation de la demande a disparu: https://nvisium.com/resources/blog/2017/08/08/dude-wheres-my-request-validation.html - ce gars recommande RegEx sur Models
comme:
[RegularExpression(@"^[a-zA-Z0-9 -']*$", ErrorMessage = "Invalid characters detected")]
public string Name { get; set; }
... mais cela ne fonctionne pas pour la mondialisation/l'internationalisation, c'est-à-dire les caractères non latins comme æ, ø å 汉字.
X-XSS à faire> limité <XSS-protection: https://dotnetcoretutorials.com/2017/01/10/set-x-xss-protection-asp-net-core/ Like This mais il n'y a qu'un support limité à ma connaissance:
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();
}
La documentation de Microsoft a deux ans: https://docs.Microsoft.com/en-us/aspnet/core/security/cross-site-scripting?view=aspnetcore-2.1 et ne la couvre pas vraiment .
Je pense faire quelque chose de simple comme:
myField = myField.Replace('<','').Replace('>','').Replace('&','').Repl...;
J'ai posé la même question à Microsoft, mais j'aimerais savoir comment les gens résolvent ce problème dans les applications réelles.
Mise à jour: ce que nous essayons d'accomplir:
Dans notre application, nous avons des formulaires Web où les utilisateurs peuvent saisir un nom, une adresse électronique, un contenu, etc. Les données sont stockées dans une base de données et seront visualisées sur un système frontal et éventuellement sur d’autres systèmes (flux RSS, JSON, etc.). Certains formulaires contiennent des éditeurs richtext (tinymce) et permettent aux utilisateurs de baliser leurs textes. Les utilisateurs malveillants peuvent entrer <script>alert('evil stuff');</script>
dans les champs. Quel est le meilleur moyen de supprimer les caractères pervers dans ASP.NET Core avant qu'il n'atteigne la base de données - je préfère que les scripts pervers ne soient pas du tout stockés dans la base de données.
J'ai pensé que quelque chose comme ça pourrait marcher:
const string RegExInvalidCharacters = @"[^&<>\""'/]*$";
[RegularExpression(RegExInvalidCharacters, ErrorMessage = "InvalidCharacters")]
public string Name { get; set; }
[RegularExpression(RegExInvalidCharacters, ErrorMessage = "InvalidCharacters")]
public string Content { get; set; }
...
L'un des meilleurs moyens d'empêcher de stocker/de refléter XSS consiste à HTML-Encode la sortie. Vous pouvez également encoder avant de le stocker dans la base de données. Puisque vous n’avez pas besoin de toute façon que la sortie de ces champs soit en HTML.
La solution avec Regex ne fonctionnera pas toujours. Ce que vous faites ici, c'est que vous vous appuyez sur une liste noire . C'est toujours mieux et plus sûr de s'appuyer sur Liste blanche (dont vous n'avez pas besoin dans ce cas). Ou HTML-Encoder la sortie si possible.
Plus précisément, qu'essayez-vous de faire ici? Empêcher les publications susceptibles de contenir du contenu susceptible de s'afficher, lorsqu'une attaque xss non assainie?.
Je veux dire, vous pouvez fournir des restrictions côté client sur les données publiées, mais cela peut évidemment être contourné, alors quelle action tentez-vous de faire? Empêcher que du contenu soit affiché/ lorsqu'il est rendu non assaini représente un risque xss potentiel?
De quoi êtes-vous post endpoint responsable? Est-il responsable de la manière dont d'autres systèmes peuvent restituer certains des résultats qu'il a reçus?
Je dirais que votre principal risque xss réside dans la manière dont une application restitue vos données. Si vous ne désinfectez/encodez pas la sortie en fonction de l'application qui utilise les données, vous vous trompez probablement.
N'oubliez pas qu'un problème xss potentiel n'est un problème réel que si vous exportez quelque chose sur une page Web ou similaire. Ce n'est pas vraiment le point final qui reçoit le problème des données.
Vous pouvez utiliser HtmlSanitizer libraray dans ASP.NET Core.