如何在ASP.NET Core中防范XSS?

时间:2018-09-08 20:43:59

标签: c# asp.net-core xss

在ASP.NET中,我们进行了请求验证,但是在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可以进行>有限的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提出过同样的问题,但我很想听听人们如何在现实生活中解决此问题。

更新:我们要完成的任务:

在我们的应用程序中,我们具有Web表单,人们可以在其中输入姓名,电子邮件,内容等。数据存储在数据库中,将来将在前端系统以及可能的其他系统(如RSS feed,JSON等)上查看。某些表单包含RTF编辑器(简洁),并允许用户标记其文本。恶意用户可能在字段中输入<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; }

...

5 个答案:

答案 0 :(得分:3)

我知道这已经是一岁了,但是对于您(和其他人)参考来说,您可能需要考虑创建一个ResourceFilter或Middleware来清理传入的请求。您可以在此处使用任何工具或自定义代码,但关键是所有传入的请求都将通过此过滤器进行清理,以清除不良数据。

请确保为您的应用程序/需求使用正确的过滤器。 ResourceFilter将在模型绑定之前运行,而ActionFilter将在模型绑定之后运行。

答案 1 :(得分:2)

特别是您要在这里做什么?防止在未进行xss攻击时包含可能包含可呈现内容的帖子? 如果是这样,正如我最近与同事讨论的那样,您可能无法做到,具体取决于您的站点。

我的意思是,您可以对发布的数据提供客户端限制,但是显然可以绕开它,那么您打算采取什么措施?防止发布内容时,未经消毒有潜在的xss风险?

发布端点负责什么?是否对其他系统如何呈现已收到的输出负责?

我认为您的主要xss风险在于应用程序如何呈现数据。如果您没有根据正在使用数据的应用程序对输出进行卫生处理/编码,那么您可能做错了。

请记住,如果您要向网页或类似内容输出内容,则潜在的xss问题只是一个实际问题。这并不是接收数据问题的终结点。

答案 2 :(得分:2)

防止存储/反映XSS 的最佳方法之一是对输出进行 HTML编码。您也可以在将其存储在数据库中之前进行编码。 由于您始终不需要这些字段的输出为HTML。

使用正则表达式的解决方案并不总是有效。您在这里所做的就是依靠黑名单。依靠白名单(在这种情况下您不需要)总是更好,更安全。或对输出进行HTML编码。

答案 3 :(得分:1)

我知道这已经得到了回答,而且已经很充分了,但我也想添加我的答案,作为获得一些反馈的一种方式。这就是我在这种情况下所做的,这与手头的问题非常相似。

场景 我们有一个用 Vue.js 构建的前端应用程序,封装在 Quasar.dev 中,由后端的 .NET 5.0 API 提供服务。

解决方案 我们有“公共模型”,它们是我们用来发送到客户端应用程序的对象。它们没有命名和格式化为它们的数据库字段。我们使用 AutoMapper 从数据库字段(或模型)映射到公共字段(或模型) 一旦公共模型被映射,我们就将公共模型发送给用户。然后在 AutoMapper 配置文件中,我向 String 对象添加了一个名为 .Encode() 的扩展,它使用以下代码将来自数据库的任何内容编码到公共模型字段中...

public static string Encoded(this string value)
{
    return HttpUtility.HtmlEncode(value);
}

现在,每次我为公共模型添加新配置文件时,我只需确保添加对我不信任的字符串进行编码的调用。

怎么样?

答案 4 :(得分:0)

您可以在ASP.NET Core中使用HtmlSanitizer libraray。