.Net防sql注入的方法总结

#防sql注入的常用方法:

1、服务端对前端传过来的参数值进行类型验证;

2、服务端执行sql,使用参数化传值,而不要使用sql字符串拼接;

3、服务端对前端传过来的数据进行sql关键词过来与检测;

#着重记录下服务端进行sql关键词检测:

1、sql关键词检测类:

 1     public class SqlInjectHelper:System.Web.UI.Page
 2     {
 3         private static string StrKeyWord = "select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec|master|net local group administrators|net user|or|and";
 4         private static string StrSymbol = ";|(|)|[|]|{|}|%|@|*|‘|!";
 5
 6         private HttpRequest request;
 7         public SqlInjectHelper(System.Web.HttpRequest _request)
 8         {
 9             this.request = _request;
10         }
11         public bool CheckSqlInject()
12         {
13             return CheckRequestQuery() || CheckRequestForm();
14         }
15
16         ///<summary>
17         ///检查URL中是否包含Sql注入
18         /// <param name="_request">当前HttpRequest对象</param>
19         /// <returns>如果包含sql注入关键字,返回:true;否则返回:false</returns>
20         ///</summary>
21         public bool CheckRequestQuery()
22         {
23             if (request.QueryString.Count > 0)
24             {
25                 foreach (string sqlParam in this.request.QueryString)
26                 {
27                     if (sqlParam == "__VIEWSTATE")
28                         continue;
29                     if (sqlParam == "__EVENTVALIDATION")
30                         continue;
31                     if (CheckKeyWord(request.QueryString[sqlParam].ToLower()))
32                     {
33                         return true;
34                     }
35                 }
36             }
37             return false;
38         }
39         ///<summary>
40         ///检查提交的表单中是否包含Sql注入关键字
41         /// <param name="_request">当前HttpRequest对象</param>
42         /// <returns>如果包含sql注入关键字,返回:true;否则返回:false</returns>
43         ///</summary>
44         public bool CheckRequestForm()
45         {
46             if (request.Form.Count > 0)
47             {
48                 foreach (string sqlParam in this.request.Form)
49                 {
50                     if (sqlParam == "__VIEWSTATE")
51                         continue;
52                     if (sqlParam == "__EVENTVALIDATION")
53                         continue;
54                     if (CheckKeyWord(request.Form[sqlParam]))
55                     {
56                         return true;
57                     }
58                 }
59             }
60             return false;
61         }
62         ///<summary>
63         ///检查字符串中是否包含Sql注入关键字
64         /// <param name="_key">被检查的字符串</param>
65         /// <returns>如果包含sql注入关键字,返回:true;否则返回:false</returns>
66         ///</summary>
67         private static bool CheckKeyWord(string _key)
68         {
69             string[] pattenKeyWord = StrKeyWord.Split(‘|‘);
70             string[] pattenSymbol = StrSymbol.Split(‘|‘);
71             foreach (string sqlParam in pattenKeyWord)
72             {
73                 if (_key.Contains(sqlParam + " ") || _key.Contains(" " + sqlParam))
74                 {
75                     return true;
76                 }
77             }
78             foreach (string sqlParam in pattenSymbol)
79             {
80                 if (_key.Contains(sqlParam))
81                 {
82                     return true;
83                 }
84             }
85             return false;
86         }
87
88     }

SqlInjectHelper类中,对request的query参数和form参数进行的检测,没有对cookie的检测,如有需要,可自行加上;

2、SqlInjectHelper在哪调用呢?

1)、如果想对整个web站点的所有请求都做sql关键字检测,那就在Global.asax 的 Application_BeginRequest方法中调用;

 1         protected void Application_BeginRequest(object sender, EventArgs e)
 2         {
 3             SqlInjectHelper myCheck = new SqlInjectHelper(Request);
 4             bool result = myCheck.CheckSqlInject();
 5             if (result)
 6             {
 7                 Response.ContentType = "text/plain";
 8                 Response.Write("您提交的数据有恶意字符!");
 9                 Response.End();
10             }
11         }

2)、如果只需对某个接口文件的接口进行sql关键字检测,那只需在该文件开始处调用SqlInjectHelper类即可;

 1     public class Handler1 : IHttpHandler
 2     {
 3         public void ProcessRequest(HttpContext context)
 4         {
 5             SqlInjectHelper myCheck = new SqlInjectHelper(context.Request);
 6             bool result = myCheck.CheckSqlInject();
 7             context.Response.ContentType = "text/plain";
 8             context.Response.Write(result?"您提交的数据有恶意字符!":"");
 9             context.Response.StatusCode = result ? 500 : 200;
10         }
11         public bool IsReusable
12         {
13             get
14             {
15                 return false;
16             }
17         }
18     }

上面的代码就是对某个一般处理程序(ashx)添加了sql关键字检测;

3、补充说明:asp.net中的 __VIEWSTATE、__EVENTVALIDATION、

  在sql关键字检测方法中,排除了__VIEWSTATE、__EVENTVALIDATION这两个参数;

1)、__VIEWSTATE
  ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。 
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。 
  当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值;

2)、__EVENTVALIDATION
  __EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。
“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.;

4、sql关键词检测的另一个版本:该版本将所有危险字符都放在了一个正则表达式中;

该类不仅检测了sql常用关键字还有xss攻击的常用关键字

 1     public class SafeHelper
 2     {
 3         private const string StrRegex = @"<[^>]+?style=[\w]+?:expression\(|\b(alert|confirm|prompt)\b|^\+/v(8|9)|<[^>]*?=[^>]*?&#[^>]*?>|\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|/\*.+?\*/|<\s*script\b|<\s*img\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
 4         public static bool PostData()
 5         {
 6             bool result = false;
 7             for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)
 8             {
 9                 result = CheckData(HttpContext.Current.Request.Form[i].ToString());
10                 if (result)
11                 {
12                     break;
13                 }
14             }
15             return result;
16         }
17
18         public static bool GetData()
19         {
20             bool result = false;
21             for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
22             {
23                 result = CheckData(HttpContext.Current.Request.QueryString[i].ToString());
24                 if (result)
25                 {
26                     break;
27                 }
28             }
29             return result;
30         }
31         public static bool CookieData()
32         {
33             bool result = false;
34             for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++)
35             {
36                 result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower());
37                 if (result)
38                 {
39                     break;
40                 }
41             }
42             return result;
43
44         }
45         public static bool referer()
46         {
47             bool result = false;
48             return result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString());
49         }
50         public static bool CheckData(string inputData)
51         {
52             if (Regex.IsMatch(inputData, StrRegex))
53             {
54                 return true;
55             }
56             else
57             {
58                 return false;
59             }
60         }
61     }

————————————————————————————————————

原文地址:https://www.cnblogs.com/willingtolove/p/11069969.html

时间: 2024-11-06 21:26:07

.Net防sql注入的方法总结的相关文章

C#使用带like的sql语句时防sql注入的方法

本文实例叙述了在拼接sql语句的时候,如果遇到Like的情况该怎么办. 一般采用带like的SQL语句进行简单的拼接字符串时,需要开率遇到sql注入的情况.这确实是个需要注意的问题. 这里结合一些查阅的资料做了初步的整理. 如这样一个sql语句: select * from game where gamename like '%张三%' 用c#表示的话: string keywords = "张三"; StringBuilder strSql=new StringBuilder();

(转)防SQL注入的方法

——选自<深入Ajax : 架构与最佳实践 = Advanced Ajax : architecture and best practices/ (美)Shawn M.Lauriat著;张过,宋会敏等译> SQL注入 SQL注入攻击是指利用数据库服务器支持的SQL语法,以开发人员意料之外的方式执行SQL命令.这种攻击的主要形式是滥用传递到SQL中的未转义字符串,即滥用原本与SQL代码无关的GET或POST输出.结果是攻击者可以运行应用程序的数据库用户有权运行的任何SQL语句.利用SQL注入,攻

C#语言Winform防SQl注入做用户登录的例子

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace OmyGod {     public partial

在Global.asax文件里实现通用防SQL注入漏洞程序

首先,创建一个SQLInjectionHelper类完成恶意代码的检查 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text.RegularExpressions; /// <summary> ///SQLInjectionHelper 的摘要说明 /// </summary> public class SQLInjec

【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特别注意什么? 一.为何要优先使用PDO? PHP手册上说得很清楚: Prepared statements and stored procedures Many of the more mature databases support the concept of prepared statemen

回头探索JDBC及PreparedStatement防SQL注入原理

概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项目中有一些配置项是有时候要变动的,比如数据库的数据源,为了在修改配置时不改动编译的代码,我们把要变动的属性提取到一个配置文件中,比如properties,因为properties里面都是键值对的形式,所以非常便于阅读和维护. 一.首先说说读取properties文件,这个相对路径和绝对路径的问题:

sqlalchemy防sql注入

银行对安全性要求高,其中包括基本的mysql防注入,因此,记录下相关使用方法: 注意:sqlalchemy自带sql防注入,但是在 execute执行 手写sql时 需要考虑此安全问题 对于 where in 的防sql注入:(in 的内容一定要是tuple类型,否则查询结果不对) in_str = tuple(input_list)sql = "(SELECT count(id) FROM {0} WHERE {0}.id IN :in_str);".format(cls.__tab

asp.net利用HttpModule实现防sql注入和加载样式和JS文件

1.新建一个类,实现IHttpModule接口 代码如下: public class SqlHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.AcquireRequestState += new EventHandler(context_AcquireRequestState); } } 在实现接口的Init方法时,我们选择了Acquir

nginx服务器防sql注入/溢出攻击/spam及禁User-agents

本文章给大家介绍一个nginx服务器防sql注入/溢出攻击/spam及禁User-agents实例代码,有需要了解的朋友可进入参考. 在配置文件添加如下字段即可  代码如下 复制代码 server { ## 禁SQL注入 Block SQL injections set $block_sql_injections 0; if ($query_string ~ "union.*select.*(") { set $block_sql_injections 1; } if ($query_