php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 30-06-2009, 00:18
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard 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!
Mit Zitat antworten
  #2 (permalink)  
Alt 30-06-2009, 01:28
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt 30-06-2009, 14:15
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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|localhostn|[url]www.google.de|Mozilla/4.0rn[/url] (compatibleMSIE 6.0Windows 98;rn 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!
Mit Zitat antworten
  #4 (permalink)  
Alt 30-06-2009, 14:49
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Zitat:
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.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.

Geändert von wahsaga (30-06-2009 um 14:52 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 30-06-2009, 15:45
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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?
Mit Zitat antworten
  #6 (permalink)  
Alt 30-06-2009, 16:23
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #7 (permalink)  
Alt 30-06-2009, 20:17
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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.
Mit Zitat antworten
  #8 (permalink)  
Alt 30-06-2009, 20:29
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.

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

Zitat:
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.

Zitat:
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.
Mit Zitat antworten
  #9 (permalink)  
Alt 30-06-2009, 21:10
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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...
Mit Zitat antworten
  #10 (permalink)  
Alt 30-06-2009, 22:21
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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?
Mit Zitat antworten
  #11 (permalink)  
Alt 30-06-2009, 23:03
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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.

Geändert von RamonaS (30-06-2009 um 23:05 Uhr) Grund: Zusatztext
Mit Zitat antworten
  #12 (permalink)  
Alt 01-07-2009, 00:41
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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 
Mit Zitat antworten
  #13 (permalink)  
Alt 01-07-2009, 12:05
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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?
Mit Zitat antworten
  #14 (permalink)  
Alt 01-07-2009, 13:00
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #15 (permalink)  
Alt 01-07-2009, 14:51
RamonaS
 Registrierter Benutzer
Links : Onlinestatus : RamonaS ist offline
Registriert seit: Mar 2009
Beiträge: 177
RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

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?
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SQL sicher machen, aber wie? tmaniacr SQL / Datenbanken 10 09-09-2006 18:06
Mitgliederbereich sicher machen LOLLe SQL / Datenbanken 2 18-02-2006 23:44
Webformulare sicher machen? em-!x PHP Developer Forum 4 02-08-2004 12:10
Bilder sicher machen flo221 HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 12 27-07-2004 12:55
Formular sicher machen zzet PHP Developer Forum 10 07-04-2003 13:32

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:52 Uhr.