DiamondDog: Probleme mit PHP functionen nach Server umzug

Hallo Leute,
also ich hab mehrer Probleme mit meinen PHP Scripten, ich bin auf einen anderen Server umgezogen und jetzt zeigen die Script nur noch Fehler an und ich weiß leider nicht wieso.

Hier mal der Link zur neuen Seite (Fehler sind dann schon zu sehen):
http://www.diamonddoghamm.de/

Neben bei hier mal der Link zu PHP Info (neue Seite):
http://www.diamonddoghamm.de/phpinfo.php

alte Seite:
http://diamonddog.di.funpic.de/phpinfo.php

Ich hoffe es kann mir jemand sagen wo drann das liegt, und wie ich alles wieder ans laufen bekomme.

Danke schon mal fürs Helfen.

Mfg Dog

  1. Hi there,

    Ich hoffe es kann mir jemand sagen wo drann das liegt, und wie ich alles wieder ans laufen bekomme.

    vermutlich waren auf Deinem alten Server die Register-Globals auf on gesetzt, und Dein Script versucht nun, unbekannte Variablen auszuwerten...

    1. Hi there,

      »» Ich hoffe es kann mir jemand sagen wo drann das liegt, und wie ich alles wieder ans laufen bekomme.

      vermutlich waren auf Deinem alten Server die Register-Globals auf on gesetzt, und Dein Script versucht nun, unbekannte Variablen auszuwerten...

      Ja damit hast du recht auf dem neuen Server sind die aus.

      1. Hallo,

        ich vermute auf dem Funpic Server war das Error Reporting für Notice ausgeschaltet...

        error reporting 6135

        ...auf dem neuen halt nicht...

        Gruß Jan

        1. Hi,

          ich vermute auf dem Funpic Server war das Error Reporting für Notice ausgeschaltet...
          error reporting 6135

          gut beobachtet!

          ...auf dem neuen halt nicht...

          Stimmt. Das dürfte die Erklärung sein.
          Btw, was macht list(...), wenn das Array auf der rechten Seite der Zuweisung weniger Elemente hat, als die Liste Variablen enthält? Das Manual schweigt sich über diesen Fall aus. Aber das könnte genau die "Undefined index 1"-Meldung sein.

          DiamondDog berichtet doch, dass diese Zeile die Meldung verursacht:

          list ($ident, $stempel) = explode ('|', $zeile, 2);

          So wie er die Datei schreibt, nämlich immer eine Zeile gefolgt von \n, bekommt man beim Auslesen immer eine Leerzeile, bevor feof() reagiert. Und explode() auf einen Leerstring angewandt, ergibt ein Array mit nur einem Element, nämlich dem besagten Leerstring.

          Es handelt sich also um einen "Fehler", der schon immer da war und beim bisherigen Hoster nur nicht gemeldet wurde.

          In diesem Fall halte ich es sogar für legitim, den Error Suppression Operator @ vor die list-Anweisung zu setzen. Schöner wäre es natürlich, den Fall vorher abzufragen.

          So long,
           Martin

          --
          Die neue E-Mailadresse des Papstes: mailto:urbi@orbi
          1. In diesem Fall halte ich es sogar für legitim, den Error Suppression Operator @ vor die list-Anweisung zu setzen. Schöner wäre es natürlich, den Fall vorher abzufragen.

            Ok und jetzt noch mal für Leute, die nicht so super PHP können ;)
            Ok hab verstanden das ich was am anfang des codes setzen soll, jetzt nur meine Frage was genau?

          2. Hello,

            Btw, was macht list(...), wenn das Array auf der rechten Seite der Zuweisung weniger Elemente hat, als die Liste Variablen enthält? Das Manual schweigt sich über diesen Fall aus. Aber das könnte genau die "Undefined index 1"-Meldung sein.

            Notice: Undefined offset: 5 in C:\Programme\xampp\htdocs\test\array\list.php on line 17
            Notice: Undefined offset: 4 in C:\Programme\xampp\htdocs\test\array\list.php on line 17

            Reicht das als Antwort?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  2. Hallo!

    also ich hab mehrer Probleme mit meinen PHP Scripten, ich bin auf einen anderen Server umgezogen und jetzt zeigen die Script nur noch Fehler an und ich weiß leider nicht wieso.
    Hier mal der Link zur neuen Seite (Fehler sind dann schon zu sehen):
    http://www.diamonddoghamm.de/

    Ich seh keine PHP-Fehler. Nur 2 Notice-Meldungen.
    Informiere dich über error-reporting und die Ursache für deine Meldungen.

    Grüße, Matze

  3. Hallo,

    ich bin auf einen anderen Server umgezogen und jetzt zeigen die Script nur noch Fehler an

    dann verrate uns bloß nicht, was für Fehler! ;-)

    Hier mal der Link zur neuen Seite (Fehler sind dann schon zu sehen):
    http://www.diamonddoghamm.de/

    "Undefined offset: 1 in /var/www/web49/html/diamonddog/user_online.php on line 58"

    Du benutzt in Zeile 58 einen Index (vermutlich zum Zugriff auf ein Array), den damit indizierten Wert gibt es aber nicht. Was steht in Zeile 58?

    Neben bei hier mal der Link zu PHP Info (neue Seite):
    http://www.diamonddoghamm.de/phpinfo.php
    alte Seite:
    http://diamonddog.di.funpic.de/phpinfo.php

    Nimm diese phpinfo-Seiten bitte schnell wieder vom Netz. Sie verraten sehr viel über die Einstellungen und Interna deines Servers, und stoßen Hacker möglicherweise mit der Nase auf Zugriffsmöglichkeiten, von denen du nicht einmal geträumt hast.

    Ich sehe, dass dein bisheriger Webspace (funpic) noch die Krücke register_globals=on hat, während dein neuer Hoster (TerraTransit) diese Option abgeschaltet hat, wie sich das gehört. Eventuell verlassen sich deine Scripte noch auf diese Krücke? Dann wäre es höchste Zeit, sie auf einen aktuellen Stand zu bringen.

    So long,
     Martin

    --
    Die letzten Worte des Privatdetektivs:
    Jetzt wird es mir klar: SIE sind der Mörder!
    1. Hallo Martin,

      Nimm diese phpinfo-Seiten bitte schnell wieder vom Netz. Sie verraten sehr viel über die Einstellungen und Interna deines Servers, und stoßen Hacker möglicherweise mit der Nase auf Zugriffsmöglichkeiten, von denen du nicht einmal geträumt hast.

      Das halte ich, ehrlich gesagt, für Blödsinn!
      Viele Provider stellen ihre phpinfo() sogar öffentlich ins Netz, damit man als interessierter/potentieller Kunde weiß worauf man sich einlässt.
      In der Regel ist PHP auch nicht so schwach konfiguriert, dass man nur durch phpinfo() eine Angriffsfläche finden kann.

      Grüße, Matze

      1. Hi,

        »» Nimm diese phpinfo-Seiten bitte schnell wieder vom Netz. Sie verraten sehr viel über die Einstellungen und Interna deines Servers, und stoßen Hacker möglicherweise mit der Nase auf Zugriffsmöglichkeiten, von denen du nicht einmal geträumt hast.
        Das halte ich, ehrlich gesagt, für Blödsinn!

        ich nicht, denn in diesen Info-Seiten sind sämtliche Einstellungen aufgelistet, sowie die genauen Dateipfade etlicher Konfigurationsdateien. Sollte die Konfiguration also sicherheitstechnisch ungünstige Details aufweisen, werden die hier gnadenlos offengelegt. Das meinte ich mit "mit der Nase drauf stoßen", auch wenn die Angreifer etwa eine bestimmte Version eines Moduls oder Kombinationen von Modulen als angreifbar kennen.

        Das heißt nicht, dass dieselbe Konfiguration ohne Veröffentlichung dieser Details sicherer wäre; security by obscurity war noch nie auf Dauer wirksam. Aber -um mal wieder einen hinkenden Vergleich zu bemühen- wenn ich weiß, dass das Schloss an der Beifahrertür meines Autos kaputt ist und nicht richtig schließt, dann werde ich mir nicht auch noch einen Zettel mit der Aufschrift "HIER OFFEN" ins Fenster hängen.

        Viele Provider stellen ihre phpinfo() sogar öffentlich ins Netz, damit man als interessierter/potentieller Kunde weiß worauf man sich einlässt.

        Ja. Dann sind aber viele Dateipfade anonymisiert, oder der Hoster weiß sicher, dass seine Festung "dicht" ist. Normalerweise sollte das überall der Fall sein, aber du weißt ja, Theorie und Praxis ...

        In der Regel ist PHP auch nicht so schwach konfiguriert, dass man nur durch phpinfo() eine Angriffsfläche finden kann.

        Nicht direkt. Aber wenn ich eine detaillierte technische Beschreibung der Alarmanlage habe, sind meine Chancen, unerkannt in ein Gebäude zu kommen, ungleich größer.

        Ciao,
         Martin

        --
        Es gibt Dinge, die sind sooo falsch, dass nicht einmal das Gegenteil stimmt.
        1. Hallo,

          prinzipiell bin ich als Kunde nicht(!) für die Fehlkonfigurationen meines Providers verantwortlich. Ein Provider, der die Ausgabe von phpinfo() nicht allgemein veröffentlichen kann, gehört vom Netz genommen.

          Gruß aus Berlin!
          eddi

          --
          Ab einem gewissen Erkenntnisstand ist die Versuchung wohl zu groß, in diesem und seinen begleitenden Errungenschaften zu verharren.
          Das nenne ich Aufblick zu den Stufen des Tempels von der geistigen Gosse aus!
    2. Also in Zeile 58 steht:

        
          // trenne Identifikationskriterium von Zeitstempel  
          list ($ident, $stempel) = explode ('|', $zeile, 2);  
      
      

      Das ganze Script sieht so aus:

        
      <?php  
      /*  
        user_online.php - Anzahl der Besucher Online  
      */  
        
      // Konfiguration  
      $besucher_online_konfiguration = array (  
        // in welcher Datei soll es gespeichert werden  
        'datei' => 'txt/useron/user_ips.txt',  
        // wie lange soll es dauern, bis ein Eintrag verfällt  
        'zeitlimit' => 300 // 5 Minuten = 300  
      );  
        
      // zählt den aktuellen Besucher  
      function zaehle_besucher ($ident) {  
        // hole die Liste  
        $liste = hole_besucher_liste ();  
        
        // fuege das aktuelle Identifikationskriterium mit aktuellem Datum hinzu  
        $liste[$ident] = time ();  
        
        // schreibe die Liste  
        schreibe_besucher_liste ($liste);  
      }  
        
      // holt die Liste aus einer Datei  
      function hole_besucher_liste () {  
        // importiere die Konfiguration  
        global $besucher_online_konfiguration;  
        
        // initialisiere Array  
        $zeilen = array ();  
        
        // öffne datei  
        $fh = fopen ($besucher_online_konfiguration['datei'], 'r');  
        
        // fehler?  
        if (!is_resource ($fh)) {  
          return array ();  
        }  
        
        // sperre datei  
        $res = flock ($fh, LOCK_SH);  
        
        // gehe Zeilen durch  
        while (!feof ($fh)) {  
          $zeilen[] = fgets ($fh);  
        }  
        
        // entsperre Datei und schließe sie  
        flock ($fh, LOCK_UN);  
        fclose ($fh);  
        
        $ergebnis = array ();  
        // gehe die Zeilen durch  
        foreach ($zeilen as $zeile) {  
          // trenne Identifikationskriterium von Zeitstempel  
          list ($ident, $stempel) = explode ('|', $zeile, 2);  
          // wenn Identifikationskriterium leer ist, dann übergehen  
          if (empty ($ident)) {  
            continue;  
          }  
        
          // wenn stempel zu alt ist  
          if ($stempel < time() - $besucher_online_konfiguration['zeitlimit']) {  
            // übergehen  
            continue;  
          }  
        
          // füge zum Ergebnis hinzu  
          $ergebnis[$ident] = (int)$stempel;  
        }  
        return $ergebnis;  
      }  
        
      // gibt die Anzahl der Besucher zurück  
      function anzahl_besucher () {  
        return count (hole_besucher_liste ());  
      }  
        
      // schreibe die Liste zurück  
      function schreibe_besucher_liste ($liste) {  
        // importiere die Konfiguration  
        global $besucher_online_konfiguration;  
        
        $ergebnis = '';  
        // gehe die Liste durch  
        foreach ($liste as $ident => $stempel) {  
          $ergebnis .= "$ident|$stempel\n";  
        }  
        
        // öffne datei  
        $datei = fopen ($besucher_online_konfiguration['datei'], 'w');  
        
        // sperre datei  
        flock ($datei, LOCK_EX);  
        
        // Fehler?  
        if (!is_resource ($datei)) {  
          return false;  
        }  
        
        // schreibe das ergebnis  
        $cnt = fwrite ($datei, $ergebnis);  
        
        // fehler?  
        if ($cnt === false) {  
          // entsperren und schließen  
          flock ($datei, LOCK_UN);  
          fclose ($datei);  
          return false;  
        }  
        
        // schließe die Datei  
        flock ($datei, LOCK_UN);  
        fclose ($datei);  
        
        // wir sind fertig  
        return true;  
      }  
        
      ?>  
      
      

      Leider hab ich nicht die große Ahnung von PHP das ich es alleine hinbekomme das um zu schreiben. Wäre also super wenn mir da jemand Helfen könnte.

      1. Hallo DiamondDog,

        Leider hab ich nicht die große Ahnung von PHP das ich es alleine hinbekomme das um zu schreiben. Wäre also super wenn mir da jemand Helfen könnte.

        in dem Fall passiert nichts weiter, als das vermutlich eine Leerzeile eingelesen wird. Die PHP-Meldung ist also ganz unspektakulär und unbedenklich.
        Setze einmalig in jedes Script, was eine Notiz erzeugt hinter dem ersten "<?php" einfach nur error_reporting(E_ERROR | E_PARSE);!

        <?php  
        error_reporting(E_ERROR | E_PARSE);  
        # restlicher Code ...
        

        Gruß aus Berlin!
        eddi

        --
        Ab einem gewissen Erkenntnisstand ist die Versuchung wohl zu groß, in diesem und seinen begleitenden Errungenschaften zu verharren.
        Das nenne ich Aufblick zu den Stufen des Tempels von der geistigen Gosse aus!
        1. <?php

          error_reporting(E_ERROR | E_PARSE);

          restlicher Code ...

            
          Ok das hat geholfen.  
            
          Danke an alle für ihre schnelle Hilfe!
          
      2. Hello,

        Das ganze Script sieht so aus:

        Das Script ist nicht sehr sauber geschrieben. Abgesehen davon, bedeutet eine IP nicht 'ein Client', denn manche Clients wechseln mit jedem Request ihre IP, aber das wusstest Du sicherlich schon.

        <?php

        // Konfiguration
        $besucher_online_konfiguration = array (
          // in welcher Datei soll es gespeichert werden
          'datei' => 'txt/useron/user_ips.txt',

        Diese Datei ist bei Dir auch direkt über HTTP erreichbar.
        Das kannst Du bei Standardeinrichtungen von Apache verhindern, indem
        Du einfach den Namen der Datei mit '.ht' beginnen lässt.

        'datei' => 'txt/useron/.htuser_ips.txt',

        // wie lange soll es dauern, bis ein Eintrag verfällt
          'zeitlimit' => 300 // 5 Minuten = 300
        );

        // zählt den aktuellen Besucher
        function zaehle_besucher ($ident)

        {

        // hole die Liste
          $liste = hole_besucher_liste ();

        // fuege das aktuelle Identifikationskriterium mit aktuellem Datum hinzu
          $liste[$ident] = time ();

        // schreibe die Liste
          schreibe_besucher_liste ($liste);
        }

        Das Holen der Liste und das anschließende Schreiben muss gemeinsam durch ein LOCK_EX geklammert werden, wenn das Script ordentlich arbeiten soll. Sonst fängst Du Dir ein TOCTOU-Problem ein [link:http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use], da ja im Normalfall auch mehrere verschiedenen Clients gleichzeitig Requests senden können, die dann nebenläufig abgehandelt werden.

        Das Öffnen und Locken der Datei sollte daher außerhalb der Teilfunktionen stattfinden und diese sollten das Handle übergeben bekommen.

        // holt die Liste aus einer Datei
        function hole_besucher_liste () {
          // importiere die Konfiguration
          global $besucher_online_konfiguration;

        Das Arbeiten mit globalen Variablen führt die Nutzung von Funktionen i.d.R. ad absurdum.
        Übergebe den Funktionen die Werte als Argumente oder Referenzen auf die Werte.

        // initialisiere Array
          $zeilen = array ();

        // öffne datei
          $fh = fopen ($besucher_online_konfiguration['datei'], 'r');

        // fehler?
          if (!is_resource ($fh)) {
            return array ();
          }

        // sperre datei
          $res = flock ($fh, LOCK_SH);

        // gehe Zeilen durch
          while (!feof ($fh)) {
            $zeilen[] = fgets ($fh);
          }

        // entsperre Datei und schließe sie
          flock ($fh, LOCK_UN);

        Das Entsperren ist überflüssig, wenn Du die Datei gleich anschließend schließt.
        Es kann sogar zu Fehlern führen. Wenn Du explizit entsperren willst, musst Du vorher die Buffers der Datei leeren, damit auch wirklich alles Weggescchrieben wird. fflush($fh);
        [link:http://de3.php.net/manual/en/function.fflush.php]

        fclose ($fh);

        $ergebnis = array ();
          // gehe die Zeilen durch
          foreach ($zeilen as $zeile)

        {

        // trenne Identifikationskriterium von Zeitstempel
            list ($ident, $stempel) = explode ('|', $zeile, 2);
            // wenn Identifikationskriterium leer ist, dann übergehen
            if (empty ($ident))

        {

        continue;
            }

        // wenn stempel zu alt ist
            if ($stempel < time() - $besucher_online_konfiguration['zeitlimit']) {
              // übergehen
              continue;
            }

        // füge zum Ergebnis hinzu
            $ergebnis[$ident] = (int)$stempel;
          }
          return $ergebnis;
        }

        // gibt die Anzahl der Besucher zurück
        function anzahl_besucher ()

        {

        return count (hole_besucher_liste ());
        }

        // schreibe die Liste zurück
        function schreibe_besucher_liste ($liste)

        {

        // importiere die Konfiguration
          global $besucher_online_konfiguration;

        $ergebnis = '';
          // gehe die Liste durch
          foreach ($liste as $ident => $stempel) {
            $ergebnis .= "$ident|$stempel\n";
          }

        // öffne datei
          $datei = fopen ($besucher_online_konfiguration['datei'], 'w');

        // sperre datei
          flock ($datei, LOCK_EX);

        // Fehler?
          if (!is_resource ($datei)) {
            return false;
          }

        Diese beiden Statements sind zusätzlich zum TOCTOU-Problem in der falschen Reihenfolge

        öffnen
            Öffnung prüfen
            sperren
            Sperre prüfen
            arbeiten
            schließen

        // schreibe das ergebnis
          $cnt = fwrite ($datei, $ergebnis);

        // fehler?
          if ($cnt === false) {
            // entsperren und schließen
            flock ($datei, LOCK_UN);
            fclose ($datei);
            return false;
          }

        // schließe die Datei
          flock ($datei, LOCK_UN);
          fclose ($datei);

        // wir sind fertig
          return true;
        }

        ?>

          
        Außerdem dauern die Aufgaben in diesem Script ein paar Millisekunden und die Liste der IPs könnte etwas länger werden. Was ist, wenn ein User mittendrin, kurz nachdem er geklickt hat, die Lust verliert, auf die Response zu warten und sein Browserfenster schließt.  
          
        Dann gibt es einen User-Abort, der das Script sofort beendet. Es könnte passieren, dass die Datei dann noch nicht vollständig zurückgeschrieben worden ist. Damit wäre sie kaputt.  
        <http://de3.php.net/manual/en/function.ignore-user-abort.php>  
          
        HTTP ist zwar normalerweise verbindungslos, wenn aber die Verbindung zum Client mitten in der Abarbeitung des Besuches (genauer: während der Erzeugung der Response) gekappt wird, bekommt PHP das doch mit. Die Scripte liegen in der "Responsetime" des Dialoges.  
          
          
          
          
          
          
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
        Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>