Sollte ich in PHP beim Senden von Zeichenfolgen an die Datenbank mit htmlspecialchars() auf illegale Zeichen achten oder einen regulären Ausdruck verwenden?

Lesezeit: 7 Minuten

Sollte ich in PHP beim Senden von Zeichenfolgen an die
Bach Julias

Ich arbeite an einem Formular mit der Möglichkeit für den Benutzer, unzulässige/Sonderzeichen in der Zeichenfolge zu verwenden, die an die Datenbank gesendet werden soll. Ich möchte diese Zeichen in der Zeichenfolge maskieren/negieren und habe sie verwendet htmlspecialchars(). Gibt es jedoch eine bessere/schnellere Methode?

  • Es gibt 2 Lager, die entweder auf „illegale Zeichen in einer Abfrage“ und „illegale Zeichen aufgrund eines XSS-Angriffs / HTML“ springen. Ich glaube, du sprichst von Ersterem, aber vielleicht möchtest du dich ein bisschen mehr verdeutlichen.

    – Wrikken

    7. Juni 2010 um 21:35 Uhr

  • HTML ist nicht SQL. Die Verwendung von HTML-Tools zur Vermeidung von SQL-Problemen ist wie die Verwendung einer englischen Rechtschreibprüfung für arabischen Text.

    – Alvaro González

    31. August 2011 um 11:27 Uhr

Sollte ich in PHP beim Senden von Zeichenfolgen an die
Ihr gesunder Menschenverstand

Es gibt keine “illegalen” Zeichen für die Datenbank. Datenbank, die einige Zeichen nicht speichern kann, ist Unsinn. Dort sind einige Bedienung Zeichen wie Anführungszeichen, die zum Trennen von Zeichenfolgen verwendet werden. Diese Zeichen sollten nur maskiert, nicht eliminiert werden.

Um eine Abfrage an die Datenbank zu senden, haben Sie 2 Möglichkeiten:

  1. Erstellen Sie eine Abfrage auf die übliche Weise, damit sie genau wie eine SQL-Abfrage aussieht, die Sie in der SQL-Konsole ausführen können.
    Um es zu tun, sollte man verstehen ein ganzes Regelwerknicht nur “mysql_real_escape_string verwenden”.
    Regeln wie:

    • Zeichenfolgen sollten sowohl in Anführungszeichen eingeschlossen als auch mit Escapezeichen versehen werden. Das ist die einzige Bedeutung von Escape: Es sind nur Escape-Trennzeichen! (und einige andere Zeichen – String-Endzeichen und Escape-Zeichen selbst). Ohne umgebende Anführungszeichen ist mysql_real_escape_string einfach nutzlos.
    • Zahlen sollten explizit in ihren Typ umgewandelt werden. Obwohl Datennummern genau wie Zeichenfolgen bedroht werden können, gibt es einige Zahlen, wie z. B. LIMIT-Klauselparameter, die nicht maskiert und nur umgewandelt werden können.
  2. Zum Senden von Abfragen und Daten separat.
    Dies ist der am meisten bevorzugte Weg, da er auf “nur Bindung verwenden” verkürzt werden kann. Alle Strings, Zahlen und LIMIT-Parameter können gebunden werden – keine Sorge.
    Mit dieser Methode wird Ihre Abfrage mit Platzhaltern unverändert an die Datenbank gesendet und gebundene Daten werden in separaten Paketen gesendet, sodass sie nicht stören können. Es ist einfach wie Code und Daten Trennung. Sie senden Ihr Programm (Abfrage selbst) getrennt von den Daten.

Aber!

Alles oben Gesagte deckt nur den Datenteil der Abfrage ab.
Aber manchmal müssen wir unsere Abfrage noch dynamischer gestalten, indem wir Operatoren oder Bezeichner hinzufügen.
In diesem Fall sollte jeder dynamische Parameter in unserem Skript fest codiert und aus diesem Satz ausgewählt werden.
Beispiel für eine dynamische Bestellung:

$orders  = array("name","price","qty"); //field names
$key     = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query   = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe

oder dynamische Suche:

$w     = array();
$where="";

if (!empty($_GET['rooms']))     $w[]="rooms="".mesc($_GET["rooms'])."'";
if (!empty($_GET['space']))     $w[]="space="".mesc($_GET["space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where";

In diesem Beispiel fügen wir der Abfrage nur vom Benutzer eingegebene Daten hinzu, keine Feldnamen, die alle im Skript fest codiert sind. Für die Bindung wäre der Algorithmus sehr ähnlich.

Und so weiter.

  • Danke, das ist wirklich hilfreich.

    – Bach Julias

    8. Juni 2010 um 11:15 Uhr

Sollte ich in PHP beim Senden von Zeichenfolgen an die
Favorit

Wenn Sie diese Daten an die Datenbank übermitteln, werfen Sie bitte einen Blick auf die Escape-Funktionen für Ihre Datenbank.

Das heißt, für MySQL gibt es mysql_real_escape_string.

Diese Escape-Funktionen kümmern sich um möglicherweise böswillige Zeichen, und Sie erhalten Ihre Daten immer noch auf die gleiche Weise, wie Sie sie dort eingegeben haben.

Sie können auch vorbereitete Anweisungen verwenden, um sich um die Daten zu kümmern:

$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (?)');
$dbPreparedStatement->execute(array($yourHtmlData));

Oder etwas selbsterklärender:

$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (:htmlcontent)');
$dbPreparedStatement->execute(array(':htmlcontent' => $yourHtmlData));

Falls Sie verschiedene Arten von Daten speichern möchten, verwenden Sie bindParam um jeden Typ zu definieren, das heißt, eine ganze Zahl kann definiert werden durch: $db->bindParam(':userId', $userId, PDO::PARAM_INT);. Beispiel:

$dbPreparedStatement = $db->prepare('INSERT INTO table (postId, htmlcontent) VALUES (:postid, :htmlcontent)');
$dbPreparedStatement->bindParam(':postid', $userId, PDO::PARAM_INT);
$dbPreparedStatement->bindParam(':htmlcontent', $yourHtmlData, PDO::PARAM_STR);
$dbPreparedStatement->execute();

Woher $db ist Ihr PHP-Datenobjekt (PDO). Wenn Sie keine verwenden, erfahren Sie möglicherweise mehr darüber unter PHP-Datenobjekte.

  • Das war genau das, was ich gesucht habe.

    – Bach Julias

    7. Juni 2010 um 20:59 Uhr

  • Eine noch bessere Lösung für das SQL-Injection-Problem ist die Verwendung parametrisierter Abfragen. Dadurch entfällt die Notwendigkeit, von Hand vollständig zu entkommen.

    – Matti Virkkunen

    7. Juni 2010 um 21:08 Uhr

  • Ja zu parametrisierten Abfragen. Warum Menschen auf alte Technologien lenken, die anfälliger für Injektionen sind?

    – Webbiedave

    7. Juni 2010 um 21:11 Uhr

  • Es ist nicht klar, was die Frage stellt. SQL-Injection oder XSS? mysql_real_escape_string verhindert nicht XSS, und htmlspecialchars verhindert nicht die SQL-Injektion. Wenn ich noch Stimmen hätte, würde ich -1 dafür geben mysql_escape_string: “Diese Funktion ist seit PHP 5.3.0 VERALTET. Es wird dringend davon abgeraten, sich auf diese Funktion zu verlassen.” Und +1 an den Typen, der parametrisierte Abfragen erwähnt.

    – Lotus Notes

    7. Juni 2010 um 21:12 Uhr


  • Ich habe mysql_escape_string aus der Antwort entfernt, da es veraltet ist, parametrisierte Abfragen sind besser, aber normalerweise arbeiten die Leute mit mysql_query, wo eine einfache Escape-Zeichenfolge ausreicht

    – Liebling

    7. Juni 2010 um 21:33 Uhr


Zunächst einmal sollten Sie die Dinge beim Anzeigen bereinigen, nicht vor dem Einfügen in die Datenbank. SQL-Injections sind eine andere Geschichte, aber wahrscheinlich nicht zum Thema.

Zweitens, wenn Ihre Benutzer überhaupt nicht in der Lage sein müssen, HTML zu posten, htmlspecialchars ist alles, was du brauchst. Es kümmert sich um alle Sonderzeichen in HTML.

  • Wow, genau das wollte ich gerade schreiben, als die “neue Antwort” auftauchte 😉

    – Marian

    7. Juni 2010 um 20:55 Uhr

  • Verwenden Sie also Javascript, um den Text während der Eingabe zu bereinigen?

    – Bach Julias

    7. Juni 2010 um 20:57 Uhr

  • @Brook: Was? Wie zum Teufel bist du darauf gekommen? Das ist völlig zufällig!

    – Matti Virkkunen

    7. Juni 2010 um 20:58 Uhr

  • @Brook traue niemals etwas, das von einem Kunden kommt. Wenn Sie clientseitiges JavaScript verwenden, können sie es leicht umgehen. Fühlen Sie sich frei, zu validieren, wenn sie auf dem Client auf Senden klicken, aber vertrauen Sie nicht darauf, dass es validiert wurde. Sie müssen auf dem Server erneut validieren.

    – Der Jacob Taylor

    7. Juni 2010 um 22:14 Uhr

Ich arbeite an einem Formular mit der Möglichkeit für den Benutzer, unzulässige/Sonderzeichen in der Zeichenfolge zu verwenden, die an die Datenbank gesendet werden soll.

Benutzer können tatsächlich viel darüber hinausgehen.

Ich möchte diese Zeichen in der Zeichenfolge maskieren/negieren und habe htmlspecialchars() verwendet. Ich würde jedoch gerne wissen, ob es eine bessere/schnellere Methode gibt.

Verwenden HTML-Reiniger:

HTML Purifier ist eine standardkonforme, in PHP geschriebene HTML-Filterbibliothek. HTML Purifier entfernt nicht nur den gesamten bösartigen Code (besser bekannt als XSS) mit einer gründlich geprüften, sicheren und dennoch zulässigen Whitelist.

und entscheide selbst 🙂

Dies ist kein Problem, das Sie alleine angehen möchten. Es gibt Bibliotheken da draußen, die das für Sie erledigen, wie z HTML-Reiniger.

  • Es war definitiv nichts, was ich wirklich alleine angehen wollte. Danke für den Link HTML Purifier scheint besonders hilfreich zu sein.

    – Bach Julias

    7. Juni 2010 um 20:55 Uhr

1646937850 73 Sollte ich in PHP beim Senden von Zeichenfolgen an die
webbiedave

Sie haben nicht angegeben, was diese illegalen Zeichen sein könnten, aber Sie sollten auf jeden Fall den bereitgestellten Mechanismus der Datenbank-API verwenden, um Daten zu maskieren. Wenn Sie beispielsweise MySQL verwenden, verwenden Sie PDO-parametrisierte SQL-Anweisungen.

  • Es war definitiv nichts, was ich wirklich alleine angehen wollte. Danke für den Link HTML Purifier scheint besonders hilfreich zu sein.

    – Bach Julias

    7. Juni 2010 um 20:55 Uhr

988710cookie-checkSollte ich in PHP beim Senden von Zeichenfolgen an die Datenbank mit htmlspecialchars() auf illegale Zeichen achten oder einen regulären Ausdruck verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy