Userdaten sicher machen

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

  • Userdaten sicher machen

    Hallo,

    PHP-Code:
    $ip=trim(($ip=$_SERVER['REMOTE_ADDR'])?$ip:"");
    $ho=trim(($ho=gethostbyaddr($ip))?$ho:"");
    ...
    ... 
    Damit lese ich einige infos die der user mit seinem browser hinterläßt.
    Nun kommt es vor das ich gelegentlich in meiner log-textdatei einen zeilenumbruch habe den der client wohl in seinen daten mitbringt.

    Wie kann ich ich diese userdaten entschärfen um zB \n \r und andere zeichen unterbinden?
    Ok mit str_ireplace geht das ja ganz einfach, aber es wirkt nicht immer, jedenfalls kommen zeilenumbrüche immer noch durch!
    Es muß also noch andere zeichen geben die sowas auslosen.

    Ich weiß das man einen zeilenumbruch auch noch mit so einem hezadezimalcode schreiben kann: &...;
    Wie kann ich die mit str_ireplace abfangen? Ich kenne die zeichen nichtmal um sie in str_iraplace einzufügen!
    ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

  • #2
    Hexadezimal hat nichts mit &... zu tun!
    Du musst nur \n und \r ersetzen. Denn dein Log ist doch eine Textdatei und nur diese Zeichen sind Zeilenumbrüche.
    Wenn die Logeinträge bei der Anzeige interpretiert werden, können dabei neue Umbrüche entstehen. So wäre z.B. die Zeichenfolge <br /> in einem Textlog kein Umbruch, als HTML im Browser betrachtet aber schon.

    Kommentar


    • #3
      Hallo onemorenerd

      Sorry ich meinte diese unicode-schreibweise.

      Die zeilenumbrücje die mich stören, befinden sich direkt in der textdatei und kommen vom client mit.

      Würde mich ja nicht stören, aber weil ich die datei später auslese und die zeilenweise verarbeite...tut so ein eintrag dort drin - mein script auf den kopf stellen.

      zB Clientdaten:
      PHP-Code:
      127.0.0.1|localhost|[url]www.google.de|Mozilla/4.0[/url] (compatibleMSIE 6.0Windows 98DT)|de-de 
      Die daten hab ich jetzt selber zusammengedichtet:

      So, jetzt gibts client die in einem dieser 5 werte einen oder mehrere zeilenumbrüche drin haben.

      zB würden diese clientdaten meine textdatei zerschlagen und ich kann sie nicht mehr zeilenweise auswerten:
      PHP-Code:
      127.0.0.1|localhost\n|[url]www.google.de|Mozilla/4.0\r\n[/url] (compatibleMSIE 6.0Windows 98;\r\n DT)|de-de 
      Hier sind jetzt 4 zeilenumbrüche drin, das macht aus einer zeile gleich 4 zeilen, und meine php-auswertung erwartet in jeder zeile 4-stück | zeichen!

      Ich kann im nachhinein nicht feststellen welche zeichen diese umbrüche auslesen...ich seh sie ja später in der textdatei nicht!

      Also dachte ich mir ich "säuber" diese 5 variablen die vom client kommen so, dass ich auf jedenfall alles in einer zeile drin habe.

      Ich habe aber bereits folgendes über diese daten laufen:
      PHP-Code:
      $arr=@file("logdatei.txt");
      $arr=str_replace(array("\r","\n","\r\n"),array("","",""),$arr); 
      ...und trotzdem zwerschießt es mir die textdatei. Es müßen also noch andere zeichen geben, die einen zeilenumbruch auslösen!
      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

      Kommentar


      • #4
        Zitat von RamonaS Beitrag anzeigen
        Ich habe aber bereits folgendes über diese daten laufen:
        PHP-Code:
        $arr=@file("logdatei.txt");
        $arr=str_replace(array("\r","\n","\r\n"),array("","",""),$arr); 
        ...und trotzdem zwerschießt es mir die textdatei.
        Nein, die ist bereits "zerschossen".

        Was macht file()? Es liefert dir ein Array, in dem jedes Element eine einzelne Zeile enthält, inkl. des Umbruchs am Ende dieser Zeile.
        str_replace nimmt sich jetzt jede dieser Zeilen einzeln vor, und ersetzt Umbruchzeichen - die es aber nur noch am Zeilenende findet.
        Das "klebt" aber keine Daten wieder zusammen, die bereits fehlerhafter weise in mehrere Zeilen aufgeteilt sind.
        Es müßen also noch andere zeichen geben, die einen zeilenumbruch auslösen!
        Nein, tut es nicht. Aber dein Versuch, das Problem zu beheben, ist in der Form nicht sinnvoll.

        Selbst wenn du alle Zeilenumbrüche ersetzt - dann hast du nachher nur noch eine einzige Zeile, das kann auch kaum das sein, was du willst.
        Du müsstest dir also erst mal ein Verfahren überlegen, unerwünschte von erwünschten Zeilenumbrüchen zu unterscheiden - und das ist vermutlich gar nicht so einfach, da müsste schon ein aufwendigerer regulärer Ausdruck oder sowas in der Art her, der ein Muster definiert, mit dem alle Log-Zeilen vollständig erfassbar sind.
        EDIT:
        OK, so kompliziert ist es vielleicht gar nicht. Wenn jede Log-Zeile mit einer IP-Adresse beginnt, dann könnte man die eingelesenen Zeilen darauf prüfen, ob sie mit etwas beginnen, das einem solchen Muster entspricht. Wenn ja, ist es ein "echter" Zeilenanfang, wenn nein, dann sind die Daten dieser Zeile an die vorherigen anzufügen. Das geht natürlich nur dann, wenn in den Daten ausser am Anfang eines Datensatzes nichts vorkommt, was dem Muster einer IP-Adresse entspricht.


        Mein Vorschlag: Dateiinhalt manuell korrigieren, wenn die Anzahl der Datensätze das noch erlaubt - oder wegwerfen, und nach Behebung des Programmierfehlers mit einer neuen Statistik anfangen.
        Zuletzt geändert von wahsaga; 30.06.2009, 14:52.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Hallo wasaga...

          Sorry hab da ein fehler gebaut.
          diese zeile
          PHP-Code:
          $arr=str_replace(array("\r","\n","\r\n"),array("","",""),$arr); 
          kommt natürlich nicht beim auslesen der datei zum einsatz...da ist es ja sinnlos.

          Diese zeile steht als letztes bevor die zeile in die datei geschrieben wird!

          Ok ich habe bissl gegugld und folgende zusätzliche möglichkeiten für zeilenumbrüche gefunden:

          PHP-Code:
          # \n = %5Cn
          # \r = %5Cr
          # if(preg_match("^[\\r\\n\\t\\x20-\\x7E]+$",$field))
          # %0A = line-feed
          # %0D = carrage return
          # preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', null, $value); 
          Ich glaube wenn ich das alles vor dem schreiben einsetze sollte ruhe sein.


          >Du müsstest dir also erst mal ein Verfahren überlegen, unerwünschte von erwünschten Zeilenumbrüchen zu unterscheiden
          Es geht nur um feste daten, also ip, host, referer, agent, language usw....auf die der user normalerweise kein direkten zugriff hat.
          Auf jedenfall hat es in solchen daten keine zeilenumbrüche drin - und wenn, dann wurden die mit absicht eingefügt, oder?
          ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

          Kommentar


          • #6
            Zitat von RamonaS Beitrag anzeigen
            >Du müsstest dir also erst mal ein Verfahren überlegen, unerwünschte von erwünschten Zeilenumbrüchen zu unterscheiden
            Es geht nur um feste daten [...]
            Ich dachte, du wolltest damit die Daten bereinigen, die schon in kaputter Form in deiner Datei vorhanden sind.

            Beim Einfügen von neuen Daten kannst du natürlich so vorgehen, dass du alle Zeilenumbrüche ersetzt.



            Und nutze doch bitte künftig die [quote]-Tags, wenn du jemand zitierst, das ist übersichtlicher, als nur eine vor die Zeile gestellte spitze Klammer.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Hallo,

              Ja das meinte ich ja die ganze zeit.

              Meine zeilen die diese daten sammeln sind so:
              PHP-Code:
              $ip=trim(($ip=$_SERVER['REMOTE_ADDR'])?$ip:"");
              $ho=trim(($ho=gethostbyaddr($ip))?$ho:"");
              ...
              ... 
              Da kommt dann noch referer , agent und language hinzu, sieht aber genau so aus wie diese 3 zeilen.

              Am ende wird alles durch | getrennt und am stück als eine zeile in die textdatei geschrieben.

              So, nun wollte ich von euch wissen wie ich da am bestten alle 5 variablen auf solche falsche eingaben prüfe.

              Soll ich die alle vorher in eine variable zusammensetzen und dann einfach
              $arr=str_replace(array("\r","\n","\r\n"),array("","",""),$arr);
              drüberlassen oder gibts da noch ne andere möglichkeit.

              Das soll halt sehr schnell erfolgen bis zum baschluß wo alles in die datei geschrieben wird, da es praktisch auf jeder seite per include aufgerufen wird.


              Dann noch ne frage zu dem include...
              da gibts ja:
              include
              incude_once
              require
              require_once

              Zur info: mein script wird per include praktisch nur einmal pro seite aufgerufen...sonst nicht mehr...ausser man klickt ne andere seite an - dann wird das wieder einmal included.

              Kann man das auch php beibringen, wenn dieses script einmal included wurde, das es dann für diesen besucher nie wieder aufgerufen wird?
              Es werden nur beim ersten mal daten geschrieben, weil ich per ip + host + agent prüfe ob es sich um den gleichen besucher handelt.
              ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

              Kommentar


              • #8
                Zitat von RamonaS Beitrag anzeigen
                Soll ich die alle vorher in eine variable zusammensetzen und dann einfach
                $arr=str_replace(array("\r","\n","\r\n"),array("","",""),$arr);
                drüberlassen oder gibts da noch ne andere möglichkeit.
                Ist vermutlich das schnellste.

                Vom Ergebnis her macht's keinen Unterschied, ob du die Werte erst einzeln säuberst und dann zusammenfügst, oder eben andersherum vorgehst.

                Dann noch ne frage zu dem include...
                da gibts ja:
                include
                incude_once
                require
                require_once
                Die jeweiligen Unterschiede sind klar?

                Kann man das auch php beibringen, wenn dieses script einmal included wurde, das es dann für diesen besucher nie wieder aufgerufen wird?
                Mit den oben genannten so ohne weiteres nicht.

                Es werden nur beim ersten mal daten geschrieben, weil ich per ip + host + agent prüfe ob es sich um den gleichen besucher handelt.
                Irgendeine Art von Prüfung bzw. Identifizierung musst du durchführen.

                Diese Prüfung aus dem inlcude-File herauszunehmen und darin nur noch das Schreiben zu machen, wäre auch nicht performanter - dann müsstest du den Überprüfungscode an zig Stellen hinkopieren.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Hallo,

                  Mir ist da so ne idee gekommen....nachdem das script das erstemal included wurde und die daten in die datei geschrieben wurden, vergebe ich eine session und vor dem include frage ich ab if(isset.. diese session, wenn nicht dann includen.

                  Ist das keine gute idee?

                  >Die jeweiligen Unterschiede sind klar?
                  Ja schon, da ich diese include-script eigentlich auf der ganzen webseite nur ein einziges mal wirklich benötige, erübrigt sich - dass es auf jeder seite included wird....es wird sowiso nur prügen ob die ip host und agent in der datei unter den letzten 5 einträge vorkommen...
                  ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                  Kommentar


                  • #10
                    Die Idee geht in die richtige Richtung. Aber das Flag setzen bzw. prüfen solltest du in der include-Datei machen. Die sollte sich sozusagen selbst vor mehrfacher Ausführung schützen.

                    Warum prüfst du eigentlich nur die letzten 5 Einträge? Was soll das alles?

                    Kommentar


                    • #11
                      Hallo,

                      >Aber das Flag setzen bzw. prüfen solltest du in der include-Datei machen.
                      Ähmm also ich dachte ich rufe die include so auf:

                      PHP-Code:
                      if(isset($_SESSION['newuser']))
                        {include(
                      userlog.php);} 
                      ...und in dieser userlog.php schreibe ich zB in die erste zeile:
                      $_SESSION['newuser']="gelogged";
                      ...

                      So, wenn also der erste besucher antanzt, dann ist diese $_SESSION['newuser'] noch nicht gesetzt, also wird sie included...
                      Jede weiter seite die der user klickt würde ein erneuten include auslösen...da aber die $_SESSION['newuser'] vom ersten mal bereits belegt wurde, wird bei der IF bereits abgebrochen.
                      Das ist doch so ok oder hab ich ein denkfehler?


                      >Warum prüfst du eigentlich nur die letzten 5 Einträge? Was soll das alles?
                      Tja das ist so ne geschichte, ich weiß nicht wie das genau gehandhabt wird, aber für mich ist ein besucher erst wieder ein neuer besucher wenn seine ip+host-agent, nicht mehr unter den letzten 5 besuchern zu finden ist.

                      EDIT: Natürlich muß ich dann die session löschen, falls hier diese bedingung nicht mehr zutrifft und dann den include wieder zulassen.


                      Wie entscheidet ihr, wann ein besucher ein neuer besucher ist, nach 10min nach 5 stunden oder wie?
                      ...mal abgesehen von den meisten usercounter, die man in einer minute per reload um 150 raufklicken kann.
                      Zuletzt geändert von RamonaS; 30.06.2009, 23:05. Grund: Zusatztext
                      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                      Kommentar


                      • #12
                        Ich hatte schon verstanden was du mit der Session vorhast. Aber du hast mich nicht verstanden. Noch einmal in aller Kürze: Mach es, aber mach es in userlog.php! Und include diese Datei immer!
                        PHP-Code:
                        //userlog.php
                        if (isset($_SESSION['logged'])) {
                            return;
                        }
                        $_SESSION['logged'] = true;
                        // hier folgt der Code zum loggen 

                        Kommentar


                        • #13
                          Hallo...

                          Achso meinst du das, dafür wird der include aber auch jedesmal ausgeführt.
                          Warum meinst du das die prüfung im include-script besser ist als schon davor?
                          ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                          Kommentar


                          • #14
                            Geladen wird es immer, aber ausgeführt nur wenn die Prüfung das zuläßt.

                            Die Prüfung sollte im Include stehen, weil nur so sichergestellt ist, dass sie stattfindet. Du kannst sie nicht vergessen.
                            Außerdem hättest du sonst den selben Code (die Prüfung) mehrfach in der Applikation und viel Arbeit, wenn du sie ändern willst.

                            Kommentar


                            • #15
                              Ja ok, hast mich überzeugt. Ich hätte erst garnicht den include gestartet, das sparrt eventuell 10ms.

                              Noch eine abschließende frage zu den includes algemein:

                              Was passiert im hauptscript wenn eine datei included wird die zB 2 sec lang arbeiten würde?
                              Läuft das hauptsript erst weiter wenn die include abgearbeitet ist, oder läuft so eine include als 2te instanz in php weiter?

                              Also hällt das hauptscript so lange inne, bis das include fertig ist?
                              Theoretisch schon - es könnte ja sein das ich dort variablen definiere die ich später im hauptscript brauche und die wären ja nicht verfügbar wenn das hauptscript weiterläuft, oder?
                              ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                              Kommentar

                              Lädt...
                              X