Wednesday, December 19, 2007

Mencegah Direct Download

Contoh kasus:
Kita ingin menyediakan file pdf untuk di-download oleh user dan lokasi file tidak boleh diketahui oleh user. User hanya bisa men-download file dengan cara mengklik link. Bahasa yang digunakan adalah PHP.

Analisa:
Kita bisa membuat link yang ditujukan ke file yang akan di-download. Contoh kode seperti di bawah ini:

Code:
<a href="myebook.pdf">Download MyEbook</a>

Apa yang terjadi kalau link seperti ini diklik? Hasilnya tergantung dengan browser yang bersangkutan. Bila plug-in untuk pdf reader terinstal, maka browser akan berbaik hati membuka file tersebut. Bagaimana bila tidak ada plug-in pdf reader? Maka akan muncul kotak dialog untuk men-download file tersebut.

Satu masalah selesai bila user tidak memiliki plug-in pdf reader. Tetapi bagaimana dengan user yang punya? Tentu masalahnya tidak terselesaikan. Masalah lain muncul yaitu user mengetahui lokasi file tersebut, sehingga memungkinkan user melakukan direct download (men-download file langsung, dengan mengetikkan lokasinya di browser, tanpa melalui halaman download yang kita sediakan).

Penyelesaian:
Dibutuhkan sedikit programming (PHP) untuk menyelesaikan masalah ini.

Berikut ini kode untuk mencegah direct download:

<?php

$task = $_REQUEST['task'];

switch($task) {
case 'download':
// lokasi file
$file_path = 'dl/myebook.pdf';

// fungsi untuk mengambil nama file tanpa path
$file_name = basename($file_path);

// ambil ukuran file
$fsize = filesize($file_path);

// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/pdf");
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);

// mulai men-download dari sini
$file = @fopen($file_path,"rb");
if ($file) {
while(!feof($file)) {
print(fread($file, 1024*8));
flush();
if (connection_status()!=0) {
@fclose($file);
die();
}
}
@fclose($file);
}

break;
default:
echo '<a href="donlot.php?task=download">Download MyEbook</a>';
break;
}

?>


Yang perlu diperhatikan disini adalah pada baris:
header('Content-Disposition: attachment; filename="myebook.pdf"');

Baris inilah yang memerintahkan browser untuk memunculkan kotak dialog download file myebook.pdf walaupun sudah terdapat plug-in pdf reader pada browser.

Untuk mengganti jenis file (exe atau zip), kita hanya perlu mengubah Content-Type.
Berikut adalah daftarnya:

// archives
application/zip

// documents
application/pdf
application/msword
application/vnd.ms-excel
application/vnd.ms-powerpoint

// executables
application/octet-stream

// images
image/gif
image/png
image/jpeg
image/jpeg

// audio
audio/mpeg
audio/x-wav

// video
video/mpeg
video/mpeg
video/mpeg
video/quicktime
video/x-msvideo

Untuk fungsi mendownload bisa dilihat dari komentar pada kode diatas (setelah baris //mulai men-download dari sini).

Sebenarnya, apa sih tujuan mencegah direct download? Tujuannya adalah untuk mengecek berapa kali sebuah file di-download.

Bila user diperbolehkan men-download langsung, tentu akan sulit melacak berapa kali file tersebut di-download.


Semoga bermanfaat... :)

1 comment:

infogue said...

Artikel di blog ini sangat bagus dan berguna bagi para pembaca. Agar lebih populer, Anda bisa mempromosikan artikel Anda di infoGue.com yang akan berguna bagi semua pembaca di seluruh Indonesia. Nantikan segera plugin / widget kirim artikel & vote yang ter-integrasi untuk Blogspot dan Wordpress dengan instalasi mudah & singkat. Salam Blogger!

http://infogue.com/pengetahuan_umum/mencegah_direct_download/