防止sql注入式攻击 SQL注入学习——三层架构

解决方案是:
1、首先在UI录入时,要控制数据的类型和长度、防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交;
2、业务逻辑层控制,通过在方法内部将SQL关键字用一定的方法屏蔽掉,然后检查数据长度,保证提交SQL时,不会有SQL数据库注入式攻击代码;但是这样处理后,要求UI输出时将屏蔽的字符还原。因此系统提供屏蔽字符 的函数和还原字符的函数。
3、在数据访问层,绝大多数采用存储过程访问数据,调用时以存储过程参数的方式访问,也会很好的防止注入式攻击。

3                         /**//// 
  4 /// 判断字符串中是否有SQL攻击代码
  5 /// 
  6 /// 传入用户提交数据
  7 /// true-安全;false-有注入攻击现有;
  8 public bool ProcessSqlStr(string inputString)
  9 {
 10     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";
 11     try
 12      {
 13         if ((inputString != null) && (inputString != String.Empty))
 14          {
 15             string str_Regex = @"\b(" + SqlStr + @")\b";
 16
 17             Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
 18             //string s = Regex.Match(inputString).Value; 
 19             if (true == Regex.IsMatch(inputString))
 20                 return false;
 21
 22         }
 23     }
 24     catch
 25      {
 26         return false;
 27     }
 28     return true;
 29 }
 30
 31
 32 /**//// 
 33 /// 处理用户提交的请求,校验sql注入式攻击,在页面装置时候运行
 34 /// System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString(); 为用户自定义错误页面提示地址,
 35 /// 在Web.Config文件时里面添加一个 ErrorPage 即可
 36 /// 
 37 ///     
 38 /// 
 39 public void ProcessRequest()
 40 {
 41     try
 42      {
 43         string getkeys = "";
 44         string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString();
 45         if (System.Web.HttpContext.Current.Request.QueryString != null)
 46          {
 47
 48             for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
 49              {
 50                 getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
 51                 if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
 52                  {
 53                     System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=" + getkeys + "有SQL攻击嫌疑!");
 54                     System.Web.HttpContext.Current.Response.End();
 55                 }
 56             }
 57         }
 58         if (System.Web.HttpContext.Current.Request.Form != null)
 59          {
 60             for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
 61              {
 62                 getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
 63                 if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
 64                  {
 65                     System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=" + getkeys + "有SQL攻击嫌疑!");
 66                     System.Web.HttpContext.Current.Response.End();
 67                 }
 68             }
 69         }
 70     }
 71     catch
 72      {
 73         // 错误处理: 处理用户提交信息!
 74     }
 75 }
 76 #endregion
 77
 78
 79
 80
 81 转换sql代码(也防止sql注入式攻击,可以用于业务逻辑层,但要求UI层输入数据时候进行解码)#region 转换sql代码(也防止sql注入式攻击,可以用于业务逻辑层,但要求UI层输入数据时候进行解码)
 82 /**//// 
 83 /// 提取字符固定长度
 84 /// 
 85 /// 
 86 /// 
 87 /// 
 88 public string CheckStringLength(string inputString, Int32 maxLength)
 89 {
 90     if ((inputString != null) && (inputString != String.Empty))
 91      {
 92         inputString = inputString.Trim();
 93
 94         if (inputString.Length > maxLength)
 95             inputString = inputString.Substring(0, maxLength);
 96     }
 97     return inputString;
 98 }
 99
100 /**//// 
101 /// 将输入字符串中的sql敏感字,替换成"[敏感字]",要求输出时,替换回来
102 /// 
103 /// 
104 /// 
105 public string MyEncodeInputString(string inputString)
106 {
107     //要替换的敏感字
108     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";
109     try
110      {
111         if ((inputString != null) && (inputString != String.Empty))
112          {
113             string str_Regex = @"\b(" + SqlStr + @")\b";
114
115             Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
116             //string s = Regex.Match(inputString).Value; 
117             MatchCollection matches = Regex.Matches(inputString);
118             for (int i = 0; i < matches.Count; i++)
119                 inputString = inputString.Replace(matches[i].Value, "[" + matches[i].Value + "]");
120
121         }
122     }
123     catch
124      {
125         return "";
126     }
127     return inputString;
128
129 }
130
131 /**//// 
132 /// 将已经替换成的"[敏感字]",转换回来为"敏感字"
133 /// 
134 /// 
135 /// 
136 public string MyDecodeOutputString(string outputstring)
137 {
138     //要替换的敏感字
139     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";
140     try
141      {
142         if ((outputstring != null) && (outputstring != String.Empty))
143          {
144             string str_Regex = @"\[\b(" + SqlStr + @")\b\]";
145             Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
146             MatchCollection matches = Regex.Matches(outputstring);
147             for (int i = 0; i < matches.Count; i++)
148                 outputstring = outputstring.Replace(matches[i].Value, matches[i].Value.Substring(1, matches[i].Value.Length - 2));
149
150         }
151     }
152     catch
153      {
154         return "";
155     }
156     return outputstring;
157 }
158 #endregion

时间: 2024-08-02 22:20:16

防止sql注入式攻击 SQL注入学习——三层架构的相关文章

浅谈C#.NET防止SQL注入式攻击

1#region 防止sql注入式攻击(可用于UI层控制)  2  3///   4/// 判断字符串中是否有SQL攻击代码  5///   6/// 传入用户提交数据  7/// true-安全:false-有注入攻击现有:  8public bool ProcessSqlStr(string inputString)  9{ 10    string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create

什么是SQL注入式攻击

什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击.常见的SQL注入式攻击过程类如: ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码. ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直

什么是SQL注入式攻击?

什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击.常见的SQL注入式攻击过程类如: ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码. ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直

如何防范SQL注入式攻击

一.什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击.常见的SQL注入式攻击过程类如:  ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码.  ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令

SQL注入式攻击

什么叫做SQL注入式攻击,如何防范 版权声明:本文为博主原创文章,未经博主允许不得转载.

asp.net LINQ防止SQL注入式攻击

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Configuration; public partial class _Default : System.Web.UI.Page { protected void Page_Load(objec

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

【JDBC】预编译SQL与防注入式攻击

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

SQL的注入式攻击方式和避免方法

SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询. SQL 注入的主要形式包括直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量.一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串.在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码. 注入过