Maison >développement back-end >Tutoriel C#.Net >Classe de filtre ASP.NET SqlFilter pour empêcher l'injection SQL

Classe de filtre ASP.NET SqlFilter pour empêcher l'injection SQL

高洛峰
高洛峰original
2017-01-21 15:16:352546parcourir

Qu'est-ce que l'injection SQL ?

Ce que je comprends par injection SQL, c'est que certaines personnes peuvent saisir des paramètres malveillants pour laisser l'arrière-plan exécuter ce SQL, puis atteindre l'objectif d'obtenir des données ou de détruire la base de données !
Pour donner un exemple de requête simple, le SQL d'arrière-plan est épissé : sélectionnez * from Test où name='parameter transfer' ; la page d'accueil nécessite de saisir le nom, puis le pirate peut saisir : ';DROP TABLE Test;-- Don Ne sous-estimez pas cela Un morceau de code SQL :
select * from Testwhere name=' ';DROP TABLE Test;--'; est correct et exécutable en SQL, mais après exécution, la table Test entière est supprimée et le le site plante!

La meilleure solution

La meilleure solution n'est pas d'écrire du SQL d'épissage, mais d'utiliser du SQL paramétré à la place, ce qui est recommandé pour les nouveaux projets. Il n'y a pas d'introduction ici. Les amis intéressés peuvent le rechercher par eux-mêmes. La méthode présentée dans cet article convient aux anciens projets, c'est-à-dire qu'il n'existe aucun programme développé en utilisant SQL paramétré.

Utilisez la fonction de filtre pour filtrer

certains mots-clés SQL dangereux, ainsi que les signes de pourcentage et les points-virgules de commentaires, qui sont des caractères qui n'apparaissent pas du tout lorsque nous écrivons du code normalement. , afin de garantir que l'exécution de SQL est la plus sûre possible. Le code est le suivant :

public class SqlFilter
{
  public static void Filter()
  {
    string fileter_sql = "execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--";
    try
    {
      // -----------------------防 Post 注入-----------------------
      if (HttpContext.Current.Request.Form != null)
      {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        //把 Form 属性改为可读写
        isreadonly.SetValue(HttpContext.Current.Request.Form, false, null);
 
        for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++)
        {
          string getsqlkey = HttpContext.Current.Request.Form.Keys[k];
          string sqlstr = HttpContext.Current.Request.Form[getsqlkey];
          string[] replace_sqls = fileter_sql.Split(&#39;,&#39;);
          foreach (string replace_sql in replace_sqls)
          {
            sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
          }
          HttpContext.Current.Request.Form[getsqlkey] = sqlstr;
        }
      }
 
 
      // -----------------------防 GET 注入-----------------------
      if (HttpContext.Current.Request.QueryString != null)
      {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        //把 QueryString 属性改为可读写
        isreadonly.SetValue(HttpContext.Current.Request.QueryString, false, null);
 
        for (int k = 0; k < System.Web.HttpContext.Current.Request.QueryString.Count; k++)
        {
          string getsqlkey = HttpContext.Current.Request.QueryString.Keys[k];
          string sqlstr = HttpContext.Current.Request.QueryString[getsqlkey];
          string[] replace_sqls = fileter_sql.Split(&#39;,&#39;);
          foreach (string replace_sql in replace_sqls)
          {
            sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
          }
          HttpContext.Current.Request.QueryString[getsqlkey] = sqlstr;
        }
      }
 
 
      // -----------------------防 Cookies 注入-----------------------
      if (HttpContext.Current.Request.Cookies != null)
      {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        //把 Cookies 属性改为可读写
        isreadonly.SetValue(HttpContext.Current.Request.Cookies, false, null);
 
        for (int k = 0; k < System.Web.HttpContext.Current.Request.Cookies.Count; k++)
        {
          string getsqlkey = HttpContext.Current.Request.Cookies.Keys[k];
          string sqlstr = HttpContext.Current.Request.Cookies[getsqlkey].Value;
          string[] replace_sqls = fileter_sql.Split(&#39;,&#39;);
          foreach (string replace_sql in replace_sqls)
          {
            sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
          }
          HttpContext.Current.Request.Cookies[getsqlkey].Value = sqlstr;
        }
      }
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
 
  }
 
}

Pour plus de classe de filtrage ASP.NET SqlFilter afin d'empêcher l'injection SQL, veuillez faire attention au chinois PHP. site Web pour des articles connexes!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn