IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> .netcore 处理xss攻击,做输入验证 -> 正文阅读

[移动开发].netcore 处理xss攻击,做输入验证

开发中我们往往需要给用户输入做一些特殊的过滤,主要的是防止xss攻击,至于一般的,有MaxLengthAttribute PhoneAttribute RegularExpressionAttribute等。

MaxLengthAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Docs

上面是校验是否通过,我们这次做一个替换的,主要目的是防止xss工具,原理是比如在用户的输入字段中包裹一些js或者引入外部js等然后浏览器访问了,就可以执行这个脚本。

定义一个过滤器给模型用,主要是标注下哪些模型是使用富文本过滤的,毕竟我的思路是普通的字符串直接替换<>符号,至于富文本则有其他的规则。

    public class EditHtmlAttribute : Attribute
    {
        public EditHtmlAttribute() { }
    }

定义一个过滤器:

    /// <summary>
    /// XSS工具过滤
    /// </summary>
    public class XSSAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            //post的xss过滤如何行驶?
            //获取Action参数集合
            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] = StringFilter(context.ActionArguments[p.Name].ToString());
                    }
                    else if (p.ParameterType.IsClass)//当参数等于类
                    {
                        ModelFieldFilter(p.Name, p.ParameterType, context.ActionArguments[p.Name]);
                    }
                }

            }
            base.OnActionExecuting(context);
        }

        /// <summary>
        /// 遍历修改类的字符串属性
        /// </summary>
        /// <param name="key">类名</param>
        /// <param name="t">数据类型</param>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        private object ModelFieldFilter(string key, Type t, object obj)
        {
            //获取类的属性集合
            var ats = t.GetCustomAttributes(typeof(XSSAttribute), false);
            if (obj != null)
            {
                //获取类的属性集合
                var pps = t.GetProperties();

                foreach (var pp in pps)
                {
                    if (pp.GetValue(obj) != null)
                    {
                        //当属性等于字符串
                        if (pp.PropertyType.Equals(typeof(string)))
                        {
                            //pp.CustomAttributes.Contains();
                            var find = false;
                            if (pp.CustomAttributes.Count() > 0)
                            {
                                foreach (var ca in pp.CustomAttributes)
                                {
                                    //是否标注了富文本
                                    if (ca.AttributeType.Name == nameof(EditHtmlAttribute))
                                    {
                                        find = true;
                                        break;
                                    }
                                    //可以扩展是否忽略校验
                                }
                            }

                            if (!find)
                            {
                                string value = pp.GetValue(obj).ToString();
                                pp.SetValue(obj, StringFilter(value));
                            }
                            else
                            {
                                    string value = pp.GetValue(obj).ToString();
                                    pp.SetValue(obj, HtmlFilter(value));                        
                            }

                        }
                        else if (pp.PropertyType.IsClass)//当属性等于类进行递归
                        {
                            pp.SetValue(obj, ModelFieldFilter(pp.Name, pp.PropertyType, pp.GetValue(obj)));
                        }
                    }

                }
            }

            return obj;
        }
        /// <summary>
        /// 基本字符串的过滤器
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        private string StringFilter(string val)
        {
            if (!String.IsNullOrEmpty(val))
            {
                //这里填写普通字符串的过滤规则
                return val.Replace("<", "&lt;").Replace(">","&gt;");
            }
            return val;
        }

        /// <summary>
        /// 富文本的过滤器
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        private string HtmlFilter(string val)
        {
            if (!String.IsNullOrEmpty(val))
            {
                //这里填写关于富文本的自定义过滤规则
                return val.Replace("<script", "&lt;");
            }
            return val;
        }
    }

接下来就是测试一下了。

        /// <summary>
        /// 验证html关键替换
        /// </summary>
        /// <param name="name"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        [HttpPost]
        [XSSAttribute]//标注使用xss替换校验
        public string PostUrl(ModelItem input)
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(input);
        }

ModelItem的模型如下:

    public class ModelItem
    {
        /// <summary>
        /// 其他参数
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 一般字符串内容
        /// </summary>
        public string Str { get; set; }

        /// <summary>
        /// 富文本内容
        /// </summary>
        [EditHtmlAttribute]
        public string Html { get; set; }

    }

然后运行项目测试下!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:51:12  更:2022-04-07 22:51:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 21:51:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码