最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

ASP.NET过滤类SqlFilter,防止SQL注入 原创

来源:懂视网 责编:小采 时间:2020-11-27 22:37:52
文档

ASP.NET过滤类SqlFilter,防止SQL注入 原创

ASP.NET过滤类SqlFilter,防止SQL注入 原创:什么是SQL注入? 我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的! 举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客
推荐度:
导读ASP.NET过滤类SqlFilter,防止SQL注入 原创:什么是SQL注入? 我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的! 举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客

什么是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);
 }

 }

}

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

ASP.NET过滤类SqlFilter,防止SQL注入 原创

ASP.NET过滤类SqlFilter,防止SQL注入 原创:什么是SQL注入? 我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的! 举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客
推荐度:
标签: 过滤 防止 sql
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top