PHPscript gesucht!

Ronald Nickel

Legendäres Mitglied
Hallo Ayom-ler
für ein Test-remote-tool brauche ich in PHP ein Sript mit folgenden Anforderungen

1.
Ausführendes skripts nur wenn der Referrer nicht von eigenen Server kommt

2.
Lesen der Textdatei "pssm/hlhjelihuo9n.nl8hl47k764kg.txt"

3.
Wenn der Referrer nicht in besagter Datei steht, am ende als neue Zeile in der Konvention "$referrer;$date;$ip,! hinzufügen und neu abspeichern


Es soll eine Art Counter werden, der in eine Textdatei abgespeichert und extern abgefragt werden soll. Das Script soll in jeden PHP account einbindbar sein. Ab es lediglich in eine Application-datei wie in CFML oder in jede Seite eingebaut werden muss kann ich als Nicht PHPler leider nicht sagen.

In CFML ist das scipt in ca 20 Minuten zu realsieren.
Würde mich freuen, wenn mir jemand das teil auf Verhandlungsbasis erstellen könnte.

Gruß Ronny
 
CODE <?

define('SAVEFILE', 'pssm/hlhjelihuo9n.nl8hl47k764kg.txt');
define('SEPERATOR', ';');


if ( (!isset($_SERVER['HTTP_REFERER'])) || (strpos(strtolower($_SERVER['HTTP_REFERER']), strtolower($_SERVER['HTTP_HOST'])) === false) )
return;

$content = @file(SAVEFILE);

if (!empty($content)) {
foreach($content as $a_line) {
$splitted = explode(SEPERATOR, trim($a_line));
if ( ( (isset($splitted[0])) && ($splitted[0] == md5(strtolower($_SERVER['HTTP_REFERER']))) )
|| ( (isset($splitted[2])) && ($_SERVER['REMOTE_ADDR'] == $splitted[2]) ) )
return;
}
}

if (!$handle = fopen(SAVEFILE, "a"))
return;

if (!fwrite($handle, md5(strtolower($_SERVER['HTTP_REFERER'])) . SEPERATOR . time() . SEPERATOR . $_SERVER['REMOTE_ADDR'] . "\n"))
return;

fclose($handle);

?>



ein Semikolon ist in dem Fall ein schlechtes Trennzeichen, da eine URL es enthalten kann... ich habe den Referrer daher als md5 hash abgespeichert... sollte reichen und spart auch Platz.

Verwendung auf eigene Gefahr...
 
QUOTE (Maik @ Mi 16.8.2006, 15:49) ich habe den Referrer daher als md5 hash abgespeichert

MD5 kann man doch nicht wieder in den Klartext umwandeln. Oder stehe ich gerade auf dem Schlauch?
 
nein kann man nicht.... kommt jetzt auf ronnys anwendungszweck an...ich hab ihms ohne dem md5 auch schon programmiert...
 
QUOTE (Moritz_Klussmann @ Mi 16.8.2006, 15:55)MD5 kann man doch nicht wieder in den Klartext umwandeln. Oder stehe ich gerade auf dem Schlauch?

Ja, einen Hash kann man nicht zurückverwandeln, eine Base64 Kodierung wäre da vielleicht besser gewesen. Aber wenn es um Speicherplatzeinsparungen geht, kann man auch die IP-Adresse als long int umwandeln und dann packen, das Gleiche gilt für's Datum.

Aber allgemein finde ich diese Lösung dafür auch nicht gerade toll, es wird mit Short Tags gearbeitet, was man unterlassen sollte, wenn das Script für eine breite Masse gedacht ist. Auch sollte man versuchen das meiste irgendwie abzukapseln innerhalb einer Funktion bzw. Klasse, damit die Wahrscheinlichkeit kleiner ist, dass andere PHP-Scripte durch das Einbinden gestört werden.
Da die Datei Binär beschrieben wird, wäre die Öffnungsmethode "ab" vermutlich auch noch besser, statt nur "a", ansonsten sollte man fputs verwenden. Auch wäre eine Datei-Verriegelung mittels flock empfehlenswert.

Das return kann man vermutlich machen innerhalb der Einbindung (kann man auch als guten Stil ansehen, da es tiefe Verschattelungen verhindert), würde ich aber wegen meinen eigenen Programmierstil selber nicht machen. Maik scheint auch ein kleiner Klammeraffe zu sein, da fast jeder einfache Ausdruck unnötigerweise in Klammer steht.
wink.gif




Insgesamt reicht die Beschreibung natürlich nicht aus um ein solches Programm einfach so schreiben zu können, da man nicht die gewünschten Formatierungen der einzelnen Daten kennt.



MfG Sascha Ahlers
 
Zum thema Hash.
In der Scriptzeile von Maik seht ihr:
define('SAVEFILE', 'pssm/hlhjelihuo9n.nl8hl47k764kg.txt');

Also eine feste Dateibezeichnung die natürlich jeder aufrufen kann der den Namen kennt.
Würde www.Ayom.de das Scrpt benutzen würde es so aussehen:
define('SAVEFILE', 'pssm/82BB226ADC0A4054CAD45697BC96A8D0.txt');

Dasdurch könnte nicht jeder in die "logfiles" sehen. Das ist der Hintergund

Gruß Ronny

P.S. Spricht eigendlich was gegen eine Dateibezeichnung mit 32+3 Zeichen?
 
hm...da will ich mich mal rechtfertigen...

1. Ich sehe kein Grund Shorttags zu umgehen... sie sind bei 99% aller PHP Installationen aktiviert.

2. md5 ist für ein URL-Check vollkommen ausreichend... die Wahrscheinlichkeit, dass 2 URLs den selben Hash erzeugen liegt bei <0.0001% und im Gegensatz zu base64 wird das Ergebnis kürzer, statt länger

3. Wozu sollte man so ein kurzes Script via Funktionen unnötig verkomplizieren? Es gibt nicht einen Teil des Scripts, der sich für eine Wiederverwendung lohnt... also was soll das?

4. Die Datei ist in einem Textformat, daher ist es unsinn, sie als Binär zu öffnen, da alle Zeichen die gelesen und geschrieben werden im lesbaren Teil des Zeichensatzes liegen... und bis auf \n gibt es keine Steuercodes.

5. flock verursacht bei massiven Scriptaufrufen, dass sich die Scripte langsam in Warteschleifen fahren die dann so lang werden, dass es den Server total blockiert (die Scripte stehen alle in Warteschlangen)... daher sollte man es nur einsetzen bei langen schreib-Aktionen... bei sehr sensiblen Daten. Das Script schreibt max. 60 Zeichen, und die Daten sind nicht sonderlich sensibel, ein doppelter Datensatz stört von daher nicht. Ausserdem müsste das flock so, noch vor dem Lesen gesetzt werden, und bis zum ende gehalten werden...

6. return verwende ich grundsätzlich... vielleicht will man das script mal irgendwann in ein anderes einbinden.

7. Ich habe ne zeitlang C++ programmiert (Studium usw.) da ist das mit den Klammern hängengeblieben... für mich macht es die Sache leserlich... und soetwas wie falsche Verkettungen oder ungewollte Seiteneffekte kann man so von vorneherein ausschließen.
 
Wenn Du die Daten nicht real time haben musst, würde ich die Server Logs parsen. Wenn Du realtime für jeden externen ref eine Suche machst, naja ich weiss nicht wieviele Referer Du hast, aber bei Ayom gibts auch so was in der Art und das wär ein armer Hund wer das mit file() laden würde...
Ich hab allerdings nicht alles gelesen und weiss nicht wirklich worauf Du hinaus willst.

Oder einfach die Überprüfung sausen lassen und die Doppels später behandeln.
 
Das Du meinst Dich rechtfertigen zu müssen, mache ich das auch mal:

  1. Ein Angebot für die breite Masse sollte sich an Standards halten, ob nun 99% die Short Tags aktiviert haben oder nicht. Ich selber deaktiviere diese sogar bewusst, um schnell sehen zu können, wie umsichtigt die entsprechende Anwendung entwickelt wurde.
  2. Nur ein Base64 kann zurückgewandelt werden, ein Hash nicht. Einfach mal den Beitrag lesen, statt sich angegriffen zu fühlen, ich beziehe mich in diesen Punkt auf Moritz_Klussmanns Frage.
  3. Das steht eigentlich auch oben in meinen Beitrag: Damit die Wahrscheinlichkeit geringer ist andere Scripte zu stören. Das Ganze in eine Funktion zu setzen ist auch kaum mehr Aufwand und verkompliziert das Script IMHO weniger als die Return-Anweisung außerhalb der Funktion.
  4. Das mag unsinnig erscheinen, aber wenn Du nur Zeichen schreiben möchtest, dann solltest Du keine Funktion verwenden, welche Binär arbeitet, wie fwrite. Das könnte wieder unter umständen Probleme bereiten (siehe Zitat von http://www.php.net/fwrite).
    Da fputs aber mittlerweile ein Alias geworden ist, kann man meine Empfehlung, stattdessen fputs zu nehmen auch verwerfen.
  5. Ich habe gesagt, es wäre "wünschenswert", nicht zwingend.
  6. Ich habe gesagt, ich würde Return aufgrund meines Programmierstils, nicht so verwenden.
  7. Warum die Klammern gesetzt wurden, kann ich verstehen, dass mit der Leserlichkeit hängt vom Programmierer (also der Person ab) und dem Schreibstil zusammen. Ich meinte nur Sie sind schlicht unnötig. Aber selbst in C++ sind solche Klammern nicht unbedingt zwingend notwendig. Aber in C++ sollte man auch nicht gerade eine Zuweisung innerhalb des Ausdruckes einer Bedingung schreiben.
QUOTE [...]
fwrite -- Schreibt Binärdaten in eine Datei
[...]
Anmerkung: Auf Systemen, welche zwischen Binär- und Textdateien (z.B. Windows) unterscheiden, muss die Datei mit 'b' im fopen() Mode-Parameter geöffnet werden.
[...]

Quelle: http://www.php.net/fwrite (16.08.2006 um 17:40)





QUOTE (ronnic @ Mi 16.8.2006, 16:38)P.S. Spricht eigendlich was gegen eine Dateibezeichnung mit 32+3 Zeichen?

Nein, ich wüsste zumindestens nicht was dagegen sprechen sollte.



MfG Sascha Ahlers
 
@Alain Aubert
gute idee mit dem parsen der Server logs.Zumal ich diese besagten Daten nur einmal am tag und Account abholen will. Allerdings müsste ich einen Weg finden allen Webmastern die sich einbinden lassen wollen klarzumachen, dass sie die logadaten an eine feste stelle täglich zu platzieren haben wo ich sie auch finde. Allerdings können solche logs unchristlich größen erreichen. Sie müssen geladen, geparst, verwurstet und in eine DB geschrieben werden. Davon mehrere tausend über eine nächteliche scheduled-task-datei bedeutet ein mega performance als Voraussetzunmg

Gruß Ronny
 
Zurück
Oben