GET- und POST-Daten sind Daten, die direkt vom Benutzer gesendet werden. Sie erhalten es roh, ohne Überprüfung oder Validierung zwischen dem Benutzer und Ihrem Programm. Selbst wenn Sie das Formular validieren, mit dem die Daten erstellt werden sollen, kann ein Angreifer manuell eine Anfrage mit den gewünschten Daten erstellen. Daher müssen Sie Anforderungsdaten immer als nicht vertrauenswürdige Benutzereingaben behandeln.
Es gibt eine Reihe von Angriffen, die darauf beruhen, dass der Coder vergessen hat, dass Anfragedaten nicht vertrauenswürdig sind, aber die bekannteste ist die SQL-Injektion. Die Hauptursache der SQL-Injection besteht im Erstellen einer Abfrage durch manuelle Verkettung von Zeichenfolgen, von denen einige nicht vertrauenswürdige Benutzereingaben sind. Dies bedeutet, dass Sie Ihrer Datenbank mitteilen, dass sie nicht vertrauenswürdige Benutzereingaben ausführen soll.
Die naive Lösung zur SQL-Injection besteht darin, die Eingaben zu validieren und sie dann in eine Abfragezeichenfolge zu verketten, aber dies ist auch eine schlechte Form. Sie verlassen sich auf Ihre Validierungslogik, um die Zeichenfolge sicher zu machen, und wenn Sie sie missbrauchen - oder die Logik ist fehlerhaft - dann sind Sie wieder Angriffen ausgesetzt.
Die richtige Lösung besteht darin, Ihre Abfrage von den darin enthaltenen Daten zu trennen. Praktisch alle Datenbankadapter unterstützen diesen Ansatz, und wenn dies aus irgendeinem Grund nicht der Fall ist, ist sie nicht für den Einsatz geeignet. Das gebräuchlichste Idiom ist (in keiner bestimmten Sprache):
myDB.query ("Wählen * aus Stuff wo id =?", [42]);
Dies garantiert (in einem solchen System), dass die Parameter nicht ausgeführt werden. Die Abfragezeichenfolge besteht aus vollständig vertrauenswürdigen Daten, während die nicht vertrauenswürdigen Daten getrennt sind.Im schlimmsten Fall kann dieser auf falsche Eingaben angewandte Ansatz zu falschen Daten und nicht zu einem falschen Befehl führen.
Dieser Ansatz zur Vermeidung von SQL-Injection hebt das zentrale Prinzip hervor, das für alle Arten von Anforderungsdatenangriffen gilt: Die Anforderungsdaten gehören nicht Ihnen und sind nicht sicher. Gehen Sie bei der Verarbeitung von Benutzereingaben, einschließlich Anfragedaten, immer davon aus, dass sie von einem Angreifer stammen, der Ihr System genau kennt. Es mag paranoid wirken, aber es hält dich sicher.
Die allgemeine Regel lautet "traue den Benutzereingaben nicht". Alles, was vom Benutzer in irgendeiner Form kommt, muss einer Sicherheitsüberprüfung unterzogen werden. – Jess