Flux Rss

Comment protéger ses liens de téléchargement ?

protéger ses liens de télécharhementCet article à pour but de vous proposer une méthode efficace pour protéger vos liens de téléchargement. Pour mettre en place un systéme de protection de vos liens de téléchargement il est nécessaire d'avoir un minimum de connaissance en conception et développement. Même si la méthode semble assez simple, pour un développeur confirmé, elle sera incompréhensible pour un néophite.
Malgrés tout un développeur débutant pourra mettre en oeuvre ce tutorial.

 

1 Prérequis

  • Un seveur web avec php 5
  • Le fichier jquery.js
  • La class php encryption.php
  • Un dossier "download" sur notre serveur web

2 Création du fichier download.js

Ce fichier va prermettre de faire le lien entre l'action sur le click du lien de téléchargement et votre fichier

function download(param)
{
$.ajax({
type:'POST',
url:'ajax/predownload.php',
data:'file='+param,
success : function(data){
window.location = 'ajax/download.php?file='+data;
}
})
}

C'est une fonction ajax, trés simple, la variable "param" prendra la valeur du nom de notre fichier, mais le nom de notre fichier sera encodé avec la classe php encryption.php

3 La class Encryption.php

Cette class php va nous permettre de crypter et décrypter les noms de nos fichiers dans les pages html, le nom des fichiers sur le serveur restera le même !

<? php
class Encryption {
var $skey = ""; // change this
public  function safe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}
public function safe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
public  function encode($value){
if(!$value){
return false;
}
$text = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
return trim($this->safe_b64encode($crypttext));
}
public function decode($value){
if(!$value){
return false;
}
$crypttext = $this->safe_b64decode($value);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
return trim($decrypttext);
}
}
?>

La variable $skey sera notre clé de cryptage et décryptage

4 Création de notre lien de télechargement

Dans notre page php nous devons avoir le code suivant

 

require_once 'class/encryption.php';
$crypt = new Encryption();
$crypt->skey = session_id();
$myencodedlink = $crypt->encode('file_name_download.rar')
<img src="imgs/download" onclick="javascript:download('<?php echo $myencodedlink ?>');" />

Voila le lien de téléchargement est encodé.

Ci-dessous le lien encodé version html, c'est ce que peut voir l'utilisateur dans le code source de page html.

<img src="imgs/download" onclick="javascript:download('zXHDew3qb26ztJRcMPXK-W6QUFu-zYHn-Lo9MPAxgIc');">

Pensez vous que "zXHDew3qb26ztJRcMPXK-W6QUFu-zYHn-Lo9MPAxgIc" reste une information lisible et intellectuellement décodable ?
Pour ma part, je suis incappable de comprendre et décoder cette information.
De plus comme la clé de cryptage / décryptage est lié à la "session" de l'utilisateur, cette information sera différente quelque soit l'utilisateur, le navigateur ...elle changera à chaque "session utilisateur" !

5 Décrypter et envoyer le fichier

Pour faciliter la compréhension nous utiliserons 2 fichiers, l'un nommé "predownload.php", l'autre "download.php", ils seront placés dans notre dossier "ajax"

Le fichier "predownload.php" est appelé par la fonction javascript download(param), param étant le nom de notre fichier encodé avec la clé de cryptage correspondant à l'id session de l'utilisateur.

Le fichier "download.php" va lancer le téléchargement du fichier lors de l'évênemet "success" de notre fonction ajax.

le fichier predownload.php

<?php
session_start();
require_once '../class/encryption.php';
$crypt = new Encryption();
$crypt->skey=session_id();
$filename = $crypt->decode($_POST['file']); // décryptage du nom du fichier
echo $filename; // on renvoi le nom du fichier vers l'évênement success de la fonction ajax
?>

Ce fichier va décrypter le nom du fichier encodé, et le renvoyer à la fonction ajax.

le fichier download.php

<?php
$file='../download/'.$_GET['file'];
if (headers_sent()) {
echo 'HTTP header already sent';
} else {
if (!is_file($file)) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
echo 'File not found';
} else if (!is_readable($file)) {
header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
echo 'File not readable';
} else {
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
readfile($file);
exit;
}
}
?>

Ce fichier va forcer le téléchargement du fichier.

6 Conclusion

Comme vous pouvez le constater, il est assez simple de protéger ses liens de téléchargement, ce type de cryptage et décryptage des liens de téléchargement est utilisé dans le site country-and-city.fr

Vous devrez aussi penser à protéger votre dossier "Download" sur votre serveur via le fichier .haccess et robots.txt