Sven Rautenberg: Frage wegen htmlspecialchars, ENT_QUOTES

Beitrag lesen

Moin!

»» Nehmen wir mal eine einfache Textarea.
»»
»» <textarea cols="20" rows="5" name="nachricht"></textarea>
»»
»» Wenn das als Affenformular genutzt werden soll, dann gehört es sich, dass der eingegebene Text durch htmlspecialchars() durchgejagt wird, andernfalls ist das die Einladung, um das HTML der Seite kaputtmachen zu können.
»»
»» echo '<textarea cols="20" rows="5" name="nachricht">'.htmlspecialchars($_POST['nachricht'].'</textarea>';

  1. Verstehe ich das richtig wenn jemand solch einen Code:

<script>alert('document.cookie')</script>

Das ist genau der Code, den man als Demo für "bösen" Code annehmen kann. Wenn sowas ungefiltert durchgereicht wird, und man das Alert-Fenster sieht, hat man (als Seitenbesucher bzw. als Programmierer der Seite) verloren.

ins Textfenster schreibt und das wird in der Textarea durch:

.htmlspecialchars($_POST['nachricht'].

In der Textarea erscheint, ohne dass der Code wirksam würde, einfach der oben genannte String. Der sieht als "Text" seltsam aus für das uninformierte Publikum, aber so ist das Leben. Der String "jkghjkgsd786sbjhl" sieht auch seltsam aus.

sowie in der eigentlichen Prüfung mit:

if (isset($_POST['nachricht']) && !empty($_POST['nachricht']))
  {
   $neuenachricht = trim(htmlspecialchars($_POST['nachricht']));
  }

Ich bin immer ein großer Freund von Escaping im letzten Augenblick. Also direkt bei der Ausgabe bzw. der Integration in einen qualitativ anderen String (z.B. den fertigen SQL-Query).

Der Grund ist relativ leicht: Wenn ich ALLE Ausgaben mit Escaping versehe, dann fällt es mir sehr deutlich auf, wenn an einer Stelle mal KEIN Escaping existiert, und ich werde diese Stelle genauer betrachten müssen.

durchgejagt, dann wird das alert Script zwar nicht ausgeführt aber behält immer noch seine eigentliche Form, also ausgegeben wird es Entschärft in der gesendeten E-Mail so?

Das ist ja gerade der gewünschte Effekt: Wenn der Benutzer den Text "<script>" eingibt, dann soll dieser Text grundsätzlich identisch erhalten bleiben, wenn er wieder ausgegeben wird. Genau das geschieht ja.

<script>alert('document.cookie')</script>

Mission erfüllt.

Wobei ich in Bezug auf EMail meine Hand für nichts ins Feuer legen würde. Mailclients sind Meister im Interpretieren. Einerseits hat man heutzutage wohl nirgendwo mehr Mailclients, die ungefragt Javascript in Mails ausführen, andererseits ist EMail inhaltlich so ein Wildwuchs, dass da alle möglichen Konstruktionen bzw. nachgeschalteten Textformatierer zuschlagen könnten.

Außerdem könnte es ja sein, dass du absichtlich gewisse Teilstrings aus dem eingegebenen Text herausfiltern willst, einfach weil du diese Strings nicht im Text stehen haben willst. Das ist aber eine andere Aufgabe und hat mit Escaping erstmal nichts zu tun. Filterung ersetzt kein Escaping! Selbst dann, wenn die Filterung eigentlich sicherstellen sollte, dass keine bösen Zeichen entstehen können, würde ich nie auf Escaping verzichten wollen, weil es die einfachste Methode ist, die Sicherheit zu erhöhen. Und wenn grundsätzlich jede Ausgabe escaped wird, fallen die Stellen ins Auge, wo das Escaping fehlt - und der Fehler kann behoben werden.

  1. Ist es Sinnvoll hier noch ENT_QUOTES zu setzen?
    Fast vergessen, bei mir ist Magic Quotes deaktiviert!

Magic_quotes_gpc sind ein ekliges Feature, welches mal erfunden wurde, um "Sicherheit" zu produzieren, wenn man Datenbanken benutzt. Dummerweise ist das automatische Escaping von magic_quotes_gpc nicht ausreichend: Es zielt ausschließlich auf MySQL ab (bzw. andere Datenbanken, die den Backslash als Escape-Zeichen nutzen - das ist aber nicht überall so), es werden aber nicht alle Zeichen behandelt, die MySQL gefährlich werden könnten, und es stört in vielen anderen Anwendungsfällen, in denen man tatsächlich den reinen Text benötigt, ohne Escapes.

Wegen dieses sehr zweifelhaften Nutzens ist magic_quotes_gpc() seit PHP Version 5.3.0 deprecated, in PHP 6 wird es komplett entfernt werden, und es ist in der empfohlenen PHP-Konfiguration deaktiviert.

Was ENT_QUOTES angeht: Hängt von deinen konkreten Anforderungen ab. Wenn du Attributwerte in einfachen Anführungszeichen einschließt, darf der escapte String diese natürlich nicht mehr enthalten. Da wäre ENT_QUOTES also notwendig. Stehen die Attributwerte in doppelten Anführungszeichen, ist ENT_QUOTES nicht zwingend notwendig, stört aber auch nicht.

- Sven Rautenberg