Du machst beim Senden ungefähr folgendes:
Code:
// Client-Seite
$user = 'XXX';
$pass = 'yyy;
$time = sprintf ('%08d', time ());
$s = sprintf ('%s%s%s', $time, $user, $pass, $ip);
$md5 = md5 ($s);
GET http://xxx/xx.php?time=$time&ip=$ip&auth=$md5
Auf der Serverseite dann das Gegenstück
Code:
$user = 'XXX';
$pass = 'yyy;
$time = $_REQUEST['time'];
$ip = $_REQUEST['ip'];
$s = sprintf ('%s%s%s', $time, $user, $pass, $ip);
$md5 = md5 ($s);
if ($md5 != $_REQUEST['auth'])
die 'Fehler';
if (abs ($time - time () > 60)
die 'Fehler';
Das macht folgendes:
Der Client konstruiert einen String aus aktueller Uhrzeit, IP-Adresse, Name und Paßwort. Daraus wird ein MD5 Hash erzeugt, der zum Server gesendet wird.
Der Server konstuiert den gleichen String aus den mitgesendeten Werten Uhrzeit und IP-Adresse und dem bekannten Namen und Paßwort. Wenn der MD5 Hash identisch ist, kann man davon ausgehen, daß Namen und Paßwort korrekt sind.
Die Prüfung der Uhrzeit verhindert, daß jemand später das gültige Paket nochmal senden kann und der Server es akzeptiert (Replay Attack). Der Wert 60 (Sekunden) hier ist nur ein Beispiel. Nun könnte ein Angreifer das Paket nochmal innerhalb der 60 Sekunden schicken und der Server würde es in dieser Zeit akzeptieren. Das Paket ist aber nur gültig, wenn auch die IP-Adresse unverändert ist. Ein Angreifer könnte also nur innerhalb von 60 Sekunden nochmal die gleiche IP-Adresse übertragen, die man auch selbst schon übertragen hat. Das würde ihm also nicht viel nützen.
Was bei diesem Verfahren wichtig ist, ist die richtige Uhrzeit auf dem Client, sonst werden Änderungen vom Client aufgrund der Zeitdifferenz auch abgewiesen.
Das ist übrigens auch das Prinzip, das für die Updates von DNS-Einträgen über das DNS-Update Protokoll verwendet wird (RFC2136). Unter Linux gibt es dafür das Programm nsupdate.
Dies ist auch das Verfahren, das ich am liebsten für DNS-Updates verwende. Man braucht dafür nur einen DNS-Server, der entsprechend konfiguriert ist. Über nsupdate kan man mit den nötigen Zugriffsrechten beliebige Änderungen im DNS vornehmen, die Übermittlung ist sehr effizient (ein UDP Paket Anfrage und eine UDP Antwort), und es braucht keinen Web-Server zusätzlich zum DNS-Server. Im Fall von DynDNS und ähnlichen wird vermutlich vom Web-Server die DNS-Update Anfrage an den DNS-Server geschickt. Mit nsupdate auf dem Client macht man das gleich selbst.