dedlfix: Sicherheit

Beitrag lesen

echo $begrüßung;

Und dennoch verwende ich addslashes() bevor ich Daten in einer Datenbank speichere

addslashes() ist für MySQL nicht optimal, weil es nicht alle nötigen Zeichen berücksichtigt. Die Funktion, um die Daten speziell für MySQL zu escapen, lautet mysql_real_escape_string().

und stripslashes() bevor ich sie wieder ausgebe.

Dann hast du nicht verstanden, wie das mit dem Escapen funktioniert. SQL-Server nehmen Befehle und Daten auf einer Text-Schnittstelle entgegen. Um String-Daten von den Befehlsteilen zu unterscheiden, müssen sie (meist) in Anführungszeichen gesetzt werden. Wenn nun diese Anführungszeichen innerhalb der Daten vorkommen, müssen sie so gekennzeichnet werden, dass sie nicht als das Endezeichen der Daten interpretiert werden. Für ein paar weitere Zeichen gibt es ebenfalls spezielle Notationen.

Wenn Daten aus der SQL-Datenbank kommen, dann läuft das nicht mehr über die Eingabe-Text-Schnittstelle. Man bekommt die Daten in Roh-Form zurück. Die Ersatzschreibweisen, die für die Notation der Daten auf der Text-Schnittstelle verwendeten wurden, ist nicht mehr vorhanden. Sendet man ein ' bekommt man ' zurück, sendet man \n bekommt man einen "richtigen" Zeilenumbruch zurück.

("Blödsinn" != "Blödsinn")

Ist wahr. Aber was hat das mit escapen zu tun? Wenn ich 'Blödsinn' escape, ist das immernoch 'Blödsinn'!

Das war ein allgemeines Beispiel. Wenn Daten zu früh in den Ausgabe-Kontext gebracht werden, sind sie teilweise für eine andere Weiterverarbeitung unbrauchbar geworden.

Beispiel: In ein Feld dürfen nur x Zeichen eingegeben werden. Jemand gibt einen Text mit genau x Zeichen ein, die jedoch durch Magic Quotes mit zusätzlichen Zeichen versehen werden. Der String ist nun x + n Zeichen lang. Um die Daten zu prüfen, und beim Zählen nicht x + n sondern x zu erhalten, muss man entweder eine "gestripslashte" Kopie anlegen oder bei diesem und jedem weiteren Verarbeitungsschritt stripslashen.

Ich habe jedoch auch einige Projekte gesehen, die prüfen ob Magic Quotes verfügbar ist und dann, wenn vorhanden, gänzlich auf das Escapen verzichten.

Der bessere Weg wäre, wenn man die Magic Quotes nicht ausschalten kann, deren Auswirkungen für alle GPC-Eingabedaten[*] am Script-Anfang rückgängig zu machen und dann die für den jeweiligen Ausgabekontext optimalen Umwandlungen zu verwenden.

Wie wichtig sind nun addslashes() und der Rest?

Magic Quotes sind dafür gedacht, um dem gänzlich unbedarften PHP-Anwender ein klein wenig Sicherheit zu bieten. addslashes() ist da, um die von Magic Quotes verwendete Umwandlung dem PHP-Anwender zur Verfügung zu stellen. Ansonsten fällt mir kein wirklich nützliches Beispiel ein, bei dem adslashes() ausreichend wäre.

echo "$verabschiedung $name";

[*] GPC: GET, POST, COOKIE