.Net Core 防御XSS攻击

news/2024/5/19 22:41:51 标签: .netcore, xss

        网络安全攻击方式有很多种,其中包括XSS攻击、SQL注入攻击、URL篡改等。那么XSS攻击到底是什么?XSS攻击有哪几种类型?

        XSS攻击又称为跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

       常见的XSS攻击有三种:反射型XSS攻击、DOM-based型XSS攻击、存储型XSS攻击。

第一种:反射型XSS攻击

        反射型XSS攻击一般是攻击者通过特定手法,诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类XSS攻击通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端Cookies或进行钓鱼欺骗

第二种:DOM-based型XSS攻击

        客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从URL中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的JavaScript脚本,而这些脚本没有经过适当的过滤或者消毒,那么应用程序就可能受到DOM-based型XSS攻击。

  需要特别注意以下的用户输入源document.URL、location.hash、location.search、document.referrer等。

第三种:存储型XSS攻击

        攻击者事先将恶意代码上传或者储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此存储型XSS攻击的危害会更大。此类攻击一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

        好了,废话太多,还是直接上代码吧,XXSHelper.cs 工具类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace test.Defender
{
    public class XSSHelper
    {
        //过滤后返回的结果
        public static string XssFilter(string html)
        {
            string str = HtmlFilter(html);
            return str;
        }

        //过滤html
        public static string HtmlFilter(string Htmlstring)
        {
            //这里用正则表达式匹配到<[^>]*>全部过滤掉,当然也可以根据自身需求填写
            string result = Regex.Replace(Htmlstring, @"<[^>]*>", String.Empty);
            return result;
        }
    }
}

XXSFilterAttribute.cs过滤器
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace test.Defender
{
    public class XSSFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var ps = context.ActionDescriptor.Parameters;
            foreach (var p in ps)
            {
                if (context.ActionArguments[p.Name] != null)
                {
                    if (p.ParameterType.Equals(typeof(string)))
                    {
                        context.ActionArguments[p.Name] = XSSHelper.XssFilter(context.ActionArguments[p.Name].ToString());
                    }
                    else if (p.ParameterType.IsClass)
                    {
                        PostModelFieldFilter(p.ParameterType, context.ActionArguments[p.Name]);
                    }
                }

            }
        }

        private object PostModelFieldFilter(Type type, object obj)
        {
            if (obj != null)
            {
                foreach (var item in type.GetProperties())
                {
                    if (item.GetValue(obj) != null)
                    {
                        if (item.PropertyType.Equals(typeof(string)))
                        {
                            string value = item.GetValue(obj).ToString();
                            item.SetValue(obj, XSSHelper.XssFilter(value));
                        }
                        else if (item.PropertyType.IsClass)
                        {
                            item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj)));
                        }
                    }

                }
            }
            return obj;
        }
    }
}

LoginController.cs 控制器:

using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using test.Defender;
using test.Jwt;
using test.Models;

namespace test.Controllers
{
    [XSSFilter]   //在控制器加上XXSFilter即可过滤
    [ApiController]
    [Route("api/[controller]")]
    public class LoginController : Controller
    {
        private string _names = "admin";
        private string _role = "admin"; //角色,对应实体类的角色,在控制器中确定角色是否允许访问

        // POST: api/Login
        [HttpPost]
        public IActionResult Index([FromBody] LoginModel model)
        {
            if (_names.Contains(model.Username) && model.Password == "admin")
            {
                return Ok(new
                {
                    access_token = JwtHelper.create_Token(new User(1, model.Username, _role))
                });
            }
            return Unauthorized();
        }
    }
}

防范手段
        都说知己知彼方能百战不殆,知道了xss攻击的原理那么防御的方法也就显而易见了。

        首先是过滤:对诸如<script>、<img>、<a>等标签进行过滤。
        其次是编码:像一些常见的符号,如<>在输入的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。
        最后是限制:通过以上的案例我们不难发现xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。
 

后话

        安全攻防双方的博弈永远都不会停止,也正是这种博弈推进了信息安全的发展。究竟是道高一尺还是魔高一丈很难定论。其实安全问题归根结底还是一个信任的前提。什么输入值得信任?什么输入不值得信任需要特殊处理是安全人员常常要思考的一个问题。

希望本文对你有帮助,感谢您的阅读。


http://www.niftyadmin.cn/n/5299528.html

相关文章

算法练习Day25 (Leetcode/Python-贪心算法)

贪心算法基本概念&#xff1a; 贪心的本质是通过选取局部最优达到全局最优。 并没有固定的套路&#xff0c;检验的算法正确性的办法可以是举反例。 455. Assign Cookies Assume you are an awesome parent and want to give your children some cookies. But, you should gi…

P口输出流水灯与proteus

一、实验目的&#xff1a; &#xff08;1&#xff09;学习P1口的使用方法; &#xff08;2&#xff09;学习延时子程序的编写。 &#xff08;3&#xff09;学习掌握单片机仿真软件proteus的使用方法 二、实验顶备知识&#xff1a; &#xff08;1&#xff09;Pl口为准双向口,…

数据库和数据库编程

数据库、数据表、表数据操作以及数据库编程相关的知识点 1. 数据库的概念&#xff1a; 数据库是用于存储和组织数据的系统。数据库管理系统(DBMS)是管理数据库的软件&#xff0c;提供对数据的访问、查询和维护。关系型数据库是一种通过表格结构来组织和管理数据的数据库。 2…

浅析PostgreSQL与SQL Server两者间的关键性差异

市场上有各种各样的数据库可供选择&#xff0c;用户通常可以仔细考虑PostgreSQL与SQL Server&#xff0c;以便为他们的用例找出更好的选择。使用PostgreSQL进行运营的组织可能希望切换到像Microsoft SQL Server这样的数据库&#xff0c;因为它主要迎合不同的数据仓库解决方案、…

大语言模型提示工程:引领生成式AI的未来

在当今数字化时代&#xff0c;大语言模型&#xff08;LLMs&#xff09;已成为人工智能领域的焦点。在2023 re:Invent大会上&#xff0c;亚马逊云科技Bedrock部门的主要工程师约翰贝克&#xff08;John Baker&#xff09;和Anthropic公司的代表尼古拉斯马鲁尔&#xff08;Nichol…

论文解读:A New CNN Building Block for Low-ResolutionImages and Small Objects

引言 之前通过stride和pooling这些下采样操作&#xff0c;但是这些操作都会或多或少丢失图像的信息&#xff0c;所以这不适用于具有低分辨率图像和小物体的更困难的任务上。像池化选择maxpooling或者是averagepooling、卷积的步长(太大的话会丢失信息)都是很头疼的问题&#x…

selenium+python自动化测试之环境搭建

最近由于公司有一个向谷歌网站上传文件的需求&#xff0c;需要进行web的自动化测试&#xff0c;选择了selenium这个自动化测试框架&#xff0c;以前没有接触过这门技术&#xff0c;所以研究了一下&#xff0c;使用python来实现自动化脚本&#xff0c;从环境搭建到实现脚本运行。…

uniapp门店收银,点击右边商品,商品会进入左边的购物车,并且,当扫码枪扫描商品条形码,商品也会累计进入购物车

效果&#xff1a; 代码&#xff1a; <template><view class"container"><view class"top" style"height: 10%; margin-bottom: 20rpx; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);"><view class"box" style&q…