[HOW-TO/TUTORIAL] einfacher Download-Counter (Anleitung für Anfänger)

J

j-l-n

Guest
Nach dem Lesen folgenden Threads (http://forum.jswelt.de/serverseitige-programmierung/58635-download-counter.html) habe ich einen möglichst einfachen Download-Counter entwickelt, der keinerlei Datenbank benötigt. Diesen möchte ich auch kurz hier vorstellen, da er sich perfekt als Tutorial eignet.

1. Schritt: leeren Ordner "statistics" und die Datei "download.php" anlegen

2. Schritt: nun bauen wir schrittweise das Skript zusammen:

-der Dateiname wird aus der URL gelesen, weiteres hierzu in Schritt 3)
PHP:
$filename = $_GET['id'];

-nur wenn dieser Dateiname auch angegeben ist, wird das Skript weiter ausgeführt, ansonsten gibt es eine Fehlermeldung aus:
PHP:
if (!empty($filename)){ 

//dieser Teil folgt jetzt

} 

else {
echo"Fehler: Keine gültige Download-ID!"; 
}

-nun wird die Statistikdatei (mehr dazu unten) geöffnet; falls sie noch nicht existiert, beginnt das Skript bei 0 zu zählen
PHP:
$counter = @file_get_contents("statistics/$filename.txt");
    if($counter == "") 
    { 
       $counter = 0; 
    }

-wird die download.php aufgerufen, wird der Zähler bei jedesmal um 1 erhöht
PHP:
$counter++;

-zum Schluss speichern wir die neue Downloadzahl noch
PHP:
@file_put_contents("statistics/$filename.txt", $counter);

-...und leiten zum eigentlichen Download weiter:
PHP:
header("Location: $filename");

Das war der letzte Teil diesen Schritts! Hier noch einmal der gesamte Code:
PHP:
<? 
/* 
einfacher Download-Counter ohne Datenbank auf Textdateienbasis 
---------- 
Autor: Julian (http://forum.jswelt.de/members/julian.html) 
----------
!!!!! Dieser Vermerk darf nicht entfernt werden !!!!!
*/ 


$filename = $_GET['id']; // holt sich den Dateinamen aus der URL

if (!empty($filename)){ 

    //wenn noch keine Statistik angelegt, Zähler bei 0 beginnen
    $counter = @file_get_contents("statistics/$filename.txt");
    if($counter == "") 
    { 
       $counter = 0; 
    } 

    //bei jedem Download Zähler um 1 erhöhen 
    $counter++; 

    //Downloadanzahl in Textdatei schreiben mit Namen "Dateiname".txt
    @file_put_contents("statistics/$filename.txt", $counter);

    //zum angeforderten Datei-Download weiterleiten 
    header("Location: $filename"); 

} 

else { //wenn in der URL kein Dateiname angegeben, Fehlermeldung anzeigen
echo"Fehler: Keine gültige Download-ID!"; 
} 

?>

Fahren wir mit dem 3. und letzten Schritt fort:
Jeder Link zu einem Download muss nun nach diesem Schema umgeleitet werden:
download.php?id={Dateiname des Downloads}
Heißt die Datei z.B. bilder.zip, muss der Link folgendermaßen lauten:
HTML:
<a href="download.php?id=bilder.zip">Zum Download</a>


Fertig! Im Ordner "statistics" kannst du nun nachsehen, wie oft die Dateien heruntergeladen wurden. Der Dateiname der richtigen Datei ist
{Name des Downloads}.txt
Willst du z.B. wissen, wie viele Personen sich die bilder.zip abgerufen haben, öffne "bilder.zip.txt".


Bitte teilt mir euere Meinung und Verbesserungsvorschläge mit!
 
Zuletzt bearbeitet:
Hi,

ich habs jetzt zwar nur überfolgen, aber ansich ganz gut. Ich hätte 2 Anmerkungen/Verbesserungsvorschläge:
1. Anstelle von $variable != "", könnte man auch die empty() Funktion verwenden (PHP: empty - Manual)
2. $_GET['id'] sollte eventuell escaped werden. (Auch wenn keine DB Aktionen erfolgen, aber es sind Get-Parameter und sie kommen aus dem bösen INet...)


Gruß
 
Danke, den Tipp, empty() zu verwenden, habe ich gleich umgesetzt :)
Meiner Meinung nach besteht aber bei diesem Projekt keinerlei Notwendigkeit, $_GET zu escapen. Kann mir nicht vorstellen, was da passieren sollte.
 
Meiner Meinung nach besteht aber bei diesem Projekt keinerlei Notwendigkeit, $_GET zu escapen. Kann mir nicht vorstellen, was da passieren sollte.
Ich denke auch nicht, dass irgendwas passieren könnte. Ich bin mittlerweile nur dazu übergegangen alles was ein "fremder" Benutzer eingibt oder eingeben kann zu escapen.

Wenn ich so drüber nachdenke, könnte es doch eine Schwachstelle geben. Der filename wird auch ans header(location) weitergegeben. Wenn dort nun einer JS eingibt und einem Benutzer unterschläußt, könnte! es z.B. massenhaft PopUp Fenster geben oder ähnliches. Ich bin jetzt kein Experte im Hacken, aber vielleicht, ach keine Ahnung. Ich würde escapen, sicher ist sicher. :)
 
Ich sehe nur ein Problem, wenn in $_GET["id"] sowas wie "../../wichtige" drin steht. Dann wird die Datei "../../wichtige.txt" überschrieben - falls es so eine gibt.

Generell muss man sich Gedanken über Ordnerstrukturen machen.
 
Zurück
Oben