- #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
Αντιγραφή κώδικα Η λύση μας είναι: 1. Πρώτον, κατά την εισαγωγή στη διεπαφή χρήστη, για τον έλεγχο του τύπου και του μήκους των δεδομένων για την αποφυγή επιθέσεων έγχυσης SQL, το σύστημα παρέχει μια λειτουργία για τον εντοπισμό επιθέσεων έγχυσης, μόλις εντοπιστεί η επίθεση έγχυσης, τα δεδομένα δεν μπορούν να υποβληθούν. 2. Έλεγχος επιπέδου επιχειρηματικής λογικής, αποκλείοντας τις λέξεις-κλειδιά SQL με συγκεκριμένο τρόπο μέσα στη μέθοδο και, στη συνέχεια, ελέγχοντας το μήκος των δεδομένων για να διασφαλιστεί ότι δεν θα υπάρχει κώδικας επίθεσης έγχυσης βάσης δεδομένων SQL κατά την υποβολή SQL. Ωστόσο, μετά από αυτήν την επεξεργασία, οι καλυμμένοι χαρακτήρες αποκαθίστανται κατά την έξοδο του περιβάλλοντος εργασίας χρήστη. Επομένως, το σύστημα παρέχει λειτουργίες για την προστασία χαρακτήρων και λειτουργίες για την επαναφορά χαρακτήρων. 3. Στο επίπεδο πρόσβασης δεδομένων, τα περισσότερα από τα δεδομένα είναι προσβάσιμα από αποθηκευμένες διαδικασίες και οι αποθηκευμένες παράμετροι διαδικασίας είναι προσβάσιμες όταν καλούνται, γεγονός που θα αποτρέψει επίσης τις επιθέσεις έγχυσης.
|