Was ist eine gute Funktion, um eine Zeichenfolge für die Aufnahme in eine SQL-Abfrage sicher zu machen? Zum Beispiel müssten Apostrophe festgelegt werden, und es gibt zweifellos andere Probleme, die ebenfalls auftreten können. Ich würde gerne eine Funktion haben, die felsenfest ist und mit jedem möglichen Input funktionieren würde, den ein Übeltäter entwickeln könnte.
Nun, bevor die Massen mich anweisen, Abfrageparameter zu verwenden und / oder diese Frage zu schließen, bedenken Sie folgende Punkte:
Ich habe Probleme, eine Bibliothek eines Drittanbieters mit einer schlecht gestalteten API zu verwenden. Die API soll wie folgt aufgerufen werden:
%Vor%Jetzt stimme ich Ihnen zu 100% zu, dass dies keine gute API ist, da es (1) dem Benutzer interne Datenbankfeldnamen zur Verfügung stellt, die Implementierungsdetails sind, (2) keine Möglichkeit bietet, Parameter zu verwenden, die dieses Problem vermeiden würden an erster Stelle, (3) könnte man wirklich sagen, dass SQL selbst ein Implementierungsdetail ist und nicht offengelegt werden sollte. Aber ich bin dabei, diese API zu verwenden, weil sie in eines der führenden Systeme ihrer Branche integriert werden muss. Wir sind nicht wirklich in der Position, sie zu bitten, ihre API zu ändern.
Ich habe diese Site nach anderen Fragen zu diesem Thema durchsucht, aber festgestellt, dass die Antworten stark auf parametrisierte Abfragen hindeuten. Antworten, die vorschlugen, eine Funktion zu schreiben, um die Zeichenkette zu bereinigen, wurden oft abgelehnt, nicht gut durchdacht usw. - ich bin mir nicht sicher, ob ich ihnen vertraue.
Ich suche nur nach Strings und nicht nach anderen Datentypen wie Zahlen, Datumsangaben usw. Auch hier bin ich mir zu 100% der Vorteile parametrisierter Abfragen bewusst, und ich wünschte, ich könnte sie verwenden, aber ich kann nicht weil meine Hände an diese gebunden sind.
Ich muss eine ähnliche API in einer unserer Anwendungen verwenden. Hier ist die Validierungsroutine, die ich benutze, um SQL Injection manuell zu umgehen:
%Vor%Ich habe noch mehr gegraben und diese "Brute-Force" -Lösung gefunden, die zu funktionieren scheint. Wie können Sie Zeichenfolgen in SQL Server mithilfe von PHP umgehen?
Senden Sie die Zeichenfolge im Grunde nur als Hexadezimalzeichen anstelle einer Zeichenfolge. Zum Beispiel, anstatt zu senden:
%Vor%sende das:
%Vor% Wenn die Zeichenfolge leer ist, sende ich als Sonderfall ''
Das scheint vernünftig sicher zu sein; Ich kann mir keinen Angriff vorstellen, der funktionieren würde.
Achten Sie im Allgemeinen auf diese Lösung, da sie möglicherweise nicht mit Nicht-ANSI-Zeichen funktioniert. Allerdings habe ich festgestellt, dass die Spalte, gegen die ich vergleiche, "varchar" und nicht "nvarchar" ist, also war Unicode offensichtlich nicht wirklich auf der Tagesordnung, als sie ihre Datenbank entwarfen. Ich würde raten, wenn es "nvarchar" wäre, müsste ich eine UTF-16-Zeichenfolge (oder was auch immer Unicode-Codierung mit Nvarchar verwendet wird) senden.
Angenommen, Sie erwarten nur einfachen Text (für einen guten Datensatz) und wenn Sie davon ausgehen können, dass Sie nur normale Zeichen (dh Tastaturzeichen) erhalten, können Sie Ihre Eingabe in ASCII konvertieren Beschränken Sie es auf die gewünschten Zeichen (indem Sie eine Liste zulässiger Zeichen angeben und danach filtern) und stellen Sie außerdem sicher, dass die Zeichenfolgenlänge angemessen ist.
Erstellen Sie dann eine neue Zeichenfolge mit nur Ihren zulässigen Zeichen, und übergeben Sie diese Zeichenfolge. Sobald Sie dort sind, ist die einfache Anführungszeichen definitiv Ihre einzige Sorge.
Wenn Sie diese Anforderungen erfüllen können, sollte dies für Sie funktionieren. Es würde keine Möglichkeit geben, funky Unicode-Zeichen zu injizieren oder den SQL-Puffer zu überlaufen, oder irgendwelche anderen verrückten Dinge zu tun, die Leute tun, um Probleme zu verursachen - Sie würden die Charaktere, die in die Abfrage eingehen, hundertprozentig kontrollieren.