Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard Zeichenumwandlung

 

Inhalte

 
Wann muss ich welche Zeichen umwandeln? Bevor oder nachdem ich in die Datenbank schreibe? Dieser Artikel will versuchen solche und ähnliche Fragen zu beantworten. Wir besprechen hier nur Funktionen die in Bezug auf die Verwendung von Strings in Datenbanken oder HTML-Code hilfreich sind. Andere String Umwandlungsfunktionen werden nicht erwähnt.

Warum Zeichenumwandlung?

Einzelne Zeichen erfüllen in gewissen Situationen spezielle Aufgaben. Werden sie nicht geschützt (oder entwertet) wird unter Umständen ein Vorgang ausgelöst der so nicht gewünscht ist. Die Zeichenumwandlung wird auch "Encoding", "Escaping" oder "Maskierung" genannt. Das typische Beispiel für fehlende Zeichenumwandlung sind SQL Injections. Ein anderer Grund ist valider HTML Code zu schreiben. Ein nicht umgewandeltes "&" in HTML ist schlichtweg falsch (übrigens auch in einem Link!).

Verluste bei der Zeichenumwandlung

Moderne Programme können mit einer Unmenge von Zeichensätzen umgehen. So auch PHP Apache MySQL und die Browser. Bei jeder Umwandlung sollte man sich bewust machen, dass Verluste auftreten können. Die meisten Zeichensätze sind 8Bit Zeichensätze. Es sind also max. 256 verschiedene Zeichen in einem solchen Zeichensatz darstellbar. Es findet sich z.B. kein "echter" 8Bit Zeichensatz, welcher sowohl deutsche Umlaute UND Kyrillisch enthält.
Das heißt:
Eine Konvertierung mit z.B. iconv() birgt die große Gefahr, dass Zeichen "kaputt" gehen. Also Verluste auftreten.
Grundsätzlich:
  • Eine Konvertierung eines ISO-XXX-XX Strings zu UTF ist verlustfrei.
  • Eine Konvertierung zwischen den UTF Formaten ist verlustfrei.
  • Umgekehrt, wenn z.B. deutsch, türkisch und koreanisch gemischt in einem UTF Text vorkommen, ist keine verlustfreie Konvertierung zu einem 8Bit Zeichensatz mehr möglich.

Magic Quotes

Diese php.ini Einstellung simuliert die Anwendung der Funktion addslashes() auf die Request Variablen. Es ist wichtig zu wissen was Magic Quotes bewirkt da uns das in der weiteren Behandlung in die Quere kommen kann, lesen Sie deshalb unbedingt den Magic Quotes Artikel. Wir gehen im weiteren davon aus dass Magic Quotes nun ausgeschaltet ist (ab PHP 6 ********) oder dessen Wirkung rückgängig gemacht wurde.

Warnung:
Die folgenden Funktionen nehmen Ihnen nicht die Prüfung der ankommenden Variablen ab!

Funktionen für MySQL Datenbanken

Sie sollten immer nur "Rohtext" in eine Datenbank speichern. HTML Tags sollten Sie zum Beispiel erst hinzufügen wenn die Ausgabe im Browser erfolgt. Stellen Sie sich vor Sie haben ein HTML-konformen Text in der Datenbank und möchten nun ein PDF erstellen. Sie würden sich mächtig über die HTML Tags aufregen. Grundsätzlich lässt sich sagen: machen Sie die Umwandlung dann wenn Sie sie brauchen.

mysql_real_escape_string()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string mysql_real_escape_string(string unescaped_string[, resource link_identifier = NULL])
Escapes special characters in a string for use in an SQL statement

Umwandlungen

VonNach
\\\
\x00\\x00
\x1a\\x1a
\n\\n
\r\\r
'\'
"\"

Einsatz

mysql_real_escape_string() sollte für jede Variable die in einem Query-String steht angewendet werden. Wie der Name schon sagt gilt sie für MySQL Datenbanken. Um die Funktion ausführen zu können, muss eine Verbindung zur Datenbank bestehen.
Die Zeichenumwandlung von mysql_real_escape_string() betrifft nur die Kommunikation mit der Datenbank, in der Datenbank gespeichert werden sinnvollerweise die Rohdaten.

addslashes()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string addslashes(string str)
Quote string with slashes

Umwandlungen

VonNach
\\\
'\'
"\"

Einsatz

addslashes() führt einen Teil der Umwandlungen durch die auch mysql_real_escape_string() durchführt. Bei MySQL-Datenbanken sollte trotzdem unbedingt mysql_real_escape_string() benutzt werden. Bei anderen Datenbanken ohne eigene Umwandlungsfunktion kann addslashes() aber gute Dienste leisten.

stripslashes()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string stripslashes(string str)
Un-quotes a quoted string

Umwandlungen

VonNach
\\\
\''
\""

Einsatz

stripslashes() ist das Gegenteil von addslashes() und macht dessen Umwandlungen rückgängig. Mithilfe dieser Funktion lassen sich Slashes, die z.B durch Magic Quotes hinzugefügt wurden, wieder entfernen (für den Fall, dass Magic Quotes nicht abgeschaltet werden kann).


Funktionen zur Ausgabe im Browser (HTML)

Der grösste Teil der PHP Anwendungen gibt HTML Code an den Browser zurück. Wie Sie wissen, werden in HTML einige Zeichen speziell dargestellt. Wie? Sie wissen das nicht? Dann schnell nachschlagen: SelfHTML: HTML-eigene Zeichen maskieren.
Unter anderem gehören auch Ö, Ä und Ü dazu. Sie können von einem Besucher Ihrer Webseite nicht verlangen Müller in ein Formularfeld einzugeben. PHP hat da auch wieder ein paar coole Funktionen im Petto:

htmlspecialchars()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string htmlspecialchars(string string[, int flags = ENT_COMPAT | ENT_HTML401][, string encoding = ini_get("default_charset")][, bool double_encode = true])
Convert special characters to HTML entities

Umwandlungen

VonNach
&&
""
<&lt;
>&gt;

Einsatz

Na es sollte offensichtlich sein wann htmlspecialchars() angewendet wird: Bei allem was im Browser angezeigt werden soll! OK, das ist etwas übertrieben. Sie werden es im speziellen auf Daten aus Datenbanken anwenden müssen. htmlspecialchars() wandelt lediglich die wichtigsten (für die Darstellung) Zeichen um. Um wirklich alle Sonderzeichen umzuwandeln gibt es htmlentities().

htmlentities()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string htmlentities(string string[, int flags = ENT_COMPAT | ENT_HTML401][, string encoding = ini_get("default_charset")][, bool double_encode = true])
Convert all applicable characters to HTML entities

Umwandlungen

htmlentities() wandelt alle Zeichen - die eine HTML Entsprechung haben - um. Es sind zu viele um diese hier aufzuzählen. Aber mit folgendem Code können Sie selbst eine Auflistung darstellen.
PHP Quellcode:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Liste der Umwandlungen von htmlentities()</title>
  <body>
    <h1>Liste der Umwandlungen von htmlentities()</h1>
    <table border>
      <tr>
        <th>Aus</th>
        <th>wird</th>
      </tr>
      <?php
      $he=get_html_translation_table(HTML_ENTITIES);
      foreach ($he AS $key => $wert) {
        ?> 
        <tr align='center'>
          <td><?php echo htmlentities($key); ?></td>
          <td><?php echo htmlspecialchars($wert); ?></td>
        </tr>
        <?php
      }
      ?> 
    </table>
  </body>
</html>

Einsatz

htmlentities() können Sie anstelle von htmlspecialchars() verwenden, es werden dann wirklich alle Zeichen umgewandelt. Vor allem auch Ü, Ö und Ä. htmlentities() hilft Ihnen validen HTML Code zu schreiben, verwenden Sie es!

Verwenden Sie die UTF-8-Kodierung ist für die richtige Interpretation folgendes Schema zu verwenden:
PHP Quellcode:
htmlentities($string,ENT_COMPAT,"UTF-8");

nl2br()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string nl2br(string string[, bool is_xhtml = true])
Inserts HTML line breaks before all newlines in a string

Umwandlungen

Alle Neue-Zeile (New-Line) Zeichen in <br />.

Einsatz

Nehmen wir an Sie haben ein Formular mit einem <textarea> Feld. Text kann darin mit der Eingabe Taste umgebrochen werden. HTML interpretiert das Zeichen für die Eingabetaste jedoch nicht und würde alles in einer Zeile darstellen. Ausnahme: die Ausgabe mit <pre>...</pre> und in einem <textarea> Feld. Mit folgendem Code können Sie das Verhalten im Browser selbst beobachten:
PHP Quellcode:
<?php
error_reporting(E_ALL);
$test="Beispiel:\nZeichenumwandlung mit nl2br()";
$test_mit_nl2br=nl2br($test);

?> 
<html>
  <head>
    <title>Zeichenumwandlung mit nl2br</title>
  </head>
  <body>
    <h1>Originaltext:</h1>Beispiel:\n Zeichenumwandlung mit nl2br()
    <h2>Anzeige in HTML mit nl2br():</h2><?php echo ($test_mit_nl2br); ?> 
    <h2>Anzeige in HTML ohne nl2br():</h2><?php echo $test ?> 
    <h2>Anzeige in &lt;textarea&gt; Feld mit nl2br():</h2><textarea rows='2' cols='30'><?php echo ($test_mit_nl2br); ?></textarea>
    <h2>Anzeige in &lt;textarea&gt; Feld ohne nl2br():</h2><textarea rows='2' cols='30'><?php echo $test; ?></textarea>
  </body>
</html>

htmlspecialchars_decode() und html_entity_decode()

Anwendung

DOKU-VORLESE-SERVICE(TM)
string htmlspecialchars_decode(string string[, int flags = ENT_COMPAT | ENT_HTML401])
Convert special HTML entities back to characters
DOKU-VORLESE-SERVICE(TM)
string html_entity_decode(string string[, int flags = ENT_COMPAT | ENT_HTML401][, string encoding = ini_get("default_charset")])
Convert all HTML entities to their applicable characters

Umwandlungen

Wie Sie sich denken können, machen diese beiden Funktionen die Umwandlungen von htmlspecialchars() bzw. htmlentities() rückgängig.

Einsatz

Tatsächlich werden Sie diese Funktionen wahrscheinlich nie gebrauchen, Sie werden es merken wenn es soweit ist.

Übersichtstabelle

Folgende Tabelle soll Ihnen helfen die richtigen Funktionen für bestimmte Vorgänge zu wählen. Es wird wieder davon ausgegangen dass Magic Quotes ausgeschaltet ist oder rückgängig gemacht wurde.

Quelle / ZielHTMLDatenbank
Formularhtmlentities()mysql_real_escape_string()
Datenbankhtmlentities()-
Tipp:
Das sind natürlich nicht alle Umwandlungsfunktionen die PHP kennt. Möglicherweise interessiert Sie zum Beispiel strip_tags(). Verwenden Sie die Dokumentation oder die Suchfunktion des Forums für weitere Funktionen.


Erstellt von generi, 23.02.2008 am 18:31
Zuletzt bearbeitet von Fireball22, 15.04.2009 am 12:47
7 Kommentare , 14302 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
grundlagen

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:58 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC