在ASP.NET中我们有Request Validation,但是在ASP.NET Core中没有这样的东西。
我们如何以最佳方式保护ASP.NET Core应用程序免受XSS攻击?
请求验证消失了:https://nvisium.com/resources/blog/2017/08/08/dude-wheres-my-request-validation.html - 这家伙在Models
上推荐RegEx,如:
[RegularExpression(@"^[a-zA-Z0-9 -']*$", ErrorMessage = "Invalid characters detected")]
public string Name { get; set; }
......但这不适用于全球化/国际化,即非拉丁字符,如æ,øå汉字。
X-XSS要做的事情>有限的<XSS-protection: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();
}
微软的文档已有两年了:https://docs.microsoft.com/en-us/aspnet/core/security/cross-site-scripting?view=aspnetcore-2.1并没有真正涵盖它。
我想做一些简单的事情:
myField = myField.Replace('<','').Replace('>','').Replace('&','').Repl...;
我已经向微软提出了同样的问题,但我很想知道人们如何在现实生活中解决这个问题。
更新:我们正在努力实现的目标:
在我们的应用程序中,我们有webforms,人们可以输入姓名,电子邮件,内容和类似内容。数据存储在数据库中,将来可以在前端系统和其他系统上查看(如RSS feed,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; }
...
防止存储/反射XSS的最佳方法之一是对输出进行HTML编码。您也可以在将其存储在数据库中之前进行编码。因为您无需将这些字段的输出设置为HTML。
使用Regex的解决方案并不总是有效。你在这里做的是你依赖黑名单。要么依赖白名单(在这种情况下你不需要),它总是更好,更安全。或者HTML-如果可能的话对输出进行编码。
具体你想在这做什么?在未经消毒的xss攻击时,防止可能包含可能呈现的内容的帖子?如果是这样的话,正如我最近与同事讨论的那样,根据您的网站,您不能这样做。
我的意思是,您可以对发布的数据提供客户端限制,但这显然可以绕过,那么您的行动是什么尝试?防止发布的内容在未经过清理时是否存在潜在的xss风险?
你发布的端点负责的是什么?它是否负责其他系统如何呈现它收到的输出?
我认为你的主要xss风险在于应用如何呈现你的数据。如果您没有根据使用数据的应用程序清理/编码输出,那么您可能做错了。
请记住,如果您正在向网页或类似网页输出内容,则潜在的xss问题只是一个真正的问题。这实际上不是接收数据问题的端点。
您可以在ASP.NET Core中使用HtmlSanitizer libraray。