http-request
benni
- php
Hi!
ich will ein script schreiben, mit dem ich meinen account bei dyndns.org per php updaten kann.
dazu muss ich laut dyndns.org irgendwie einen http-request machen, der z.B. folgendermaßen aussieht:
http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23
ich habs probiert mit header("Location ..."); , aber da muss ich mich extra mit dem server autentifizieren (es kommt dieses benutzername-eingeben fenster, wenn ich das script im browser ausführe...).
hat da jemand eine idee?
viele grüße und besten dank,
benni
Hallo benni,
http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23
Das ist keine gültige HTTP-URL. Im Archiv erfährst Du, warum.
hat da jemand eine idee?
Simuliere einen eigenen HTTP-Request per PHP. Im Archiv gibt es im Zusammenhang von Formularen doppelt abschicken bzw. Simulation eines Post-Requests und ähnlichem einige Threads zum Thema. Du solltest Dir desweiteren RFC 2617 (http://www.ietf.org/rfc/rfc2617.txt) durchlesen - dort wird der Mechanismus der HTTP-Ameldung beschrieben, wie Du ihn einsetzen musst, um Deine Aufgabe zu realisieren. (Du brauchst Basic Authentification, Digest Authentification ist für Dich belanglos)
Desweiteren dürfte RFC 2616 für Dich recht interessant sein: http://www.w3.org/Protocols/rfc2616/rfc2616.html. Dort wird das HTTP-Protokoll selbst beschrieben.
Viele Grüße,
Christian
Moin Moin !
Auch wenn mich gleich alle schlagen:
Je nach dem, wie (un)sicher PHP eingestellt ist, kannst Du einfach mit fopen('http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23') die URL als Datei öffnen und auslesen.
Warum mich alle schlagen wollen:
1. Die URL mit username:password@ ist so nicht legal, HTTP-URLs dürfen weder Usernamen noch Password enthalten.
2. fopen für URLs zu benutzen funktioniert bestenfalls zufällig.
3. PHP dafür zu verwenden ist eine echt blöde Idee, denn Du mußt die PHP-Seite ja auch irgendwie aufrufen.
Besser, aber nicht optimal:
lynx -source http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23 > /dev/null
(oder lynx -source http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23 > nul unter Windows)
Es gibt bei dyndns.org übrigens eine lange Liste von Tools für genau diesen Zweck.
Alexander
Hallo Alexander,
fopen('http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23')
Huch, das geht ja sogar... ich dachte, PHP würde sich am invaliden URL-Teil stoßen... Aber anscheinend funktioniert es...
Viele Grüße,
Christian
Hi Christian,
fopen('http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23')
Huch, das geht ja sogar... ich dachte, PHP würde sich am invaliden URL-Teil stoßen...
Nö, warum denn das? Viel wichtiger ist doch, dass der Server das annimmt...
Ausserdem kommt es bei PHP hauptsächlich darauf an, dass die fopen-wrappers auf on gestellt sind, auch wenn ich das verabscheue, man stelle sich vor, die ganzen Scriptkiddies merken, dass damit HTTP-Includes funktionieren *schauder*
Aber anscheinend funktioniert es...
Ja. Ich halte es, da gebe ich euch beiden Recht, für ziemlich ineffizient. Theoretisch ist da sogar ein Shell-Script in Verbindung mit wget besser geeignet.
Fabian
Hallo Fabian,
Viel wichtiger ist doch, dass der Server das annimmt...
Nö, wieso? Der Server sollte username:password@ eigentlich gar nicht zu Gesicht bekommen. Im Archiv wurde über username:password@ und Serverlogfiles und ähnliches diskutiert - dort wurde auch beschrieben, wie sich Browser verhalten.
man stelle sich vor, die ganzen Scriptkiddies merken, dass damit HTTP-Includes funktionieren *schauder*
Hmmm. Ich validiere meine Eingaben, daher _kann_ mir so etwas nicht passieren, egal ob mit aktiven oder inaktiven fopen-wrappers. An sich finde ich die ganz praktisch - m.E. nach sollten sie aber für include/require abschaltbar sein und auch standardmäßig abgeschaltet sein.
Theoretisch ist da sogar ein Shell-Script in Verbindung mit wget besser geeignet.
Hmmm. Ich verwende dafür ein Perl-Script, das addns (oder adddns) heißt.
Viele Grüße,
Christian
Hi Christian,
Viel wichtiger ist doch, dass der Server das annimmt...
Nö, wieso? Der Server sollte username:password@ eigentlich gar nicht zu Gesicht bekommen. Im Archiv wurde über username:password@ und Serverlogfiles und ähnliches diskutiert - dort wurde auch beschrieben, wie sich Browser verhalten.
PHP ist aber kein Browser, sondern nur ein HTTP-Client in der Situation. Es lohnt sich also, in die Source zu schauen, wie fopen realisiert ist. Würde mich interessieren.
man stelle sich vor, die ganzen Scriptkiddies merken, dass damit HTTP-Includes funktionieren *schauder*
Hmmm. Ich validiere meine Eingaben, daher _kann_ mir so etwas nicht passieren, egal ob mit aktiven oder inaktiven fopen-wrappers.
Klar, _du_ weißt um die Risiken. Aber du kennst doch die typischen PHP-Newbies ;-)
An sich finde ich die ganz praktisch - m.E. nach sollten sie aber für include/require abschaltbar sein und auch standardmäßig abgeschaltet sein.
Full ACK.
Theoretisch ist da sogar ein Shell-Script in Verbindung mit wget besser geeignet.
Hmmm. Ich verwende dafür ein Perl-Script, das addns (oder adddns) heißt.
Ich verwende momentan ddclient für Debian testing.
Fabian
Hi!
PHP ist aber kein Browser, sondern nur ein HTTP-Client in der Situation.
Ein Browser ist auch nichts anderes als ein HTTP-Client!
Es lohnt sich also, in die Source zu schauen, wie fopen realisiert ist. Würde mich interessieren.
Was gibts da groß zu sehen? Es wird geprüft welcher wrapper, dann wird der String entsprechend geparst und in einen echten HTTP, FTP oder was -weiß-ich-Request übersetzt und dieser wird abgeschickt.
man stelle sich vor, die ganzen Scriptkiddies merken, dass damit HTTP-Includes funktionieren *schauder*
Bei der Variante hinterläßt PHP aber einen netten Fingerabdruck in den Logs ;-)
Grüße
Andreas
Moin Moin !
Hi Christian,
fopen('http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23')
Huch, das geht ja sogar... ich dachte, PHP würde sich am invaliden URL-Teil stoßen...
Nö, warum denn das? Viel wichtiger ist doch, dass der Server das annimmt...
Der Server sollte das gar nicht zu Gesicht bekommen, der PHP-Wrapper sollte in ungefähr folgenden HTTP-Request zerlegen:
GET /nic/update?.... HTTP/1.0
Host: members.dyndns.org
Username: username
Password: password
Wenn fopen nur eine GET-Zeile mit der ganzen URL senden würde, hätte der Server allen Grund zu "400 Bad Request".
Alexander
Hi Alexander,
Der Server sollte das gar nicht zu Gesicht bekommen, der PHP-Wrapper sollte in ungefähr folgenden HTTP-Request zerlegen:
GET /nic/update?.... HTTP/1.0
Host: members.dyndns.org
Username: username
Password: passwordWenn fopen nur eine GET-Zeile mit der ganzen URL senden würde, hätte der Server allen Grund zu "400 Bad Request".
Ja, das schreibst du in deinem anderen Posting ja bereits. Wie du schon sagst, man müsste jetzt eben in die Source schauen, wie das implementiert ist...
Ob nun schluderig oder nicht, es ist das Verhalten, was man von einem "modernen" UA verlangt, nicht...?
Fabian
Moin Moin !
fopen('http://username:passwort@members.dyndns.org/nic/update?system=dyndns&hostname=benni.homelinux.net&myip=80.136.45.23')
Huch, das geht ja sogar... ich dachte, PHP würde sich am invaliden URL-Teil stoßen... Aber anscheinend funktioniert es...
Gut, was? Insbesondere, wo ich "keine Silbe" PHP spreche. Aber irgendwann in den letzten Wochen hatten wir schonmal sowas ähnliches, wo jemand schon bis fopen('http://host') gekommen war und ihm nur noch der Account fehlte. Und da habe ich einfach die (ungültige, aber IMHO überall funktionierende) user:pass@-Geschichte vorgeschlagen und es funktionierte.
Entweder haben die PHP-Leute das user:pass@-"Verbot" übersehen, oder im Sinne der "faulen" Programmierer ignoriert und user:pass@ so implementiert wie in jedem mir bekannten Browser.
... schnell in php.net geblättert ...
http://www.php.net/manual/de/function.fopen.php linkt auf http://www.php.net/manual/de/wrappers.php, und dort sind user:pass@host-URLs für HTTP und HTTPS in fopen angegeben. Scheint wohl Absicht zu sein. ;-)
Alexander
Hi!
... schnell in php.net geblättert ...
Es gibt sogar:
fopen("ftps://...")
fopen("compress.zlib://...")
fopen("compress.bzip2://...")
fopen("php://output")
fopen("php://input")
...
viel halte ich davon allerdings auch nicht.
Grüße
Andreas