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. java的poi技术读取和导入Excel实例

    本篇文章主要介绍了java的poi技术读取和导入Excel实例,报表输出是Java应用开发中经常涉及的内容,有需要的可以了解一下. 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用 ...

  2. 搭建微服务器:express+https+api代理

    概述 最近打算玩一下service worker,但是service worker只能在https下跑,所以查资料自己用纯express搭建了一个微服务器,把过程记录下来,供以后开发时参考,相信对其他 ...

  3. Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!

    前段时间分享了<阅读跟踪 Java 源码的几个小技巧>是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧. 所以,为了满足众多 IDEA 粉丝的要求,栈长我 ...

  4. ASP.NET Core Web API 集成测试中使用 Bearer Token

    在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, ...

  5. js数组去重常用方法

    js数组去重是面试中经常会碰到的问题,无论是前端还是node.js数组常见的有两种形式,一种是数组各元素均为基本数据类型,常见的为数组字符串格式,形如['a','b','c'];一种是数组各元素不定, ...

  6. 秋招已过,各大厂的面试题分享一波 附C++实现

    数据结构和算法是面试的一座大山,尤其去面试大厂更是必不可少!简单说明一下为啥喜欢考数据结构和算法,首先,算法有用也没用,如果是中小型企业的简单业务逻辑,可能用不到啥算法,但大厂一定会用到,都知道数据库 ...

  7. cocos creator主程入门教程(十一)—— 有限状态机和行为树

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 本篇介绍有限状态机和行为树.有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个 ...

  8. Less与TypeScript的简单理解与应用,并使用WebPack打包静态页面

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 创建空项目 使用Less 使用TypeScript 使用WebPack 开始写项目 总 ...

  9. nginx系列13:最少连接算法以及如何跨worker进程生效

    最少连接算法 使用最少连接算法可以使得nginx优先选择连接最少的上游服务器,需要用到upstream_least_conn模块. 如何跨worker进程生效 因为nginx是多进程结构的,默认多个w ...

  10. CDN的简单理解

    百度百科上的解释:CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调 ...