Download Link verschleiern

C2H2

Grünschnabel
Hallo,

ich möchte auf meine Facebook Seite mit der App Static HTML den Leuten die Möglchkeit geben Tracks herunterzuladen. Dies geht erst, wenn Sie den Gefällt mir Button gedrückt haben.
Mit der Facebook App kann ich mittels iframe eine PHP-Seite von meinen Server einbinden. Und auf dieser PHP-Seite möchte ich nun gerne die Download-Links anbieten.

Ich hätte aber gerne irgendwie einfach umgesetzt, dass bei jedem Laden dieser Seite der Link sich neu bildet. Der Pfad bleibt natürlich in Wirklichkeit immer derselbe. Ich möchte irgendwie verhindern, dass man so einen Pseudo-Link mehr als 1x mal verwenden kann, damit dieser nicht einfach so per eMail verteilt wird.
 
Du könntest Codes in einer Datenbank abspeichern und an die URL anhängen. Wenn ein Download getätigt wird, setzt du den Code in der Datenbank auf benutzt.
 
Mit tiemstamps Lösung Da musst du tausende von Codes vorgenerieren.

Meine Idee:
Generiere ein Code, gib in dem User zurück und speichere ihn in die DB. Nachdem der Code 'eingelöst' wurde, kannst du ihn wieder löschen.
 
Hi timestamp,

dies ist ne gute Idee. Wenn irgendmöglich würde ich gerne auf eine DB verzichten. Kann ich es irgedwie vielleicht so lösen.

Auf der PHP-Seite:

1) erzeuge ich einen Link mit 3 Parametern. Der erste Parameter enthält die lokale Pfadangabe. Der zweite Parameter einfach 10 Zufallszahlen. Der letzte Parameter einen Unix-Timestamp.
Der Link ab der Parameter-Übergabe wird verschlüsselt und als Parameter "x" übergeben.

2) Wenn der User auf der Seite nun einen Link anklickt, so geht es auf eine 2te PHP Seite die den Parameter "x" ausliest, dann erst entschlüsselt. So liegen die 3 Parameter wieder in Klartext vor. Mit dem Timestamp prüfe ich nun, ob seit dem erzeugen des Link mehr als 1 Stunde vergangen ist. Wenn ja ist der Link ungültig und zeige es an. Ansonsten....

3) Durch die lokale Pfad-Angabe wird nun dem User der Download aufgerufen, so dass er aber nicht den Ursprung erkennen kann. Aber genau da scheitere ich. Wie macht man dies?
 
Mit tiemstamps Lösung Da musst du tausende von Codes vorgenerieren.

Meine Idee:
Generiere ein Code, gib in dem User zurück und speichere ihn in die DB. Nachdem der Code 'eingelöst' wurde, kannst du ihn wieder löschen.

So war es eigentlich gedacht ;)

Um Dateien zu ver- und entschlüsseln kannst du entweder nach bestehenden Funktionen googlen (wichtig: KEINE Hashfunktionen, die lassen sich nciht umkehren) oder dir selbst eine schreiben. Um eine Datei per Download zur Verfügung zu stellen google am besten mal nach "php download". Da sollte es tausende Beispielscripts geben.
 
Für die Nachwelt:

Das File was die Links anzeigt und vorher erstellt hat
PHP:
<?php

function getLink($filename)

{

for($i = 0; $i < 10; $i++)
 {
  $var1 = $var1 . rand(0, 100);
 }
$var1 = $var1 . "_____";

$var2 = $filename . "_____";
$var3 = time() . "_____";

for($i = 0; $i < 10; $i++)
 {
  $var4 = $var4 . rand(0, 100);
 }

return "http://pierrebraun.de/download_action.php?p=" . base64_encode($var1 . $var2 . $var3 . $var4);

}

?>




<a href="<?php echo getLink('file1'); ?>">Download A-Site</a><br>
<a href="<?php echo getLink('file2'); ?>">Download B-Site</a>



Dann die Seite, die die Download-Links überprüft und den Download startet, ohne das eigentliche Verzeichnis zu verraten.

PHP:
<?php

$arr = explode("_____", base64_decode($_GET['p']));

if(count($arr) == 4)
{
	if(is_numeric($arr[2]))
	{
		if(intval(time() - $arr[2]) < 600)
		{
			startDownload($arr[1]);
		}
		else
		{
		echo "The download link is expired. Please press the back link to get new download links";
		}
	}
	else
	{
	echo "This Download-Link is broken. Please press the back link and try again";
	}

}
else
{
echo "This Download-Link is broken. Please press the back link and try again";
}



function startDownload($content)
{

$basedir = "/is/htdocs/....../www/domain.de/out";
 
$filelist = array(
  "file1" => "/eksjklgkmdogmflf/file1.mp3",
  "file2" => "/eksjwsbhumflf/file2.mp3",
);
 

$filename = sprintf("%s/%s", $basedir, $filelist[$content]);
header("Content-Type: application/octet-stream");
$save_as_name = basename($filelist[$content]);
header("Content-Disposition: attachment; filename=\"$save_as_name\"");
readfile($filename);

}
 
Zurück