Frage

Ich muss SQL-Injection in meinem ASP.NET-Anwendung ist anfällig zu vermeiden. Wie könnte ich das erreichen?

War es hilfreich?

Lösung

Auch wenn Ihre Frage sehr allgemein gehalten ist, gelten einige Regeln immer:

  • Verwenden Sie parametrisierte Abfragen (SqlCommand mit SqlParameter) und Benutzereingaben in die Parameter setzen.
  • Sie nicht SQL-Strings aus nicht markiert Benutzereingaben erstellen.
  • Gehen Sie nicht davon Sie eine Hygienisierung Routine bauen können, die für jede Art von malformedness Benutzereingaben überprüfen können. Grenzfälle sind leicht vergessen. numerische Eingabe prüft einfach genug sein können Sie auf der sicheren Seite zu bekommen, aber für String-Eingang nur verwenden Parameter.
  • Überprüfen Sie für Second-Level-Sicherheitslücken -. Keine SQL-Query-Strings aus SQL-Tabelle Werte bauen, wenn diese Werte von Benutzereingaben bestehen
  • Verwenden Sie gespeicherte Prozeduren Datenbankoperationen verkapseln.

Andere Tipps

Verwenden Sie Prepared Statements (Link auf eine ASP.NET Tutorial, die vorbereiteten Anweisungen in den ‚hinzufügen Knoten für Produkte‘ Abschnitt verwendet). das ist alles dazu.

Nun, das oder ein ORM verwenden, wie Linq to SQL oder NHibernate , sie intern verwenden vorbereitete Anweisungen.

Mit Parametern! Es ist wirklich so einfach: -)

Erstellen Sie Ihre Abfragen wie folgt (für MS SQL Server mit C #):

SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn); 

Hier @Name ist der Parameter, wo Sie SQL-Injection vermeiden wollen und conn ist ein SqlConnection-Objekt. Dann den Parameterwert hinzuzufügen, die Sie wie folgt vor:

getPersons.Parameters.AddWithValue("@Name", theName);

Hier theName ist eine Variable, die den Namen enthält, die Sie für die Suche sind.

Nun sollte es unmöglich sein, auf dieser Abfrage alle SQL-Injektionen zu tun.

Da es so einfach ist, gibt es keinen Grund, nicht Parameter zu verwenden.

Traue niemals Benutzereingaben - Überprüfen Sie alle Texteinträge mit Überprüfungs-Steuerelemente, reguläre Ausdrücke, Code, und so weiter

Verwenden Sie dynamische SQL - Verwenden Sie parametrisierte SQL oder gespeicherte Prozeduren

Schließen Sie niemals in eine Datenbank ein Admin-Level-Konto - Verwenden Sie einen begrenzten Zugriffskonto in der Datenbank verbinden

Speichern Sie keine Geheimnisse im Klartext - Verschlüsseln oder Hash-Passwörter und andere sensible Daten; Sie sollten auch Verbindungszeichenfolgen

verschlüsseln

Ausnahmen sollten ein Mindestmaß an Informationen preisgeben - nicht zu viele Informationen in Fehlermeldungen zeigen; verwenden Custom im Fall nicht verarbeiteter Fehler minimal Informationen angezeigt werden; set debug auf false

Nützlicher Link auf MSDN Stopp SQL Injection

SQL-Injection tritt auf, weil die Abfrage an die Datenbank in Echtzeit aufgebaut werden, zum Beispiel:

SELECT * From Table1 WHERE " + UserInput

UserInput möglicherweise schädlich sind und andere Anweisungen enthalten, dass Sie nicht beabsichtigen.

Um es zu vermeiden, müssen Sie zusammen verketten Ihre Abfrage zu vermeiden.

Sie können dies erreichen, indem parametrisierte Abfragen mit - besuchen Sie das DBCommand Objekt für Ihre DB Geschmack

.

Verwenden Sie parametrisierte Abfragen und / oder gespeicherte Prozeduren und Ihre Parameter über SQL-Parameter analysieren. Nie SQL-Code generieren, indem Strings verketten. Auch tun einige über SQL-Injection zu lesen und zu sicheren Code zu schreiben, weil verhindert Injektion SQL nur ein kleiner Teil der Sicherheit ist. Es gibt viele mehr (wie XSS - Cross Site Scripting). Wenn ein Hacker Ihre Website / Anwendung kompromittieren will er für mehr als nur SQL-Injection aussehen wird.

Scott Guthrie geschrieben vor einiger Zeit ein ordentliches kleines Artikel darüber. Darin bietet er 5 Vorschläge für den Schutz von sich selbst:

  
      
  1. Sie bauen nicht dynamische SQL-Anweisungen ohne einen typsichere Parameter Codierung Mechanismus. [...]

  2.   
  3. Immer eine Sicherheitsüberprüfung Ihrer Anwendung durchführt, bevor es jemals in Betrieb genommen, und einen formellen Sicherheitsprozess etabliert gesamten Code zu jeder Zeit Sie Aktualisierungen vornehmen zu überprüfen. [... ]

  4.   
  5. Speichern Sie niemals sensible Daten im Klartext in einer Datenbank. [...]

  6.   
  7. Stellen Sie sicher, Sie Automation Unit-Tests schreiben, die speziell auf Ihre Datenzugriffsschicht und Anwendung gegen SQL-Injection-Angriffe überprüfen. [...]

  8.   
  9. Sperren Sie Ihre Datenbank nur die Web-Anwendung gewähren sie den minimalen Satz von Berechtigungen zugreifen, dass es funktionieren muss. [...]

  10.   

Er macht einen anständigen Job zu erklären, Warum diese sind wichtig, und Links zu verschiedenen anderen Ressourcen als auch ...

Traue niemals Benutzereingaben validieren es immer, und SQL-Parameter verwenden. Sollte genug sein, um Basis SQL-Injection zu verhindern.

Wir hoffen, dies wird dazu beitragen:

http: //www.codersbarn .com / Post / 2008/11/01 / ASPNET-Data-Input-Validation.aspx

Die kurze Antwort ist parametrisierte Abfragen zu verwenden.

Anthony :-) www.codersbarn.com

Verwenden Sie immer nur parametrisierte Abfragen.

Wie schon andere gesagt haben, keine verketten nicht Benutzereingaben dynamische SQL-Anweisungen zu erzeugen; immer parametrisierte SQL verwenden, wenn dynamische SQL. Allerdings Ich möchte darauf wird, dass diese Regel gilt auch, wenn innerhalb einer gespeicherten proc dynamischen SQL-Erstellung . Diese Tatsache ist etwas, das Menschen oft übersehen. Sie denken, sie sicher sind, weil sie „mit gespeicherten Prozeduren.“

Das Buch "Erstellen sichere ASP.NET-Anwendungen" Richtlinie hat ein Abschnitt zu diesem Thema.

Verwenden XSS Gesicherte UrlEncode mit Microsoft.Security.Application.AntiXss.UrlEncode und SQL-Injection wird nicht funktionieren. Oder Sie können ASP.NET verwenden - JSON - Serialisierung und Deserialisierung

Auch testen Sie Ihre Anwendung mit SiteDigger von Macfee Fre Werkzeug.

Ein paar mehr sind von hier

.NET Security Toolkit v1.0 .NETMon v1.0 Validator.NET v1.0

Jeder sagt, "Use-Parameter". Wir hätten es weniger zu sagen, wenn es nicht so ist pervers schwierig.

Verwenden Sie QueryFirst . Die Versuchung zu verketten wird entfernt, und der richtige Weg, wird der einfachste Weg. Sie erstellen einen Parameter nur durch @myParam in der SQL-Eingabe, das Tool erledigt den Rest.

Disclaimer: Ich schrieb QueryFirst

verstehen, was genau SQL Injection ist und dann nie etwas schreiben, die sie verwundbar ist.

Versuchen Stored Procedures zu verwenden, und bestätigen Sie die Eingabe Ihrer Daten. Verwenden Sie keine direkte SQL wie INSERT INTO ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top