asp.net MVC 防止Sql 漏洞攻击

asp.net MVC 专栏收录该内容
7 篇文章 0 订阅

一.创建公共类

 public class AntiSqlInject
    {
      
        /// <summary>
        /// 判断字符串中是否有SQL攻击代码
        /// true-安全;false-有注入攻击现有
        /// </summary>
        /// <param name="inputString">传入用户提交数据</param>
        /// <returns></returns>
        public static bool ProcessSqlStr(string inputString)
        {
            string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create|drop|count|\*|chr|char|asc|mid|substring|master|truncate|declare|xp_cmdshell|restore|backup|net +user|net +localgroup +administrators";
            try
            {
                if ((inputString != null) && (inputString != String.Empty))
                {
                    string str_Regex = @"\b(" + SqlStr + @")\b";

                    Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);                   
                    if (true == Regex.IsMatch(inputString))
                        return false;

                }
            }
            catch
            {
                return false;
            }
            return true;
        }

        /// <summary>
        /// 过滤特殊字符和关键字
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string FilterSql(string s)
        {
            if (string.IsNullOrEmpty(s)) return string.Empty;
            s = s.Trim().ToLower();
            s = s.Replace("=", "");
            s = s.Replace("'", "");
            s = s.Replace(";", "");
            s = s.Replace(" or ", "");
            s = s.Replace("and", "");
            s = s.Replace("exec", "");
            s = s.Replace("execute", "");
            s = s.Replace("insert", "");
            s = s.Replace("delete", "");
            s = s.Replace("update", "");
            s = s.Replace("alter", "");
            s = s.Replace("create", "");
            s = s.Replace("drop", "");
            s = s.Replace("count", "");
            s = s.Replace("char", "");
            s = s.Replace("mid", "");
            s = s.Replace("substring", "");
            s = s.Replace("master", "");
            s = s.Replace("truncate", "");
            s = s.Replace("declare", "");
            s = s.Replace("xp_cmdshell", "");
            s = s.Replace("restore", "");
            s = s.Replace("net +user", "");
            s = s.Replace("backup", "");
            s = s.Replace("net +localgroup", "");
            s = s.Replace("net +localgroup +administrators", "");                    
            s = s.Replace("%", "");
            s = s.Replace("--", "");
            s = s.Replace("xp_", "");
            return s;
        }

二 .配置帅选器

创建一个基础 BaseController类,所有的Controller 集成基础BaseController类

基础BaseController类中添加如下代码

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
                            
            base.OnActionExecuting(filterContext);            
            //防止Sql注入
            AntiSqlInjectFilter(filterContext);
        }

 

 /// <summary>
        /// 防SQL注入筛选器
        /// </summary>
        /// <param name="filterContext"></param>
        protected void AntiSqlInjectFilter(ActionExecutingContext filterContext)
        {
            var actionParameters = filterContext.ActionDescriptor.GetParameters();
            foreach (var p in actionParameters)
            {
                if (p.ParameterType == typeof(string))
                {
                    if (filterContext.ActionParameters[p.ParameterName] != null && filterContext.ActionParameters[p.ParameterName]!="")
                    {
                        if (!ExcludeParameterNames().Contains(p.ParameterName))
                        {
                            filterContext.ActionParameters[p.ParameterName] = AntiSqlInject.FilterSql(filterContext.ActionParameters[p.ParameterName].ToString());
                        }
                    }
                }
                else if (p.ParameterType.IsClass == true)
                {
                    var queryEntity = filterContext.ActionParameters[p.ParameterName];
                    Type type = queryEntity.GetType();
                    PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
                    if (properties.Length <= 0) { return; }
                    foreach (PropertyInfo item in properties)
                    {
                        string name = item.Name;
                        if (item.PropertyType == typeof(string))//|| item.PropertyType.Name.StartsWith("String")
                        {                           
                            object value = item.GetValue(queryEntity, null);
                            if (value != null)
                            {
                                object outValue = AntiSqlInject.FilterSql(value.ToString());
                                item.SetValue(queryEntity, Convert.ChangeType(outValue, item.PropertyType), null);
                            }

                        }

                    }
                }
            }
        }

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值