Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehler in txt Datei

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fehler in txt Datei

    Hallo, ich will auf meiner Seite bei jeden Aufruf ein paar Informationen mitloggen um Statistiken zu generieren. Das ganze passiert über eine txt-Date. Funktioniert auch soweit, nur immer wieder passiert es, dass in die Textdatei sehr merkwürdige Sachen geschrieben werden, die dann im firefox nur mit vielen ????? dargestellt werden.

    PHP-Code:
    if (!file_exists("userlogs.txt")) { $datei=fopen("userlogs.txt","w"); fclose($datei); }
                
    $userlogfile=fopen("userlogs.txt","a");
                
    fputs($userlogfile,"$Uhrzeit | $ip | $pagename | $info20\n");
                
    fclose($userlogfile); 
    Ist da drin irgendwie ein Fehler? Wenn ich die Logdatei in den Editor kopiere, sehe ich statt der ??? lauter leere Rechtecke. Woher können diese komischen Zeichen kommen? Es sind auch nicht immer gleich viele solche Zeichen, mal mehr mal weniger. Versteh ich nicht.

    Also die Logs sehen z.B. so aus:

    19.05.2007 um 19:30 | 084.xxx.xxx.xxx | hinweise | Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
    19.05.2007 um 20:39 | 080.xxx.xxx.xxx | Gallery | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    �������������������������������������������������� ���19.05.2007 um 21:06 | 172.176.049.218 | Links | Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
    19.05.2007 um 21:06 | 172.xxx.xxx.xxx | Home | Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3

  • #2
    Das ist ein Zeichensatzfehler. Versuch mal im FF unter "Anzeige" den Zeichensatz manuell zu ändern und schau, was dann da so raus kommt.

    Was sollte denn in $info20 normalerweise so stehen?
    Nicht jeder Fehler ist ein Bug.

    Kommentar


    • #3
      Versuch mal die Werte dieser Zeichen herauszufinden, zum Beispiel in dem du die Zeichen an die PHP-Funktion ord() übergibst.
      Dadurch bekommst du heraus, um welches Zeichen es sich handelt. Vielleicht kommst du dem ganzen dann damit auf die Schliche.

      Wie generierst du denn $Uhrzeit und $info20 und warum verwendest du mal Englisch mal Deutsche begriffe?

      Kommentar


      • #4
        Hab im FF mal einige durchprobiert, da kamen trotzdem die ??? raus.

        Hier mal das gesamte Teil:

        PHP-Code:
        $ip getenv("REMOTE_ADDR");
        $logintime=time();
        $Uhrzeit date("d.m.Y u\m H:i ",$logintime);
            
        $info20=getenv("HTTP_USER_AGENT");
            
        if (!isset(
        $pagename)) $pagename='_';
            
        $laenge=strlen($ip);
            
        $ipteile=explode(".",$ip);
        $ipformat=sprintf("%-15s"$ip);
        $teil1=sprintf("%03s"$ipteile[0]);
        $teil2=sprintf("%03s"$ipteile[1]);
        $teil3=sprintf("%03s"$ipteile[2]);
        $teil4=sprintf("%03s"$ipteile[3]);
        $ipteileformat=array("$teil1","$teil2","$teil3","$teil4");
        $ipfertig=implode(".",$ipteileformat);
            
        if(
        strlen($pagename)>13)
        {
            
        $pagename=substr($pagename,0,13);
        }
            
        $pagename=sprintf("%-13s",$pagename);


        if (!
        file_exists("userlogs.txt")) { $datei=fopen("userlogs.txt","w"); fclose($datei); }
                    
        $userlogfile=fopen("userlogs.txt","a");
                    
        fputs($userlogfile,"$Uhrzeit | $ipfertig | $pagename | $info20\n");
                    
        fclose($userlogfile); 

        Deutsch und Englisch gemischt...hm Zufall
        Hab mir die Datei jetzt vom Server geladen und mit einem Hex-Editor angeschaut. Die ??? haben den Hex-Wert 00.

        Kommentar


        • #5
          Naja, user-agent ^^ Is manipulierbar und sowieso: Vielleicht haste da nen Asiaten anner Backe Wenn dein Script dann auf Latin-1 oder son Spass läuft, weiß ja net ^^
          Nicht jeder Fehler ist ein Bug.

          Kommentar


          • #6
            Mir ist gerade nochmal was ganz komisches aufgefallen.

            folgende Zeilen waren in der Datei vorhanden (abgekürzt):

            24.05.2007 um 16:46 | TB | Polvergl
            24.05.2007 um 16:49 | Zeile1
            24.05.2007 um 16:49 | Zeile2
            24.05.2007 um 16:49 | Zeile3
            24.05.2007 um 16:51 | Zeile4
            24.05.2007 um 16:53 | Zeile5
            24.05.2007 um 16:54 | Zeile6
            24.05.2007 um 16:54 | Zeile7
            24.05.2007 um 16:54 | Zeile8
            24.05.2007 um 16:54 | Zeile9
            24.05.2007 um 16:54 | Zeile10

            Kurz darauf stand das drin:

            24.05.2007 um 16:49 | Zeile1
            24.05.2007 um 16:49 | Zeile2
            24.05.2007 um 16:49 | Zeile3
            �������������������������������������������������� �������������������������������������������������� �������������24.05.2007 um 17:08 | Zeile11
            24.05.2007 um 17:10 | Zeile12
            Die ominösen Zeichen werden also nicht angehängt, sondern bestehende Zeichen werden vermurkst


            Wie kann das mit fputs() passieren dass bestehende Zeilen einfach überschrieben werden?? Hab keine Idee mehr an was das liegen könnte. Serverfehler? Gleichzeitige Zugriffe solang die Datei noch geöffnet ist? Hmmm

            Kommentar


            • #7
              Zitat von KingCrunch
              Naja, user-agent ^^ Is manipulierbar und sowieso: Vielleicht haste da nen Asiaten anner Backe Wenn dein Script dann auf Latin-1 oder son Spass läuft, weiß ja net ^^
              Passiert leider auch manchmal wenn ich selber die Seite aufruf, und meinen User Agent kenn ich, der enthält nix was nicht dargestellt werden könnte

              Kommentar


              • #8
                Vielleicht war der User-Agent eines Benutzers ja mit einer Injection versehen. Wer weiß.
                Pragmatisch gesehen sollten wir das Problem dadurch lösen, dass du statt Dateien auf Datenbanken zugreifen solltest.

                Was spricht dagegen? Ich persönlich habe jetzt wenig Lust zu raten.

                Kommentar


                • #9
                  Zitat von Zergling
                  Vielleicht war der User-Agent eines Benutzers ja mit einer Injection versehen. Wer weiß.
                  Pragmatisch gesehen sollten wir das Problem dadurch lösen, dass du statt Dateien auf Datenbanken zugreifen solltest.

                  Was spricht dagegen? Ich persönlich habe jetzt wenig Lust zu raten.
                  Das wäre nun mein nächster Schritt, der allerdings wohl aufwändiger wird. Ich dachte vielleicht hab ich irgendwas übersehen.

                  Kommentar


                  • #10
                    Naja bei User-Input hast du immer das Problem, dass er ungefiltert Schaden anrichten kann. Vielleicht ists auch was völlig anderes. Wir können dir hier zwar Vorschläge unterbreiten, woran es liegen könnte, aber letztlich kannst nur du es rausfinden.

                    Du musst eben Abschätzen ob du das jetzt grade biegst und in 2 Wochen vielleicht wieder ein neues Problem mit den Dateien hast (zum Beispiel Datei leer, passiert auch schnell) oder ob du jetzt die Zeit zur Umstellung nutzt und dann auch für "immer" (geflügeltes Wort) Ruhe hast. Zumindest MySQL wird seinen Job richtig machen.

                    Abgesehen davon musst du ja nur eine MySQL-Tabelle anlegen und ein INSERT abschicken. Finito.

                    der allerdings wohl aufwändiger wird
                    Das kann ich also nicht bestätigen

                    Kommentar


                    • #11
                      Zitat von Zergling
                      der allerdings wohl aufwändiger wird
                      Das kann ich also nicht bestätigen
                      Kann ich nun bestätigen, funktioniert einwandfrei mit Datenbank^^
                      Und ich hab viel mehr Möglichkeiten und kann viel schönere Sachen machen. Dachte das dauert länger, aber man kommt schnell wieder rein

                      Kommentar


                      • #12
                        Siehste
                        Nicht jeder Fehler ist ein Bug.

                        Kommentar


                        • #13
                          Hab aber noch ne Frage:

                          Ich hab mir damals, als ich noch besser drin war, die Funktion geschrieben:

                          PHP-Code:
                          function bearb_text($value)
                              {
                                  if (
                          get_magic_quotes_gpc())
                                  {
                                       
                          $value stripslashes($value);
                                     }
                                     
                          $value=nl2br(strip_tags($value));
                                  
                          $value "'" mysql_real_escape_string($value) . "'";
                                  return 
                          $value;
                              } 
                          Reicht das zum Schutz vor Code-Injection bei Daten, wie z.B. dem UserAgent, die direkt in die DB geschrieben werden? Oder was ist da der "Standard"

                          Kommentar


                          • #14
                            Hallo,
                            ich würde das nl2br() weglassen und der Funktion zusätzlich den $linkidentifier von mysql_connect() übergeben. Den kanst du mysql_real_escape_string() dann als 2. Parameter übergeben. Damit die Funktion auch bei mehreren Verbindungen ordentlich funktioniert.

                            Kommentar


                            • #15
                              Ah ok, ich glaub ich weiss wie du meinst. Aber bis jetzt hab ichs so gemacht dass ich nur eine Verbindung hab.

                              Danke!

                              Kommentar

                              Lädt...
                              X