浅谈 C# SQL防注入

时间:2025-02-24 22:05:20

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

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