Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
PHP [php] File Upload script - hochgeladener Link verschlüsseln und automatisch löschen
- Ersteller unixp
- Erstellt am
EDIT
Habe mal was mit md5 versucht, ist das der richtige Ansatz?
Folgender Befehl gibt ja den hochgeladenen Link aus:
Nun muss ich den Linkvariablen einfach in md5 umwandeln lassen mit:
Wie bekomme ich den Namen der Datei noch dazu, damit der komplette Link in md5 umgewandelt wird?
------
Dann nochmal zu der Löschung der Daten:
Ich muss das Script regelmäßig automatisch anstarten. Ist das mit mit cronjobs am einfachsten?
Ein Cronjob ruft regelmäßig die File vom Server auf so wie ich das bisher richtig verstanden habe oder?
Dann muss ich einfach eine Datei erzeugen welche die tuewas() Funktion regelmäßig aufruft?
Habe mal was mit md5 versucht, ist das der richtige Ansatz?
Folgender Befehl gibt ja den hochgeladenen Link aus:
PHP:
<?php echo $_FILES["datei"]["name"];?>
Nun muss ich den Linkvariablen einfach in md5 umwandeln lassen mit:
PHP:
echo md5($_FILES);
Wie bekomme ich den Namen der Datei noch dazu, damit der komplette Link in md5 umgewandelt wird?
------
Dann nochmal zu der Löschung der Daten:
Ich muss das Script regelmäßig automatisch anstarten. Ist das mit mit cronjobs am einfachsten?
Ein Cronjob ruft regelmäßig die File vom Server auf so wie ich das bisher richtig verstanden habe oder?
Dann muss ich einfach eine Datei erzeugen welche die tuewas() Funktion regelmäßig aufruft?
Zuletzt bearbeitet:
Yuuri
Fleet Admiral
- Registriert
- Okt. 2010
- Beiträge
- 13.928
Du nimmst am einfachsten den Pfad der hochgeladenen Datei und hashst diesen (vllt nimmst du noch Dateigröße und Datum mit dazu oder irgendwas). Den Hash legst du dann in der Datenbank ab und fragst ab, bei welchem Datensatz hash = $_GET['parameter'] ist und schon bekommst du alle benötigten Daten dafür, ohne dass der User auch nur eine Information von irgendwas bekommt.
Zum cronjob: http://de.wikipedia.org/wiki/Cronjob Unter Windows würde man mehr oder weniger Aufgabenplanung dazu sagen.
Zum cronjob: http://de.wikipedia.org/wiki/Cronjob Unter Windows würde man mehr oder weniger Aufgabenplanung dazu sagen.
Eagle-PsyX-
Commander
- Registriert
- Juni 2006
- Beiträge
- 2.105
Ich kann alle für externe Cron-Jobs auch sehr:
cron-job.org
empfehlen.
Hab dort Crons für 6 Projekte laufen und laut Protokoll funktioniert das sehr gut. Innerhalb der letzten 2 Jahre etwas immer später (30 Minuten *verspätung*) aber da man Crons meistens eh zwischen 02:00-06:00 macht, spielt das keine Rolle
cron-job.org
empfehlen.
Hab dort Crons für 6 Projekte laufen und laut Protokoll funktioniert das sehr gut. Innerhalb der letzten 2 Jahre etwas immer später (30 Minuten *verspätung*) aber da man Crons meistens eh zwischen 02:00-06:00 macht, spielt das keine Rolle
Zu der md5 Codierung nochmal:
Ich habe nun ein md5 Hash Wert aus dem Link generiert, welcher in die Datenbank geschrieben wird.
Der Link mit dem Hash Wert lässt sich aber nun nicht im Browser öffnen. "Objekt nicht gefunden!"
Eigentlich sollte ich doch wenn ich http://domain/(HashWert) Eingabe die File öffnen können oder?
Bsp: http://domain/7f660d8e6f58dfced022c2e2dc9a6c2c
Edit:
Ich muss natürlich dem AusgabeLink auch ein Hashwert übergeben.
Wenn ich den Befehl oben lasse erstellt er mir zwei verschiedene Hash Werte, eine in der SQL Datenbank und der andere auf dem Fileserver...
Wie könnte ich das am einfachsten lösen?
Ich habe nun ein md5 Hash Wert aus dem Link generiert, welcher in die Datenbank geschrieben wird.
PHP:
//Speichere alles in die DB ->
$link = md5("$ordner/$folder/" . $_FILES["datei"]["name"]);
Der Link mit dem Hash Wert lässt sich aber nun nicht im Browser öffnen. "Objekt nicht gefunden!"
Eigentlich sollte ich doch wenn ich http://domain/(HashWert) Eingabe die File öffnen können oder?
Bsp: http://domain/7f660d8e6f58dfced022c2e2dc9a6c2c
Edit:
Ich muss natürlich dem AusgabeLink auch ein Hashwert übergeben.
Wenn ich den Befehl oben lasse erstellt er mir zwei verschiedene Hash Werte, eine in der SQL Datenbank und der andere auf dem Fileserver...
Wie könnte ich das am einfachsten lösen?
Zuletzt bearbeitet:
Yuuri
Fleet Admiral
- Registriert
- Okt. 2010
- Beiträge
- 13.928
So musst du wieder mit mod_rewrite arbeiten. Der Hash ist doch auch nur ein Parameter, sprich http://domain/download.php?hash=7f660d8e6f58dfced022c2e2dc9a6c2c.
Dann suchst du dir den benötigten Hash aus der DB heraus und um es einfach zu halten, leitest du auf die Download-URL um per header( 'Location: http:/...' );.
Dann suchst du dir den benötigten Hash aus der DB heraus und um es einfach zu halten, leitest du auf die Download-URL um per header( 'Location: http:/...' );.
Steh grad aufm Schlauch.
Ich habe folgender Code der den Link ausgibt:
Wie genau muss ich dann den Code anwenden?
Ich habe folgender Code der den Link ausgibt:
PHP:
<td align="center"><a href="<?php echo dirname($_SERVER['PHP_SELF'])."/$ordner/$folder/".$_FILES["datei"]["name"];?>" />Download <?php echo $_FILES["datei"]["name"];?></a></td>
Wie genau muss ich dann den Code anwenden?
PHP:
RewriteRule ^file/(.*)(\.htm?)$ file.\php?hash=$1 [L]
Ok wo muss ich den Befehl nun genau einbauen?
Das ist der Code der die Ausgabe der Links ausgibt:
PHP:
RewriteRule ^d/(.*)$ download.\php?hash=$1 [L]
Das ist der Code der die Ausgabe der Links ausgibt:
PHP:
<tr>
<td align="center"><a href="<?php echo dirname($_SERVER['PHP_SELF'])."/$ordner/$folder/".$_FILES["datei"]["name"];?>" />Download <?php echo $_FILES["datei"]["name"];?></a></td>
<?php if ($show_delete){ ?>
<td align="center"><a href="<?php echo $_SERVER['PHP_SELF']."?action=unlink&file=$folder&code=".$code;?>" >Löschen</A></td>
<?php } ?></tr>
<?php if (!$show_only_links){ ?>
<tr>
<td><textarea style="width:100%;" rows="3" readonly >http://<?php echo $_SERVER['SERVER_NAME'].dirname($_SERVER['PHP_SELF'])."/$ordner/$folder/".$_FILES["datei"]["name"];?></Textarea></td>
<?php if ($show_delete){ ?>
<td><textarea style="width:100%;" rows="3" readonly >http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?action=unlink&file=$folder&code=".$code; ?></Textarea></td>
<?php } ?>
</tr>
Yuuri
Fleet Admiral
- Registriert
- Okt. 2010
- Beiträge
- 13.928
PHP:
<td align="center"><a href="<?php echo dirname($_SERVER['PHP_SELF'])."/$ordner/$folder/".$_FILES["datei"]["name"];?>" />Download <?php echo $_FILES["datei"]["name"];?></a></td>
Wie setze ich es ein? Steh grad aufm Schlauch
PHP:
RewriteRule ^d/(.*)$ download.\php?hash=$1 [L]
Edit:
Das
PHP:
<a href="/d/<hash>">Download</a>
Aber wie baue ich das
PHP:
RewriteRule ^d/(.*)$ download.\php?hash=$1 [L]
Zuletzt bearbeitet:
So also ich habe es nun anderst gelöst.
Ich schreibe den Link als Hash Wert mit der md5() Funktion in die SQL Datenbank.
Dann habe ich eine neue index.php die in einem anderen Verzeichnis liegt, damit die Datei noch mehr geschützt ist.
Diese liest den Hash Wert ein und wird als $url Variable festgelegt.
Mit dieser $url Variable erzwinge ich ein Download wenn man den direkten Link eingibt. Der Link sieht in etwa so aus:
http://www.domain.net/download/?hash=d9ae495bd7440b58b15e4edeab9260ad
Ich kann die Datei herunterladen. Das funktioniert einwandfrei.
Nun habe ich nur noch ein Problem:
Bilddateien, .exe, .msi Dateien können nach dem herunterladen nicht geöffnet werden (Datei beschädigt)
.pdf Dateien gehen aber zum öffnen!
Ich habe schon diverse header Funktionen getestet, ohne Erfolg.
So sieht das Download Script aus:
An was könnte das noch liegen?
Wenn ich die Datei direkt über den original Link (http://www.domain.net/uploads/upload/dateiname.jpg) herunterlade funktioniert es.
Also muss es irgendwo bei der Übertragung ein Fehler geben.
Ich schreibe den Link als Hash Wert mit der md5() Funktion in die SQL Datenbank.
Dann habe ich eine neue index.php die in einem anderen Verzeichnis liegt, damit die Datei noch mehr geschützt ist.
Diese liest den Hash Wert ein und wird als $url Variable festgelegt.
Mit dieser $url Variable erzwinge ich ein Download wenn man den direkten Link eingibt. Der Link sieht in etwa so aus:
http://www.domain.net/download/?hash=d9ae495bd7440b58b15e4edeab9260ad
Ich kann die Datei herunterladen. Das funktioniert einwandfrei.
Nun habe ich nur noch ein Problem:
Bilddateien, .exe, .msi Dateien können nach dem herunterladen nicht geöffnet werden (Datei beschädigt)
.pdf Dateien gehen aber zum öffnen!
Ich habe schon diverse header Funktionen getestet, ohne Erfolg.
So sieht das Download Script aus:
PHP:
<?php
include_once("../upload/online.php");
$hash = $_GET['hash'];
$sql = "SELECT link FROM links WHERE hash = '".$hash."';";
$query = mysql_query($sql);
$result = mysql_fetch_assoc($query);
$url = $result['link'];
$ext = "SELECT filetype FROM links WHERE hash = '".$hash."';";
$query = mysql_query($ext);
$result = mysql_fetch_assoc($query);
$filetype = $result['filetype'];
$dir = "../upload/";
if ((isset($url))&&(file_exists($dir.$url))) {
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-length: ".filesize($dir.$url));
header('Content-Disposition: attachment; filename="download.' . $filetype . '"');
header("Content-Description: File Transfer");
header("Content-Transfer-Encoding: binary");
readfile("$dir$url");
} else {
echo "No file selected";
}
?>
An was könnte das noch liegen?
Wenn ich die Datei direkt über den original Link (http://www.domain.net/uploads/upload/dateiname.jpg) herunterlade funktioniert es.
Also muss es irgendwo bei der Übertragung ein Fehler geben.
7H3 N4C3R
Lt. Commander
- Registriert
- Feb. 2002
- Beiträge
- 1.816
Wenn du so die Hashes generierst, ist es für einen potenziellen Angreifer einfach, gültige Dateien zu erraten, indem er wahrscheinliche Namen nimmt, hasht und anfragt.unixp schrieb:Ich habe nun ein md5 Hash Wert aus dem Link generiert, welcher in die Datenbank geschrieben wird.
PHP://Speichere alles in die DB -> $link = md5("$ordner/$folder/" . $_FILES["datei"]["name"]);
Du solltest zusätzlich dazu einen Salt hinzufügen. Da ein potenzieller Angreifer den Salt nicht kennt, kann er auch keine Dateien mehr erraten. Der Salt sollte irgendwas zufallsgeneriertes sein (nimm pwgen mit 20 Zeichen oder so) und du solltest ihn natürlich nicht hier einstellen.
Was ich nicht verstehe ist, wieso benutzt Du 2 Abfragen die auf "links" gehen?
Fasse das doch zusammen:
Und bitte benutze eine escape-funktion wie :
mysql_real_escape_string oder so!
( Vertraue keiner Eingabe die vom User übergeben werden kann! )
Mehr zum Thema:
http://de.wikipedia.org/wiki/SQL-Injection
Dann, um Fehler zu finden schaue Dir die Wege an was passiert von 0- x, und prüfe dann schritt für schritt.
So kannst Du schnell(bei kleinen code) den Fehler finden!
Fasse das doch zusammen:
PHP:
$sql = mysql_query("SELECT link, filetype FROM links WHERE hash = '".$hash."';");
$row = mysql_fetch_array($sql);
$file = $row["file"];
$filetype = $row["filetype"];
Und bitte benutze eine escape-funktion wie :
mysql_real_escape_string oder so!
( Vertraue keiner Eingabe die vom User übergeben werden kann! )
http://de.wikipedia.org/wiki/SQL-Injection
Dann, um Fehler zu finden schaue Dir die Wege an was passiert von 0- x, und prüfe dann schritt für schritt.
So kannst Du schnell(bei kleinen code) den Fehler finden!
@7H3 N4C3R: Danke werde ich mir anschauen und umsetzen!
@volcem:
Ich habe es momentan noch über ein umständlichen Weg gelöst.
Ich frage von dem link einmal die url ab und den filetype.
Das Script gibt jeder Datei zum Download einen festen Download name (download."filetype").
Werde ich aber noch ändern, das keine zwei Abfragen von der gleichen Spalte sind.
Zu meinem Problem: Ich habe es gelöst. Ich hatte mir eine heruntergeladene beschädigte .png Datei mit einem Hex-Editor geöffnet und festgestellt das ein leerzeichen und zwei Zeilenumbrüche bei jedem Download mitgesendet wurden.
Dann habe ich nochmals alle .php Scripte nach überflüssigen Leerzeilen und Zeilenumbrüche korrigiert. Und siehe da, in der online.php war hinter dem ?> ein Leerzeichen und zwei Zeilenumbrüche, welche die Fehler ausgelöst hatten...
@volcem:
Ich habe es momentan noch über ein umständlichen Weg gelöst.
Ich frage von dem link einmal die url ab und den filetype.
Das Script gibt jeder Datei zum Download einen festen Download name (download."filetype").
Werde ich aber noch ändern, das keine zwei Abfragen von der gleichen Spalte sind.
Zu meinem Problem: Ich habe es gelöst. Ich hatte mir eine heruntergeladene beschädigte .png Datei mit einem Hex-Editor geöffnet und festgestellt das ein leerzeichen und zwei Zeilenumbrüche bei jedem Download mitgesendet wurden.
Dann habe ich nochmals alle .php Scripte nach überflüssigen Leerzeilen und Zeilenumbrüche korrigiert. Und siehe da, in der online.php war hinter dem ?> ein Leerzeichen und zwei Zeilenumbrüche, welche die Fehler ausgelöst hatten...
Yuuri
Fleet Admiral
- Registriert
- Okt. 2010
- Beiträge
- 13.928
Ich hoffe dir ist aber bewusst, dass hierbei das Timeout eine große Rolle spielt? Wenn also große Dateien runtergeladen werden, wirst du standardmäßig nach 60 Sekunden einen Timeout des Downloads bekommen und dieser bricht ab.unixp schrieb:PHP:readfile("$dir$url");
Also hierbei mit set_time_limit() gegensteuern oder direkt auf die Datei umleiten. Bei der Umleitung könntest du ggf. auch mit symlinks arbeiten und für jeden Hash im Downloadordner einen Ordner erstellen, in welchem die Datei liegt (mit richtigem Namen natürlich). Am System sind ja im Prinzip keine Grenzen gesetzt.
Ich möchte das Script noch um einen Schritt erweitern und folgendes miteinbauen: Wenn jemand eine Datei herunterlädt, möchte ich die IP Adresse des Downloaders abfragen und im admin interface anzeigen lassen.
Momentan werden IP Adressen von Uploadern geloggt. Das sieht dann so aus:
http://www.abload.de/img/admins93h.jpg
Ich habe die admin.php hochgeladen. Ich bin gerade daran etwas zu testen damit ich die Abfrage des downloaders per IP loggen und ausgeben kann.
Wie würdet ihr das am einfachsten realisieren?
Momentan werden IP Adressen von Uploadern geloggt. Das sieht dann so aus:
http://www.abload.de/img/admins93h.jpg
Ich habe die admin.php hochgeladen. Ich bin gerade daran etwas zu testen damit ich die Abfrage des downloaders per IP loggen und ausgeben kann.
Wie würdet ihr das am einfachsten realisieren?