- #region 防止sql注入式攻击(可用于UI层控制)
-
- ///
- /// 判断字符串中是否有SQL攻击代码
- ///
- /// 传入用户提交数据
- /// true-安全;false-有注入攻击现有;
- public bool ProcessSqlStr( string inputString)
- {
- 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 " ;
- try
- {
- if ((inputString != null ) && (inputString != String.Empty))
- {
- string str_Regex = @" \b( " + SqlStr + @" )\b " ;
-
- Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
- // string s = Regex.Match(inputString).Value;
- if ( true == Regex.IsMatch(inputString))
- return false ;
-
- }
- }
- catch
- {
- return false ;
- }
- return true ;
- }
- ///
- /// 处理用户提交的请求,校验sql注入式攻击,在页面装置时候运行
- /// System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString(); 为用户自定义错误页面提示地址,
- /// 在Web.Config文件时里面添加一个 ErrorPage 即可
- ///
- ///
- ///
- public void ProcessRequest()
- {
- try
- {
- string getkeys = "" ;
- string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings[ " ErrorPage " ].ToString();
- 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;
- if ( ! ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
- {
- System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + " ?errmsg= " + getkeys + " 有SQL攻击嫌疑! " );
- 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;
- if ( ! ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
- {
- System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + " ?errmsg= " + getkeys + " 有SQL攻击嫌疑! " );
- System.Web.HttpContext.Current.Response.End();
- }
- }
- }
- }
- catch
- {
- // 错误处理: 处理用户提交信息!
- }
- }
- #endregion
Kopioi koodi Ratkaisumme on: 1. Ensinnäkin, kun käyttöliittymään siirretään, järjestelmä tarjoaa toiminnon injektiohyökkäysten havaitsemiseksi; kun injektiohyökkäys on havaittu, dataa ei voida lähettää; 2. Liiketoimintalogiikan kerroksen hallinta, estämällä SQL-avainsanat tietyllä tavalla metodin sisällä ja tarkistamalla sitten datan pituus varmistaakseen, ettei SQL:n lähetyksessä ole SQL-tietokannan injektiointihyökkäyskoodia; Kuitenkin tämän käsittelyn jälkeen naamioidut merkit palautuvat, kun käyttöliittymä käynnistyy. Siksi järjestelmä tarjoaa toimintoja merkkien suojaamiseen ja toimintoja merkkien palauttamiseen. 3. Datan käyttökerroksessa suurin osa datasta pääsee käsiksi tallennettujen proseduurien kautta, ja tallennetut proseduuriparametrit saadaan käyttöön, kun niitä kutsutaan, mikä myös estää injektiohyökkäykset.
|