在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可以进行>有限的
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; }
...
答案 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。