在开发程序的过程中,稍微不注意就会隐含有sql注入的危险。今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁。不用每下地方对参数的值都进行检查,看是用户输入的内容是否有危险的sql。如果没个地方都要加有几个缺点:

1、工作量大

2、容易遗漏

3、不容易维护

下面我通过写一个过滤防止sql的特性类,对Action执行前对Action的参数进行处理,如果有其值有sql语句,就会这些非法字符替换为空字符串。

一、sql注入的例子:

上面的输入有两个输入框,用户可以输入任何的值,包括有sql注入的值。

后台代码:

AdminController.cs

public class AdminController : Controller
{public ActionResult Index(string name = "", string loginName = "", int page = 1){ViewBag.Name = name;ViewBag.LoginName = loginName;var r = DAdmin.GetList(name, loginName, page, 2);return View(r);}
}

DAdmin.cs:

public class DAdmin
{public static PageDataView<MSys_Admin> GetList(string name, string loginName, int page,int pageSize=10){PageCriteria criteria = new PageCriteria();criteria.Condition = "1=1";if (!string.IsNullOrEmpty(name))criteria.Condition += string.Format(" and Name like '%{0}%'", name);if (!string.IsNullOrEmpty(loginName))criteria.Condition += string.Format(" and LoginName like '%{0}%'", loginName);criteria.CurrentPage = page;criteria.Fields = "*";criteria.PageSize = pageSize;criteria.TableName = "Sys_Admin a";criteria.PrimaryKey = "UID";var r = Common.GetPageData<MSys_Admin>(criteria);return r;}
}

上面对用户输入的name和loginName两个参数没有判断是否有sql注入的非法字符,就直接拼接到sql语句,到数据库中执行,这样是非常危险的。

1、比如用户在name输入这样的内容:

%'--%

这样拼接出来的sql语句就成了

SELECT * FROM Sys_Admin WHERE Name like '%'--%'

这样“--”是sql的注释标记后面再拼接的sql语句都当成注释了,这样有效的就成了这样的sql语句:

SELECT * FROM Sys_Admin WHERE Name like '%'

这表示显示全部的记录。如果是登录的sql就会跳过用户名、密码的验证。

2、如果用户name输入内容带有insert或delete或者drop,比如:

namer人值为:%';DELETE FROM Sys_Admin--%

拼接成的sql成了:

SELECT * FROM Sys_Admin WHERE Name like '%';DELETE FROM Sys_Admin--%'

这样一执行就把Sys_Admin表的记录全部删除了。

总结:上面可以看到这种sql注入是多么的危险。

二、解决MVC sql注入方案

1、定义一个防止sql注入的字符串辅助类

public class StringHelper
{public static string FilterSql(string s){if (string.IsNullOrEmpty(s)) return string.Empty;s = s.Trim().ToLower();s = ClearScript(s);s = s.Replace("=", "");s = s.Replace("'", "");s = s.Replace(";", "");s = s.Replace(" or ", "");s = s.Replace("select", "");s = s.Replace("update", "");s = s.Replace("insert", "");s = s.Replace("delete", "");s = s.Replace("declare", "");s = s.Replace("exec", "");s = s.Replace("drop", "");s = s.Replace("create", "");s = s.Replace("%", "");s = s.Replace("--", "");return s;}
}

这个类对上面sql相关的字符串都替换掉。

2、定义一个用来检查并处理Action参数的特性类

public class AntiSqlInjectAttribute:FilterAttribute,IActionFilter
{public void OnActionExecuted(ActionExecutedContext filterContext){}public void OnActionExecuting(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] = StringHelper.FilterSql(filterContext.ActionParameters[p.ParameterName].ToString());}}}}
}

说明:这个特性类是继承了类FilterAttribute和实现了接口IActionFilter,这里在方法OnActionExecuting处理Action的参数,OnActionExecuting是在Action执行之前运行的方法,而OnActionExecuted是在Action执行之后运行的方法。

p.ParameterType == typeof(string)

因为sql注入只有参数类型为字符串的时候才有可能所以这里只对Action参数为字符串的参数进行处理。

filterContext.ActionParameters[p.ParameterName] = 
StringHelper.FilterSql(filterContext.ActionParameters[p.ParameterName].ToString());
是用过滤之后的安全的Action参数值替换原来的原始值。

3、防止sql注入特性类的在MVC的Controller中的使用

public class AdminController : Controller
{[AntiSqlInject]public ActionResult Index(string name = "", string loginName = "", int page = 1){ViewBag.Name = name;ViewBag.LoginName = loginName;var r = DAdmin.GetList(name, loginName, page, 2);return View(r);}
}

需要对Action的参数进行sql检查,只用在前面加上,上面定义的特性类AntiSqlInject。这个特性类可以用在任何的需要防止sql注入的Action上,根本不用对手动的去过滤程序中获取到的所有参数,安全、方便简洁。

转载于:https://www.cnblogs.com/li150dan/p/9712951.html

AOP实践—ASP.NET MVC5 使用Filter过滤Action参数防止sql注入,让你代码安全简洁相关推荐

  1. java filter注入_如何使用Filter过滤请求中的SQL注入攻击

    在doFilter方法中编写判断逻辑 public void doFilter(ServletRequest request, ServletResponse response, FilterChai ...

  2. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(52)-美化EasyUI皮肤和图标

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(52)-美化EasyUI皮肤和图标 系列目录 我很久以前就想更新系统的皮肤功能,Easyui 自带的 ...

  3. php过滤提交数据 防止sql注入攻击

    php过滤提交数据 防止sql注入攻击 在SQL注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中.例如,假设有一个简单的登录数据库.这个数据库中的每个记录都有一个用户名字 ...

  4. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(61)-如何使用框架来开发?...

    前言: 有些园友经常问如何正确快速开发,但是我告诉你没有什么帮助文档比自己动手做更加实在,不用代码生成器 这一节专门抽了些时间来非常非常详细演示这个框架的数据流,废话不多说,现在开始!下面看一张图,看 ...

  5. php mysql防注入字符串过滤_php中防止SQL注入的方法

    最好对magic_quotes_gpc已经开放的情况下,还是对$_POST['lastname']进行检查一下. 再说下mysql_real_escape_string和mysql_escape_st ...

  6. 【Web安全】绕过WAF过滤-利用cookie进行SQL注入

    文章目录 1 靶场分析 1.1 找到可能与数据库交互的模块 1.2 尝试注入 2 GET,POST传值 3 ModHeader绕WAF 1 靶场分析 1.1 找到可能与数据库交互的模块 HERE 进入 ...

  7. php过滤提交数据 防止sql注入***(8)

    现在还剩下什么问题呢?远程表单提交. 远程表单提交 Web 的好处是可以分享信息和服务.坏处也是可以分享信息和服务,因为有些人做事毫无顾忌. 以 表单为例.任何人都能够访问一个 Web 站点,并使用浏 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  9. php sql语句过滤,php如何做sql过滤

    php如何做sql过滤 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 ...

  10. 防止SQL注入和XSS攻击Filter

    nbsp;今天系统使用IBM的安全漏洞扫描工具扫描出一堆漏洞,下面的filter主要是解决防止SQL注入和XSS攻击 一个是Filter负责将请求的request包装一下. 一个是request包装器 ...

最新文章

  1. Linux下新增硬盘处理过程
  2. Activity的四种launchMode
  3. C++学习(十七)(C语言部分)之 指针
  4. Python 类的特殊成员方法详解
  5. 【CSON原创】HTML5字体动态粒子效果发布
  6. win7优化设置_win7蓝牙怎么打开?
  7. ASP.NET Core 搭配 Nginx 的真实IP问题
  8. xbmc电脑版本和手机版本学习教程
  9. 北航 2012 秋季 软件工程课 M2 要求
  10. 调整数组顺序使奇数位于偶数前
  11. NIOS II 常见问题总结FAQ - xiangyuqxq的专栏 - CSDN博客
  12. Linux嵌入式学习-ds18b20驱动
  13. mysql mssql 性能对比_详解mysql分区实验测试--非分区表与分区表的性能对比
  14. 腾讯云数据迁移工具解决方案:华为云迁移到腾讯云
  15. g的python实现_Python gevent协程切换实现详解
  16. 2020中南大学计算机学院考研初试成绩,中南大学2020考研复试分数线已公布
  17. MATLAB算法实战应用案例精讲-【人工智能】枝晶生长模型(附matlab代码实现)
  18. jQuery入门案例
  19. A 暴力搜索 剪枝是关键
  20. 自动化测试—业务线仿真回归流程剖析

热门文章

  1. 如何动/静 态 两种方式修改Static控件的颜色
  2. 如何开启QtCreator的代码自动补全功能
  3. HDU2066--一个人的旅行(Dijkstra)
  4. Ibatis结合MySQL数据库的使用方法
  5. SqlServer支持多表关联的分页存储过程
  6. puppeteer-firefox 开启扩展
  7. MapReduce学习要点
  8. java实现选择排序+图解+代码解析
  9. pandas创建series三种方法
  10. android 背景逐渐变暗,UI:使View背景逐渐变暗的方法