Heim  >  Artikel  >  Backend-Entwicklung  >  ASP.NET-Filterklasse SqlFilter zur Verhinderung der SQL-Injection

ASP.NET-Filterklasse SqlFilter zur Verhinderung der SQL-Injection

高洛峰
高洛峰Original
2017-01-21 15:16:352439Durchsuche

Was ist SQL-Injection?

Was ich unter SQL-Injection verstehe, ist, dass einige Leute bösartige Parameter eingeben können, damit der Hintergrund dieses SQL ausführt, und dann den Zweck erreichen, Daten abzurufen oder die Datenbank zu zerstören!
Um ein einfaches Abfragebeispiel zu geben, wird die Hintergrund-SQL gespleißt: select * from Test where name='+parameter transfer+'; die Front-End-Seite erfordert die Eingabe eines Namens, dann kann der Hacker Folgendes eingeben: ';DROP TABLE Test; - Schauen Sie nicht auf diesen SQL-Code herab:
select * from Test where name=' ';DROP TABLE Test;--' es ist korrekt und in SQL ausführbar, aber nach der Ausführung ist der gesamte Test Tabelle wird gelöscht und die Website stürzt ab!

Die beste Lösung

Die beste Lösung besteht darin, nicht Splicing-SQL zu schreiben, sondern stattdessen parametrisiertes SQL zu verwenden, was für neue Projekte empfohlen wird. Hier gibt es keine Einführung. Interessierte Freunde können selbst danach suchen. Die in diesem Artikel vorgestellte Methode eignet sich für alte Projekte, das heißt, es gibt keine Programme, die mit parametrisiertem SQL entwickelt wurden.

Verwenden Sie die Filterfunktion, um

einige gefährliche SQL-Schlüsselwörter sowie Kommentar-Prozentzeichen und Semikolons herauszufiltern, bei denen es sich um Zeichen handelt, die beim normalen Schreiben von Code überhaupt nicht vorkommen Um sicherzustellen, dass die SQL-Ausführung weitestgehend sicher ist, lautet der Code wie folgt:

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);
    }
 
  }
 
}

Für weitere ASP.NET-Filterklassen zur Verhinderung von SQL-Injection achten Sie bitte auf PHP-Chinesisch Website für verwandte Artikel!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn