benni: http-request

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

  1. 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

  2. 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

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. 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

      1. 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

        1. 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

          --
          Hast Du einen Beitrag? Nur her damit!
          http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
          SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
          sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
          1. 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

            1. 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

        2. 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

          --
          Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
          1. 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: password

            Wenn 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

      2. 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

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
        1. 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