Ich habe einen Code, der parametrisierte Abfragen verwendet, um eine Injektion zu verhindern, aber ich muss auch in der Lage sein, die Abfrage unabhängig von der Struktur der Tabelle dynamisch zu erstellen. Was ist der richtige Weg, dies zu tun?
Hier ist ein Beispiel, sagen wir, ich habe eine Tabelle mit Spalten Name, Adresse, Telefon. Ich habe eine Webseite, auf der ich Spalten anzeigen ausführe und ein Auswahldrop mit ihnen als Optionen befülle.
Als nächstes habe ich ein Textfeld namens Suche . Dieses Textfeld wird als Parameter verwendet.
Momentan sieht mein Code ungefähr so aus:
%Vor%Ich bekomme aber ein ekliges Gefühl davon. Ich verwende parametrisierte Abfragen, um die Verwendung von escape zu vermeiden. Außerdem ist escape wahrscheinlich nicht dafür gedacht, Spaltennamen zu umgehen.
Wie kann ich sicherstellen, dass dies so funktioniert, wie ich es vorschlage?
Bearbeiten: Der Grund, warum ich dynamische Abfragen benötige, ist, dass das Schema vom Benutzer konfigurierbar ist und ich nicht in der Lage sein werde, etwas Festes zu reparieren.
Anstatt die Spaltennamen zu übergeben, übergeben Sie einfach einen Bezeichner, den Sie mithilfe einer hartcodierten Tabelle in einen Spaltennamen übersetzen. Das bedeutet, dass Sie sich keine Gedanken darüber machen müssen, ob bösartige Daten weitergegeben werden, da alle Daten entweder juristisch übersetzt oder für ungültig erklärt wurden. Psudischer Code:
%Vor%Der Trick besteht darin, sich auf Ihre Routinen zur Flucht und Validierung zu verlassen. Ich benutze meine eigene SQL Escape-Funktion, die für Literale verschiedener Typen überladen ist. Nirgends füge ich Ausdrücke (im Gegensatz zu zitierten Literalwerten) direkt aus Benutzereingaben ein.
Trotzdem kann es gemacht werden, ich empfehle eine separate - und strikte - Funktion für die Validierung des Spaltennamens. Erlaube es nur einen einzigen Bezeichner zu akzeptieren, etwa
%Vor%Sie müssen sich auf Annahmen verlassen, die Sie über Ihre eigenen Spaltennamen machen können.
Ich verwende ADO.NET und die Verwendung von SQL-Befehlen und SQL-Parametern zu den Befehlen, die sich um das Escape-Problem kümmern. Wenn Sie sich also in einer Microsoft-Tool-Umgebung befinden, kann ich sagen, dass ich dies sehr erfolgreich zum Erstellen von dynamischem SQL und zum Schutz meiner Parameter verwende.
viel Glück
Machen Sie die Spalte basierend auf den Ergebnissen einer anderen Abfrage zu einer Tabelle, die die möglichen Schemawerte auflistet. In dieser zweiten Abfrage können Sie die Auswahl fest mit dem Spaltennamen codieren, der zum Definieren des Schemas verwendet wird. Wenn keine Zeilen zurückgegeben werden, ist die eingegebene Spalte ungültig.
In Standard-SQL fügen Sie getrennte Bezeichner in doppelte Anführungszeichen ein. Das bedeutet:
%Vor%wählt aus einer Tabelle namens SomeTable mit der angegebenen Groß- / Kleinschreibung (keine vom Großrechner konvertierte Version des Namens) und wendet eine Bedingung auf eine Spalte namens SomeColumn mit der angegebenen Groß- / Kleinschreibung an.
An sich ist das nicht sehr hilfreich, aber ... wenn Sie die Methode escape () mit doppelten Anführungszeichen auf die Namen anwenden können, die Sie über Ihr Webformular eingegeben haben, können Sie Ihre Abfrage relativ sicher aufbauen.
Natürlich sagten Sie, Sie wollten die Verwendung von Escape vermeiden - und Sie müssen es nicht für die Parameter verwenden, für die Sie die Option bereitstellen. Platzhalter. Wenn Sie jedoch von Benutzern bereitgestellte Daten in die Abfrage einfügen, müssen Sie sich vor bösartigen Personen schützen.
Unterschiedliche DBMS haben unterschiedliche Möglichkeiten, begrenzte Identifier bereitzustellen. MS SQL Server zum Beispiel scheint eckige Klammern [SomeTable] anstelle von Anführungszeichen zu verwenden.
Spaltennamen in einigen Datenbanken können Leerzeichen enthalten, was bedeutet, dass Sie den Spaltennamen angeben müssen. Wenn Ihre Datenbank jedoch keine solchen Spalten enthält, führen Sie einfach den Spaltennamen über einen regulären Ausdruck oder eine Art von Überprüfung aus, bevor Sie sie einfügen das SQL:
%Vor%Tags und Links parameterized sql-injection