PHP : Einsteiger

Escapen in PHP

von Fab & treo

Hi zusammen!

Wir haben uns entschlossen auch mal ein Tutorial zu schreiben.

Habt ihr euch manchmal gewundert, warum ein Script von euch nicht funktionierte, obwohl es völlig korrekt auszusehen schien?
Dann könnte das vielleicht daran liegen, dass ihr nichts escapt habt.

Dann ist das genau das richtig, was ihr jetzt braucht!


Thema: Escapen in PHP


Index:
    1. Was ist escapen? Was habe ich davon?
    2. Wie escapt man? (Theorie)
    3. Anwendungsbeispiele (Praxis)
    4. Was passieren kann, wenn man nicht escapt?



1. Was ist escapen? Was habe ich davon?


Es gibt 3 Arten von Escapen, wobei die dritte Art nicht wirklich eine Art des Escapens ist.

Escapen von Variablen:
Diese Art des Escapens, zählt offiziell nicht zum Escapen.
Sie wird hier jedoch auch mit aufgeführt weil sie bei nicht Escapern häufig auch nicht angewendet wird,
was dann viele Probleme mit sich nachziehen kann.

Escapen von Anführungszeichen ( ' und " ):
Fast immer wenn man einen String in PHP eingibt dann ist er in Anführungszeichen gesetzt.
Hat man gleiche Anfürungszeichen in einem String dann denkt sich der Parser das der String damit beendet ist
und wundert sich, dass da immer noch "merkwürdige" Sachen folgen, bei denen er denkt, dass sie nicht mehr zum String gehören. Daher muss man Anführungszeichen in PHP Escapen.

Escapen von Buchstaben und anderen Zeichen:
Du kennst sicher schon das "\n" was dafür sorgt, dass PHP eine neue Zeile anfängt,
so gibt es auch viele andere Zeichen die escaped werden können, damit sie eine besondere Aufgabe erfüllen. Wir werden aber in diesem Tutorial nur die Theorie erklären.


2. Wie escapt man? (Theorie)


Escapen von Variablen:
Wenn man will, dass eine Variable in einem String auch wirklich ersetzt wird, gibt es 2 Möglichkeiten, dies zu machen.
Die erste wäre das man sie innerhalb von doppelten Anführungszeichen ( " ) schreibt, dies ist jedoch eine schlechte Variante, weil man nicht sofort erkennen kann, dass eine Variable eingefügt wird und man kann sehr schlecht Arrays verwenden.
Daher ist es ratsam, die Variabel zu "escapen" ( Wie bereits oben gesagt, handelt es sich hier nicht wirklich um ein echtes Escapen).
Dies macht man so:
Hat der String mit doppelten Anfürungszeichen begonnen, so beendet man ihn auch damit und setzt einen Punkt ( . ) danach, dann den Variablennamen und nochmals einen Punkt, dann fängt man den String auch wieder mit einem doppelten Anfrührungszeichen an.
Das Gleiche kann man auch mit einzelnen Anführungszeichen machen.
Zum besseren Verständniss hier ein Beispiel Code:

Code:
  1. <?php
  2.    $wetter = "schoenes";
  3.    $string   = "Heute ist ".$wetter." Wetter!";
  4. ?>


Bei der Verwendung von diesem Verfahren ist es egal ob man doppelte oder einzelne Anführungszeichen benutzt.


Escapen von Anführungszeichen:
Wenn man einen String hat und in ihm z. B. HTML Code haben will, dann muss man vielleicht auftretende Anführungszeichen escapen. Je nachdem wie man es macht, muss man es machen oder auch nicht.
Hat man einen Validen XHMTL 1.0 Tag, dann kann man durch die Benutzung von einzelnen Anführungszeichen sich den Aufwand des Escapen sparen.
Hier ein Beispiel für so eine Art der Benutzung:

Code:
  1. <?php
  2.    $html_code = '<a href="http://www.inside-php.de">Inside-PHP.de</a>';
  3. ?>


Hat man jedoch im String selber ein einzelnes Anführungszeichen, so muss dieses escapt werden:

Code:
  1. <?php
  2.   $html_code = '<a href="http://www.inside-php.de">treo\'s Seite</a>';
  3. ?>


Hier haben wir das erste Aufkommen eines echten Escapens. Denn erst in diesem Beispiel haben wir das Escapezeichen \ ( Backslash ).
Kommt man nicht drumherum, in einem String, der mit doppelten Anfühtungszeichen gemacht wurde, auch wieder solche zu verwenden, dann müssen diese auch escapt werden.
Dies funktioniert genauso wie mit einzelnen Anführungszeichen:

Code:
  1. <?php
  2.   $html_code = "<a href=\"http://www.inside-php.de\">treo's Seite</a>";
  3. ?>


Was man jedoch hier sieht ist, dass man das einzelne Anführungszeichen nicht escapen braucht.

Escapen von Buchstaben und anderen Zeichen
Beim Escapen von Buchstaben und anderen Zeichen wird eine spezielle Funktion dadurch aufgerufen
So sorgt z.B. ein \n für eine neue Zeile (Unix), und ein \t erzeugt einen Tab.
Dies stellt uns jedoch vor das Problem das wir haben wenn wir einfach nur ein Backslash ausgeben wollen.
Dies lässt sich dadurch erreichen, dass man das Escapezeichen escapt.

Code:
  1. <?php
  2.    $html_code = "<a href=\"http://www.inside-php.de\">\\treo's Seite/</a>";
  3. ?>

In diesem Beispiel würde nun ein Link erzeugt der so aussieht: \treo's Seite/
Dieses Escapen funktioniert nur in doppelten Anführungszeichen!


3. Anwendungsbeispiel (Praxis)


Beim Variabel-Escapen:

Code:
  1. <?php
  2. // Wir schreiben einen MySQL Query, der eine News mit der id 12 holen soll
  3. $id = 12;
  4. $sql = "SELECT
  5. *
  6. FROM
  7. news
  8. WHERE
  9. id = '".$id."';"; /* Hier muessen wir escapen,                    da sonst die Variabel nicht ausgeführt würde! */
  10. $result = mysql_query($sql) OR die(mysql_error()); // Query schicken
  11. // hier gehts dann weiter mit dem auslesen
  12. ?>


Das ganze mit einzelnen Anführungszeichen ist ein bisschen aufwändiger:

Code:
  1. <?php
  2. // Wir schreiben einen MySQL Query, der eine News mit der id 12 holen soll
  3. $id = 12;
  4. $sql = 'SELECT
  5. *
  6. FROM
  7. news
  8. WHERE
  9. id = \''.$id.'\';'; /* Hier muessen wir escapen,
  10. da sonst die Variabel nicht ausgeführt würde! */
  11. $result = mysql_query($sql) OR die(mysql_error()); // Query schicken
  12. // hier gehts dann weiter mit dem auslesen
  13. ?>


Beim Anführungszeichen-Escapen:

Code:
  1. <?php
  2. // Wir machen ein Script, das Banner aus einem Array per Zufall ausgibt
  3. $banner = array();
  4. $banner[0] = "<a href=\"http://sk8ing.gu2.info/Xenon%20Scripts/index.php\" target=\"_blank\"> // Hier escapen wir und zwar alles
  5.                   <img style=\"border: 0px;\" src=\"xenon.jpg\" alt=\"Fab's Seite\" />
  6.                  </a>";
  7. $banner[1] = "<a href=\"http://www.homepage.de\" target=\"_blank\">
  8.                   <img style=\"border: 0px;\" src=\"http://www.homepage.ch\" alt=\"homepage\" />
  9.                  </a>";
  10.  
  11. srand(microtime()*1000000); // besserer Zufall
  12.    $zahl = rand(0,1); // Zufall generieren
  13.    
  14.    echo $banner[$zahl]; // Banner ausgeben
  15. ?>


Wir haben jetzt in dem Beispiel gerade einen Extrem-Fall genommen,
dass geht mit den ' natürlich viel einfacher, da man ja dann die " nicht escapen muss / darf!




4. Was passieren kann, wenn man nicht escapt?


Wenn ihr euch das jetzt anschaut, dann bitte, macht das nicht nach!
Das ist stylistisch vollkommen falsch und wird nicht auch überhaupt funktionieren!!!


Beim Variabel-Escapen:

Code:
  1. <?php
  2.    // Wir schreiben einen MySQL Query, der eine News mit der id 12 holen soll
  3.    $id = 12;
  4.    
  5.    $sql = 'SELECT
  6.                *
  7.            FROM
  8.                news
  9.            WHERE
  10.                id = "$id";'; // Hier liegt der Fehler
  11.    $result = mysql_query($sql) OR die(mysql_error()); // Query schicken
  12.    // hier gehts dann weiter mit dem auslesen
  13. ?>


Hier wurden die Anführungszeichen zwar escapt, aber die Variable nicht.
PHP schickt dann an MySQL folgende Anweisung:
SELECT * FROM news WHERE id = $id
Da es keine id gibt, die $id heisst, funktioniert die Query auch nicht!

noch ein Beispiel:

Code:
  1. <?php
  2.    $wetter = 'schoenes';
  3.    $string   = 'Heute ist $wetter Wetter!';
  4. ?>


Ausgabe: Heute ist $wetter Wetter
Die Variable wird nicht ausgewertet!

Beim String-Escapen:

Code:
  1. <?php
  2.    $banner[0] = "<a href="http://sk8ing.gu2.info/Xenon%20Scripts/index.php" target="_blank">
  3.                   <img style="border: 0px;" src="xenon.jpg" alt="besucht die Seite! :D" />
  4.                  </a>";
  5. ?>


Das ergäbe ein Feuerwerk von Parse Errors, Folge ist, dass das Script nicht weiter ausgeführt wird.

Noch ein Beispiel:

Code:
  1. <?php
  2.    $string = '<img src=\"bild1.jpg\" alt=\"Sommerferien\" />';
  3. ?>


Richtig, das ist völliger Schwachsinn, ihr wisst, was wir meinen. Smiley


Wir hoffem, dass euch das Tutorial weitergebracht hat.
Jetzt wünschen wir euch viel Spass beim Proggen und denkt daran:
Leute, escapt!


Mfg Fab & treo & Matt


Autoren: Fab & treo
Lektor: Matt
BB-Code von: Fab
Copyright by: Xenon Scripts & inside-PHP.de
Aktionen
Login
Suche
Partner
Statistics