Frage von RaceShafter, 58

Wie prüfe ich in PHP einen String auf Sonderzeichen?

Ich möchte SQL Injektion verhindern, in dem ich schlichtweg einfach keine Sonderzeichen erlaube. Aber wie prüft man einen String auf Sonderzeichen?

Antwort
von Suboptimierer, 22

Es gibt fertige Funktionen zum entwerten von SQL-Sonderzeichen in PHP.

Um Datenbank-Parameter zu maskieren, sollte aus Sicherheitsgründen eine datenbankspezifische Escapefunktion zu verwenden (z.B. mysqli_real_escape_string() für MySQL oder pg_escape_literal(),pg_escape_string() für PostgreSQL). DBMSe haben unterschiedliche Maskierungsspezifikationen für Bezeichner (z.B. Tabellennamen, Feldnamen) und Parameter. Manche DBMSe wie PostgreSQL bieten eine Funktion zum Maskieren von Bezeichnern, pg_escape_identifier()...



Quelle: http://php.net/manual/de/function.addslashes.php

Antwort
von TeeTier, 17

Neben den bisherigen Antworten noch zwei kleine HInweise:

  1. Für so etwas nimmt man sog. "Prepared Statements". Das ist erstens deutlich effizienter, und man hat keine Probleme mehr mit Escaping.
  2. Achte bitte auch auf mögliches XSS, also dass deine Strings nicht nur schädlich für SQL sind, sondern evtl. am Ende auch in HTML oder JavaScript landen.

Beide Punkte werden gerade von Einsteigern oft stiefmütterlich behandelt.

Viel Erfolg! ;)

Kommentar von RaceShafter ,

Zum Zweiten, was ist damit gemeint? Als Sicherung für die Datenbank habe ich nun MySQLi_Real_Escape_String genommen. JavaScript verwende ich nicht und was ist mit HTML? Was muss ich da beachten und/oder beheben/sichern?

Kommentar von TeeTier ,

Google mal nach "Prepared Statements PHP" ... dort findest du genügend Antworten. :)

Und zum Thema HTML: Wenn dein Datensatz jetzt so in die Seite Eingebaut wird:

<tag attr="<?php echo $foo; ?>">

... und der Inhalt von $foo aus einer Usereingabe stammt (bei der egal ist, ob sie in einer DB zwischen gespeichert wird, oder nicht), die wie folgt aussieht:

x" style="background:url(http://x/count.php)" y="z

... dann erhältst du im Endeffekt:

<tag attr="x" style="..." y="z">

... anstatt ...

<tag attr="value">

... und der Angreifer hat somit eine Art Counter in deine Website eingebaut, mit der er z. B. sehen kann, wie viele Besucher du hast.

Anstatt "style" könnte man auch "onload" nehmen, und dann JavaScript ausführen, und damit Besucher weiterleiten oder über Browserbugs mit Trojanern infizieren. Das ist alles gängige Praxis und kommt täglich in genau dieser Form vor.

Am besten such bei Google noch mal nach "XSS" oder "Defacing". Dort findest du genügend Beispiele.

Es kommt also immer darauf an, welche Zeichen du escapest, da die ja je nach Sprache eine andere Bedeutung haben. Wenn du natürlich grundsätzlich ALLE Sonderzeichen filterst, dann besteht auch kaum eine Gefahr. Aber oftmals kann man nicht alles filtern.

Naja, viel Spaß! :)

Antwort
von markusstendler, 22

Da gibt es mehrere Varianten:

Du kannst ein Array mit allen Buchstaben (groß und klein) anlegen und gegenprüfen, ob sich jeder einzelne Buchstabe des Strings darin befindet.

Die Funktion preg_match() ist schon etwas besser dafür geeignet. Diese Prüft deinen String darauf, ob er dem angegebenen regulären Ausdruck entspricht.

Die optimalste Lösung ist aber folgende: Lass Sonderzeichen ruhig zu. Solltest du prozedural programmieren, wendest du vor dem Eintrag in die Datenbank die Funktion mysqli_real_escape_string() an. Damit maskierst du die Sonderzeichen und machst sie für die Datenbank unschädlich. Bei der objektorientierten Programmierung arbeitest du einfach mit Statements.

Viele Grüße,
Markus

Kommentar von RaceShafter ,

Ich arbeite prozedural. $dbconnect = mysqli_connect(*****); Wenn ich Username ($username) sichern möchte, also dann: $username = mysqli_real_escape_string($dbconnect, $username); Ist das so richtig?

Kommentar von markusstendler ,

Ja, genau :-)

Kommentar von FloPinguin ,

real_escape_string ist unsicher. Man sollte Parameter via stmt übergeben

Antwort
von Neubii, 37

Du kannst ein Array anlegen in dem das ganze Alphabet groß und kleingeschrieben ist oder in dem die Zeichen sind die verboten sind und dann beim z.B. abschicken prüfen ob etwas "unerlaubtes" eingefügt wurde und dann die weitergehende ausführung verbieten.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten