日期:2014-05-18  浏览次数:20560 次

求一个过滤sql特殊字符,防止sql注击的方法
由于以前的大量的使用了拼接sql语句,要一个一个改成传参数的形式,时间不允许

想过滤掉特殊字符,防止sql注击

------解决方案--------------------
//获得关键子
public int CheckKey(string Content)
{
int n = -1;
string str = "'|&quot|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|''|--|;|;|or";
String[] Array = str.Split('|');
foreach (string item in Array)
{
int index = Content.IndexOf(item);
if (index != -1)
{
n = index;
break;
}

}
return n;

}

Content是你的有参数的url,如果返回的不是-1就说明有sql攻击的关键字
楼主研究下
------解决方案--------------------
up
------解决方案--------------------
将以下代码放入Global.asax中,
然后在 Application_BeginRequest 里面添加调用 StartProcessRequest();


C# code

#region SQL注入式攻击代码分析 
        ///  <summary> 
        /// 处理用户提交的请求 
        ///  </summary> 
        private void StartProcessRequest() 
        { 
            try 
            { 
                string getkeys = ""; 
                string sqlErrorPage = "/index.aspx";//转向的错误提示页面 
                if (System.Web.HttpContext.Current.Request.QueryString != null) 
                { 

                    for (int i = 0; i  < System.Web.HttpContext.Current.Request.QueryString.Count; i++) 
                    { 
                        getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i]; 
                        if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys])) 
                        { 
                    
                            System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); 
                            System.Web.HttpContext.Current.Response.End(); 
                        } 
                    } 
                } 
                if (System.Web.HttpContext.Current.Request.Form != null) 
                { 
                    for (int i = 0; i  < System.Web.HttpContext.Current.Request.Form.Count; i++) 
                    { 
                        getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i]; 
                        if (getkeys == "__VIEWSTATE") continue; 
                        if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys])) 
                        { 
                            System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); 
                            System.Web.HttpContext.Current.Response.End(); 
                        } 
                    } 
                } 
            } 
            catch 
            { 
                // 错误处理: 处理用户提交信息! 
            } 
        } 
        ///  <summary> 
        /// 分析用户请求是否正常 
        ///  </summary> 
        ///  <param name="Str">传入用户提交数据 </param> 
        ///  <returns>返回是否含有SQL注入式攻击代码 </returns> 
        private bool ProcessSqlStr(string Str) 
        { 
            bool ReturnValue = true; 
            try 
            { 
                if (Str.Trim() != "") 
                { 
                    string SqlStr = "exec |insert |select |delete |update |count |* |mid |master |truncate |char |declare"; 

                    string[] anySqlStr = SqlStr.Split('|'); 
                    foreach (string ss in anySqlStr) 
                    { 
                        if (Str.ToLower().IndexOf(ss.Trim()) >= 0) 
                        {
                            ReturnValue = false; 
                            break; 
                        } 
                    } 
                } 
            }