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|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/// 
 39public 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#region 转换sql代码(也防止sql注入式攻击,可以用于业务逻辑层,但要求UI层输入数据时候进行解码)
 82/// 
 83/// 提取字符固定长度
 84/// 
 85/// 
 86/// 
 87/// 
 88public 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/// 
105public 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/// 
136public 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

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

浅谈 C# SQL防注入的更多相关文章

  1. SQL防注入程序 v1.0

    /// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...

  2. PHP之SQL防注入代码集合(建站常用)

    SQL防注入代码一 <?php if (!function_exists (quote)) { function quote($var) { if (strlen($var)) { $var=! ...

  3. sql 防注入 维基百科

    http://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A SQL攻击(SQL inj ...

  4. 浅谈.NET编译时注入(C#-->IL)

    原文:浅谈.NET编译时注入(C#-->IL) .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台.所以.NET语言的编译就分为了两部 ...

  5. 特殊字符的过滤方法,防sql防注入代码的过滤方法

    特殊字符的过滤方法 function strFilter($str){ //特殊字符的过滤方法 $str = str_replace('`', '', $str); $str = str_replac ...

  6. SQL防注入程序

    1.在Global.asax.cs中写入: protected void Application_BeginRequest(Object sender,EventArgs e){      SqlIn ...

  7. PHP SQL防注入

    过年前后在做一个抽奖的东西,需要用户填写中奖信息,为了防止非法用户对数据库进行入侵神马的,于是写下基本的防注入语句,需要用的可以自己封装成一个function. $str = str_replace( ...

  8. 360提供的SQL防注入

    <?php class sqlsafe { private $getfilter = "'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\ ...

  9. .net sql 防注入 httpmodule

    1 新建一个类,实现IHttpModule接口 using System; using System.Collections.Generic; using System.Linq; using Sys ...

随机推荐

  1. C#操作剪切板(Clipboard)

    剪切板是Windows系统提供的功能,从我最早接触到的Windows 3.2版本开始,就一直带着了.以前使用C++的时候,是直接使用Windows API对其进行操作的,到了.NET下,在WinFor ...

  2. WebDeploy to remote IIS

        参考 Web Platform Installer Direct Downloads

  3. 爬虫须知的HTTP协议

    HTTP请求: 1.HTTP请求主要分为"Get"和"Post"两种方法. 2.当我们在浏览器输入URL http://www.baidu.com 的时候, 浏 ...

  4. Oracle AWRDD报告生成和性能分析

    我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315 对于局部的,比如某个页面列表sql,我们可以使用Oracle的 ...

  5. JavaSSM框架报HTTP Status 500 - Servlet.init() for servlet springMvc threw exception错误

    如下,刚搭建的项目报这样的错,刚学框架的我一脸懵逼...网上很多说是jdk或者springmvc的的jar的版本问题,但是我其他项目都可以啊,所以排除了这个问题. 经过几个小时的排查,发现了我的问题所 ...

  6. 使用C#+XPath+HtmlAgilityPack轻松搞一个资源下载器

    HtmlAgilityPack简介 HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAg ...

  7. [翻译] GCC 内联汇编 HOWTO

    目录 GCC 内联汇编 HOWTO 原文链接与说明 1. 简介 1.1 版权许可 1.2 反馈校正 1.3 致谢 2. 概览 3. GCC 汇编语法 4. 基本内联 5. 扩展汇编 5.1 汇编程序模 ...

  8. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  9. 分享几个常见的CMD命令,可能会用的上

    win7快捷命令.CMD命令secpol.msc(设置开机启动提示信息)services.msc(打开服务)dxdiag(检查DirectX信息)winver(检查Windows版本)regedit( ...

  10. 对HTML5标签的认识(三)

    这篇随笔继续来认识HTML标签.这次随笔主要是对<table>标签的认识和最近我学习到的一些标签来和大家分享. 一.<table>标签 <table>标签的作用主要 ...