ASP.NET过滤类SqlFilter,防止SQL注入 原创
2016-03-25 00:00
921 查看
什么是SQL注入?
我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的!
举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客可以输入: ';DROP TABLE Test;-- 不要小瞧这一段SQL代码:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是正确的,可执行的,但是执行后整个Test表都删除了,网站崩溃!
最好的解决方法
最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目使用。这里不做介绍,感兴趣的朋友可以自行搜索一下,本文介绍的方法适合老项目,就是没有使用参数化SQL开发的程序。
使用过滤函数来过滤
将SQL一些危险的关键字,还有注释百分号以及分号这些根本在我们正常写代码的时候根本不会出现的字符都过滤掉,这样能最大限度的保证SQL执行是安全的,代码如下:
SQL注入中绕过 单引号 限制继续注入
asp.net下检测SQL注入式攻击代码
asp.net 预防SQL注入攻击之我见
asp.net利用HttpModule实现防sql注入
asp.net(C#)防sql注入组件的实现代码
SQL数据库的高级sql注入的一些知识
在Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)
c#.net全站防止SQL注入类的代码
数据库SqlParameter 的插入操作,防止sql注入的实现代码
C#防SQL注入代码的三种方法
防御SQL注入的方法总结
我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的!
举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客可以输入: ';DROP TABLE Test;-- 不要小瞧这一段SQL代码:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是正确的,可执行的,但是执行后整个Test表都删除了,网站崩溃!
最好的解决方法
最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目使用。这里不做介绍,感兴趣的朋友可以自行搜索一下,本文介绍的方法适合老项目,就是没有使用参数化SQL开发的程序。
使用过滤函数来过滤
将SQL一些危险的关键字,还有注释百分号以及分号这些根本在我们正常写代码的时候根本不会出现的字符都过滤掉,这样能最大限度的保证SQL执行是安全的,代码如下:
public class SqlFilter { public static void Filter() { string fileter_sql = "execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--"; try { // -----------------------防 Post 注入----------------------- if (HttpContext.Current.Request.Form != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 Form 属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.Form, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++) { string getsqlkey = HttpContext.Current.Request.Form.Keys[k]; string sqlstr = HttpContext.Current.Request.Form[getsqlkey]; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.Form[getsqlkey] = sqlstr; } } // -----------------------防 GET 注入----------------------- if (HttpContext.Current.Request.QueryString != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 QueryString 属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.QueryString, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.QueryString.Count; k++) { string getsqlkey = HttpContext.Current.Request.QueryString.Keys[k]; string sqlstr = HttpContext.Current.Request.QueryString[getsqlkey]; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.QueryString[getsqlkey] = sqlstr; } } // -----------------------防 Cookies 注入----------------------- if (HttpContext.Current.Request.Cookies != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 Cookies 属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.Cookies, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.Cookies.Count; k++) { string getsqlkey = HttpContext.Current.Request.Cookies.Keys[k]; string sqlstr = HttpContext.Current.Request.Cookies[getsqlkey].Value; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.Cookies[getsqlkey].Value = sqlstr; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
您可能感兴趣的文章:
asp.net 防止SQL注入攻击SQL注入中绕过 单引号 限制继续注入
asp.net下检测SQL注入式攻击代码
asp.net 预防SQL注入攻击之我见
asp.net利用HttpModule实现防sql注入
asp.net(C#)防sql注入组件的实现代码
SQL数据库的高级sql注入的一些知识
在Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)
c#.net全站防止SQL注入类的代码
数据库SqlParameter 的插入操作,防止sql注入的实现代码
C#防SQL注入代码的三种方法
防御SQL注入的方法总结
相关文章推荐
- Sql Server 应用程序的高级Sql注入第1/2页
- PHP的SQL注入实现(测试代码安全不错)
- php防止SQL注入详解及防范
- PHP的SQL注入过程分析
- SQL数据库的高级sql注入的一些知识
- ASP也使用ORM,给ASP上所有的SQL注入画上句号
- SQL注入中绕过 单引号 限制继续注入
- JSP 防范SQL注入攻击分析
- PHP中防止SQL注入攻击和XSS攻击的两个简单方法
- 2007 10.30动易网站管理系统vote.asp页面存在SQL注入漏洞
- PHP中全面阻止SQL注入式攻击分析小结
- PHP 小心urldecode引发的SQL注入漏洞
- PHP中防止SQL注入实现代码
- asp.net 预防SQL注入攻击之我见
- php防止sql注入之过滤分页参数实例
- 对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
- 防御SQL注入的方法总结
- Mysql数据库使用concat函数执行SQL注入查询
- PHP防范SQL注入的具体方法详解(测试通过)
- PHP中防止SQL注入方法详解