Ist dies ein ausreichender Weg, um Skriptinjektionen und andere schlechte Sachen in Strings zu verhindern

563
Colum

Reicht diese Funktion aus, um sämtlichen Schadcode und Fremdzeichen aus einer Zeichenfolge zu entfernen?

//Clean the string
$out = ltrim($do);
$out = rtrim($out);
$out = preg_replace('/[^(\x20-\x7F)]*/','', strip_tags($out)); 

Diese Daten gehen nicht in eine SQL-Datenbank ein, so dass ich mich nicht um SQL-Injektionsversuche kümmern muss. Gibt es eine Möglichkeit, meinen Code zu verbessern und effizienter zu gestalten?

Diese Funktion bereinigt alle vom Benutzer eingegebenen Daten (Formulare und?) Und speichert sie anschließend in einer Datenbank. Dies würde in einer globalen Desinfektionsfunktion verwendet werden.

Antworten
11
Wie benutzt du diese Zeichenfolge, dass du dir Sorgen machst, dass es ein Angriffsvektor ist? Woher kommt die Saite? Was erwarten Sie davon? Bitte fügen Sie das der Frage hinzu. Mark Loeser vor 10 Jahren 2
Der Kontext ist immer noch nicht klar von dem, was Sie zu injizieren versuchen. Mark Loeser vor 10 Jahren 6
$ out = preg_replace ('/ [^ (\ x20- \ x7F)] * /', '', strip_tags (rtrim (ltrim ($ do)))); ` Shoe vor 9 Jahren 0

2 Antworten auf die Frage

17
edorian

Das ist ziemlich einfach (für mich zumindest), da es eine sehr allgemeine Antwort gibt :)

NEIN

Es gibt keine Möglichkeit, die Benutzereingaben wirklich sicher zu "reparieren".

"Bitte geben Sie eine Liste mit allem, was Sie nicht mit einem Hammer tun sollten"

ist viel schwieriger als

msgstr "alle geeigneten Verwendungen eines Hammers auflisten".

Sie könnten einen oder zwei vergessen, aber es ist kein Schaden, wenn Sie zurückgehen und sie hinzufügen.

Es hört sich vielleicht hart an, aber etwas wird dich immer in Ruhe lassen, und wenn es nur EVAL(UNHEX(ASD23426363))oder so ähnlich ist. (Sql Beispiel, obwohl Sie es gesagt haben, nicht SQL, aber was auch immer).

Natürlich möchten Sie vielleicht sowieso Dinge aus der Eingabe für den HTML-Kontext entfernen, so dass eine Lücke in Ihrem anderen Code nicht so leicht ausgenutzt wird und weniger Schaden entsteht.


Jemand, der gesagt hat Filter Input, Escape Output, besser als ich könnte. Terry Chay


Kurz gesagt: Was auch immer Sie dort tun, finden Sie die entsprechende Escape-Funktion und verwenden Sie sie.

Shell-Kontext escapeshellarg

HTML-Kontext? htmlspecialchars

Datenbankkontext? Verwenden Sie vorbereitete Anweisungen und sorgen Sie sich nie wieder um die SQL-Injektion


Little edit: Ich weiß was ich gesagt habe und der Blogpost widerspricht ein wenig, aber das ist gut für mich. 'In der Praxis' wird immer von allgemeinen Ratschlägen abweichen und manchmal möchten Sie alles tun, was Sie können;)

8
ircmaxell

Ich mache eine Copy-Pasta von My Answer zu einer ähnlichen Frage zu SO :

Denken Sie immer daran, Filter In, Escape Out für alle vom Benutzer bereitgestellten (oder nicht vertrauenswürdigen) Eingaben.

Filtern Sie beim Lesen der vom Benutzer angegebenen Daten nach bekannten Werten. KEINE BLACKLIST! Immer immer immer immer Whitelist, was Sie erwarten. Wenn Sie eine Hexadezimalzahl erwar, bestätigen Sie mit einem regulären Ausdruck wie: ^[a-f0-9]+$. Finden Sie heraus, was Sie erwarten und filtern Sie danach. Hat keiner Ihrer Dateinamen etwas anderes als Alpha, Numerisch und .? Dann filtern Sie nach ^[a-z0-9.]+$. Aber fangen Sie nicht an, auf schwarzer Liste gegen Dinge zu denken. Es wird nicht funktionieren.

Bei Verwendung von Benutzerdaten sollten Sie diese für die Verwendung ordnungsgemäß entschlüsseln. Wenn es sich in einer Datenbank befindet, binden Sie es entweder als parametrisierte Abfrage oder mit der Escape-Funktion der Datenbank. Wenn Sie einen Shell - Befehl anrufen, entkommen sie mit escapeshellarg(). Wenn Sie es in einem RegexMuster verwenden, entkommen sie mit preg_quote(). Es gibt mehr als das, aber Sie haben die Idee.

Wenn Sie Anwenderdaten ausgeben, sollten Sie sie für das Format, in dem Sie sie ausgeben, als korrekt kennzeichnen. Wenn Sie es in HTML oder XML ausgeben, verwenden Sie htmlspecialchars(). Wenn Sie aus irgendeinem Grund in Raw-Headern ausgeben, entgehen Sie den Zeilenumbrüchen ( str_replace(array("\r", "\n"), array('\r', '\n'), $string)). Usw. usw.

Filtern Sie jedoch immer nach einer Whitelist und entkommen Sie immer mit der richtigen Methode für den Kontext. Ansonsten besteht eine erhebliche Chance, dass Sie etwas verpassen ...