PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Punycode, IDN: Welche Probleme es bei Umlaut-Domains in PHP gibt

with 8 comments

Naja, eigentlich betrifft es nicht nur Umlaut-Domains hier in Deutschland, sondern allgemein alle Internationalized Domain Names auf der Welt. Also, was passiert wenn wir eine E-Mail an info@müller.de verschicken möchten? Was passiert wenn wir eine an die griechische Domain info@παράδειγμα.δοκιμή verschicken wollten? Was passiert wenn wir auf Port 80 des Webservers von www.müller.de zugreifen wollen? Richtig, alles wird fehlschlagen.

Erstmal zum Grundproblem. Das Internet ist alt, und damals hat noch niemand daran gedacht, dass es auch andere Sprachen als Englisch gibt, deshalb baut alles auf ASCII auf, also mehr oder weniger alles was auf einer englischen Tastatur zu finden ist. Das Domain Name System ist sogar noch strikter und erlaubt nur die 26 lateinischen Buchstaben, die Zahlen 0-9 und den Bindestrich. Das wars!

Man kam also auf die Idee, den Zeichensatz für Domains vergrößern zu wollen. Das interessante daran ist nun aber dass dies geschehen sollte ohne alle Server und Netzwerkgeräte austauschen zu müssen, man benötigte also eine Art Workaround. Deshalb wurde 2003 Punycode eingeführt. Mit Punycode kann man eine Domain, die beispielsweise Umlaute enthält, in eine Domain umwandeln die nur die oben erwähnten 37 zeichen enthält. Aus müller.de wird xn--mller-kva.de . Wie genau diese Umsetzung stattfindet kann im entsprechenden RFC 3492 nachgelesen werden, nur soviel: xn-- deutet auf eine Punycode-Domain hin. Die Umlaute werden angehängt, in diesen angehängten Zeichen ist die Position und der Umlaut codiert.

Alle Browser beherrschen natürlich Punycode, sodass man gefahrlos www.müller.de in die Adresszeile eingeben kann, und der Browser arbeitet dann intern mit der Punycode-Schreibweise wenn er mit dem DNS-Server oder dem Webserver kommuniziert.

Was ist aber mit PHP? Aktuell ist die Unterstützung nicht eingebaut, was man leicht überprüfen kann:

<?php
var_dump(dns_get_record('www.phpgangsta.de', DNS_A));
var_dump(dns_get_record('www.müller.de', DNS_A));

Die Ausgabe sieht wie folgt aus:

array(1) {   [0]=>
  array(5) {
    ["host"]=>
    string(17) "www.phpgangsta.de"
    ["type"]=>
    string(1) "A"
    ["ip"]=>
    string(12) "85.214.28.26"
    ["class"]=>
    string(2) "IN"
    ["ttl"]=>
    int(532)
  }
}

Warning: dns_get_record(): Dns Query failed in punycode.php on line 4

Call Stack:
    1.0016     332464   1. {main}() punycode.php:0
    1.0556     332608   2. dns_get_record() punycode.php:4

bool(false)

Das selbe gilt übrigens auch für alle anderen Netzwerk-Funktionen wie fsockopen(), gethostbyname(), mail(), alle Funktionen die mit dem HTTP-, FTP- oder SSH2-Wrapper umgehen können, z.B.

file_get_contents('http://www.müller.de')

Wir müssen uns also selbst darum kümmern. Dazu nutzen wir einfach die idna_convert Klasse (bzw. Net_IDNA) von Matthias Sommerfeld. Mit 3 Zeilen Extracode können wir auch mit Umlaut-Domains kommunizieren:

require_once('idna_convert.class.php');

$IDN = new idna_convert();
$output = $IDN->encode('www.müller.de');

var_dump(file_get_contents('http://'.$output));
var_dump(dns_get_record($output, DNS_A));
var_dump(gethostbyname($output));

Wenn man nun konsequent überall, wo Domain Namen auftreten, die Punycode-Konvertierung anwendet, gibt es auch keine Probleme mehr mit IDNs. Also überprüft euren Code darauf ob ihr eventuell ein Problem habt wenn ihr E-Mails an Nutzer verschickt etc.

Written by Michael Kliewe

Juli 27th, 2011 at 8:16 am

Posted in PHP

Tagged with , , ,

8 Responses to 'Punycode, IDN: Welche Probleme es bei Umlaut-Domains in PHP gibt'

Subscribe to comments with RSS or TrackBack to 'Punycode, IDN: Welche Probleme es bei Umlaut-Domains in PHP gibt'.

  1. Also ich würde ja erwarten, dass die Umwandlung transparent für den Entwickler von PHP durchgeführt wird…

    Norbert

    27 Jul 11 at 08:31

  2. Warum überhaut Domains mit Umlauten?! Ich verstand das ganze damals nicht, und heute auch noch nicht… Was ist denn, wenn ich in China in einem Internetkaffee dem Herrn Müller eine E-Mail an info@müller.de senden möchte?

    Dos

    27 Jul 11 at 09:16

  3. @dos dann hast du das problem zuerst die tastatur auf deutsch zu stellen und dann das ü zu suchen.

    Und genau das ist der Grund warum man den Kunden dreimal fragt, ob er das wirklich will und das er damit Probleme mit ausländischen kunden kriegt, aber wenn er sich sicher ist, das das nicht passiert, geht das schon, z.B. der Frisör von der Ecke, der gerne ne Website will, aber sicher nicht aus Korea angesurft wird.

    Uns muss bewusst sein, für welche Zielgruppe diese Domains in Frage kommen!

    Fabian Blechschmidt

    27 Jul 11 at 09:25

  4. Dazu kommt noch das Problem, dass die Unterstützung bei Emails (Client+Server) subjektiv deutlich schlechter ist. Domains wie müller.de sind zwar nett, aber ich würde sie maximal als „Alias“ für (z.B.) mueller.de einsetzen.

    cmi

    27 Jul 11 at 09:35

  5. Eine minimalste Nebenbemerkung:

    > Das Internet ist alt, und damals hat noch niemand daran
    > gedacht, dass es auch andere Sprachen als Englisch
    > gibt, deshalb baut alles auf ASCII auf, also mehr oder
    > weniger alles was auf einer englischen Tastatur zu
    > finden ist.

    Die eigentliche Ursache war, dass formal jedes Zeichen nur ein Byte (genauer eigentlich 7Bit) belegen durfte, weil es sonst zu Problemen kommen konnte. Wer sich mal die Diskussion zum Unicode-Support in PHP angeschaut hat, wird festgestellt haben, dass das heute nicht großartig anders is 😉 Auf jeden Fall passt in die 7Bit nun wirklich nicht viel rein, weswegen man sich auf den ASCII-Satz geeinigt hat.

    KingCrunch

    27 Jul 11 at 11:42

  6. Eine Alias-Domain / E-Mail mit Umlauten sollte man zwingend nutzen wenn möglich. Wenn ich Herrn Müller von Firma xyz schreibe, dann schreibe ich eben intuitiv mülller@xyz.de. Da heutzutage eh kaum jemand nur eine E-Mail-Adresse hat sondern viel mit Aliasen gearbeitet wird, sollte man die Umlaute dort zwingend auch nutzen.

    Ulf Kirsten

    28 Jul 11 at 08:20

  7. > Also überprüft euren Code darauf ob ihr eventuell ein Problem habt

    Ja, mach das mal :-p
    Dein WordPress auto-verlinkt nämlich in der Zeile
    file_get_contents(‚http://www.müller.de‘)
    den URL bis einschließlich zum „m“ … und dann war Schluss *g*

    ChrisB

    4 Aug 11 at 02:43

  8. (OK, in den Kommentaren macht’s das offenbar nicht, aber oben im Code im Post.)

    ChrisB

    4 Aug 11 at 02:44

Leave a Reply

You can add images to your comment by clicking here.