• .NET Core如何防范XSS攻击?
  • 发布于 2个月前
  • 110 热度
    0 评论
一. 什么是XSS攻击
XSS(Cross-Site Scripting)是一个安全漏洞,黑客可以在用户页面中放脚本(通常JavaScript脚本),当用户加载该页面时黑客的脚本会运行,这时黑客可以窃取cookies和会话的tokens,通过操控DOM来改变网页或者跳转浏览器到另外页面,XSS漏洞通常发生在应用程序的用户输入时没有验证和应用程序输出到页面而没有编码。

这篇文章主要应用于ASP.NET Core MVC 或者返回HTML的应用程序,这种类型的应用程序更容易受到XSS攻击,Web API应用以HTML,XML或者JSON形式返回的数据,如果用户没有进行输入验证,也会引发XSS攻击,这取决于客户端应用程序对API的信任程度, 例如:一个API接收用户的输入并且以HTML形式返回结果,攻击者能够注入脚本到内容里面,当响应呈现到用户浏览器时会执行该脚本。

二. 例子
我们创建一个项目命名为AspNetCore.XSS,为了方便演示我们使用EF的Memory来存储数据,我们创建一个Blog的功能来管理用户的博客,代码细节我们这里不详细展开,可以到文章最后的github下载,我们添加的博客内容里面包含了<script>脚本。

浏览器只是显示这段脚本而没有执行它,我们通过浏览器查看一下HTML源码,我们可以看到页面进行了编码,而没有运行脚本。

进入视图,我们使用下面代码来替换:
@Html.Raw(blog.Body)
再次运行应用程序,我们发现这次浏览器执行了脚本。

查看浏览器源码发现这次脚本没有被编码。

用户输入的数据我们尽量要验证,下面这段代码风险极高:
[HttpGet]
public string GetProfile(string id)
{
    // 堆代码 duidaima.com
    return $"你好,我叫 {id}.";
}
如下所示:

三. 如何防止XSS攻击
XSS攻击本质是通过在页面插入<script>标签或者在HTML元素中插入On*事件来欺骗你应用程序,从而来达到攻击者的目的
(1)对用户输入的数据进行验证,永远不要相信用户输入的数据,包括:表单输入、URL 参数、Cookie、HTTP 头部还是其他途径提供数据
(2) 对输出数据进行编码,例如,将 < 编码为 &lt;  > 编码为 &gt; " 编码为 &quot;
(3) 使用不同类型的编码,在HTML中使用HTML编码,在Javascript中使用Javascript编码
(4) 使用markdown替换HTML的编辑器
(5) 使用CSP(Content Security Policy)配置来定义哪些资源可以加载到您的页面上,限制脚本的来源,从而减少恶意脚本的执行
(6) 向用户普及安全教育
(7) 定期审查和更新应用程序的安全策略,以适应新的安全威胁和最佳实践

ASP.NET Core 中为我们提供了一下辅助类,针对html,javascript和url数据进行编码System.Text.Encodings.Web命名空间中HtmlEncoder和JavaScriptEncoder和UrlEncoder。
用户评论