- #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
Code de copie Notre solution est la suivante : 1. Premièrement, lors de l’entrée dans l’interface utilisateur, pour contrôler le type et la longueur des données afin d’éviter les attaques d’injection SQL, le système fournit une fonction pour détecter les attaques d’injection ; une fois l’attaque d’injection détectée, les données ne peuvent pas être soumises ; 2. Contrôle de la couche logique métier, en bloquant les mots-clés SQL d’une certaine manière à l’intérieur de la méthode, puis en vérifiant la longueur des données pour s’assurer qu’il n’y aura pas de code d’injection de base de données SQL lors de la soumission de SQL ; Cependant, après ce traitement, les caractères masqués sont restaurés lorsque l’interface utilisateur est en sortie. Par conséquent, le système fournit des fonctions pour protéger les personnages et des fonctions pour restaurer les personnages. 3. Dans la couche d’accès aux données, la plupart des données sont accédées par des procédures stockées, et les paramètres de la procédure stockée sont consultés lorsqu’ils sont appelés, ce qui empêche également les attaques d’injection.
|