Script PHP Untuk Mencegah Pengunduhan File Secara Langsung (Direct Download)

Ini adalah artikel pertama saya yang saya publish di blog tutorial gratis ini setelah lebaran kemarin. Sebelumnya saya ucapkan Mohon Maaf Lahir dan Batin kepada para pengunjung blog tutorial gratis ini yang mungkin ada kesalahan dari saya dalam menulis artikel atau belum sempat menjawab semua komentar yang masuk ke blog ini karena saking banyaknya.
Dalam artikel PHP kali ini, saya akan mencoba memaparkan bagaimana cara mencegah proses pengunduhan file secara langsung (direct download) menggunakan script PHP. Apa sih itu direct download? OK, penjelasannya adalah sebagai berikut. Misalkan Anda mengupload sebuah file berekstension ZIP ke server hosting, katakanlah nama filenya ‘x.zip’. Kemudian misalkan web site Anda adalah www.situsku.com, maka seorang pengunjung bisa langsung mengunduh file ‘x’ tadi hanya dengan memanggil URL http://www.situsku.com/x.zip di browser. Nah, sekarang bagaimana caranya untuk mencegah seseorang mengunduh secara langsung ke file tersebut? dalam arti, orang tersebut hanya bisa mengunduh setelah dia membuka halaman web tertentu, kemudian dia mengklik link download yang ada di halaman tersebut. Jika dia ingin mencoba mengunduh langsung file nya dengan mengakses URL download nya di browser, maka dia tidak bisa melakukannya. Saya kira sudah paham ya maksud saya? :-)
Teknik ini akan bermanfaat untuk mencegah seorang pengunduh menggunakan software downloader seperti misalnya: Flashget atau Download Manager dsb, yang memungkinkan proses pengunduhan dilakukan secara multipart. Teknik ini juga akan bermanfaat bagi pemilik web site karena setiap pengunduh file mau tidak mau harus membuka halaman web tertentu dahulu sebelum mengunduhnya, sehingga web site akan selalu dikunjungi oleh pengunduh file.
Nah sekarang bagaimana teknik implementasinya? Idenya sebenarnya sederhana yaitu dengan memanfaatkan session. Ketika seseorang membuka sebuah halaman web tertentu yang berisi link download, maka sebuah SESSION akan diset. Kemudian kita buat script PHP untuk proses download nya. Di dalam script PHP yang kita buat ini, kita cek dahulu apakah SESSION telah diset sebelumnya? Jika SESSION telah diset, maka proses download akan berjalan. Namun, jika SESSION belum diset, maka download gagal. Pengunjung yang mencoba langsung mengunduh file dengan cara membuka URL downloadnya secara langsung maka SESSION tidak akan pernah diset, dan akibatnya dia tidak bisa melakukan pengunduhan.
OK demikian tadi idenya, sekarang saatnya scripting. Mula-mula kita buat halaman web untuk menempatkan link downloadnya. Saya buat yang simpel saja ya, seperti ini:
index.php
01.<?php
02.// mulai session
03.session_start();
04.// set session dengan nama 'akses'
05.$_SESSION['akses'] = true;
06. 
07.echo "<ul>";
08.echo "<li><a href='download.php?id=1'>File 1</a></li>";
09.echo "<li><a href='download.php?id=2'>File 2</a></li>";
10.echo "<li><a href='download.php?id=3'>File 3</a></li>";
11.echo "</ul>";
12. 
13.?>
Sesuai skenario di awal tadi, di halaman index.php perlu kita tambahkan proses untuk setting session, dan kemudian di script tersebut dicontohkan tersedia 3 buah link, dengan masing-masing link diarahkan ke script download.php?id=idfile nya. Perlu diketahui, bahwa kita jangan langsung membuat link ke masing-masing secara langsung melainkan diarahkan ke script download.php terlebih dahulu. Sedangkan untuk pembeda setiap file yang akan didownload, kita gunakan parameter id file. Meskipun di index.php tersebut tampak link downloadnya, akan tetapi jika ada seseorang yang ingin mengunduh sebuah file dengan langsung membuka URL “download.php?id=idfile” nya di browser maka proses download tidak bisa dilakukan karena dia belum membuka index.php terlebih dahulu.
Kemudian bagaimana isi script download.php nya? Ini dia… jreeng…
download.php
01.<?php
02. 
03.session_start();
04. 
05.function downloadFile($id)
06.{
07.// path direktori file yg akan didownload
08.$dir '/dir/fileku/';
09. 
10.// mengarahkan id file ke nama filenya
11.if ($id == 1) $filename $dir.'file1.zip';
12.else if ($id == 2) $filename $dir.'file2.zip';
13.else if ($id == 3) $filename $dir.'file3.zip';
14. 
15.// membaca isi file untuk didownload
16.header('Content-Description: File Transfer');
17.header('Content-Type: application/octet-stream');
18.header('Content-Disposition: attachment; filename='.basename($filename));
19.header('Content-Transfer-Encoding: binary');
20.header('Expires: 0');
21.header('Cache-Control: must-revalidate');
22.header('Pragma: public');
23.header('Content-Length: ' filesize($filename));
24.ob_clean();
25.flush();
26.readfile($filename);
27.exit;
28.}
29. 
30.// membaca id file
31.$id $_GET['id'];
32.// cek session, jika sessionnya ada maka file didownload
33.// jika session tidak ada, maka tdk bisa download
34.if (isset($_SESSION['akses']))
35.{
36.downloadFile($id);
37.}
38.else echo "<p>Anda tidak bisa download langsung</p>";
39. 
40.?>
di dalam script download.php, sebelum proses download akan dicek dahulu apakah SESSION sudah diset atau belum dengan menggunakan blok IF sbb:
1.if (isset($_SESSION['akses']))
2.{
3.downloadFile($id);
4.}
5.else echo "<p>Anda tidak bisa download langsung</p>";
dalam hal ini, function downloadFile($id) adalah function untuk proses pengunduhan file nya berdasarkan id filenya. Dengan adanya script tersebut, pengunduh file tidak akan mengetahui dimana letak path direktori file yang diunduhnya di dalam server web karena path direktori tersebut kita set di dalam script. Hal ini berbeda dengan direct download.
Berikut ini tampilan proses download file yang melalui index.php
 Script Download Sukses
Sedangkan berikut ini tampilan jika kita langsung buka URL downloadnya di browser tanpa melalui index.php
 Script Download Gagal
NB: efek download yang gagal di atas akan tampak setelah sebelumnya Anda tutup browsernya terlebih dahulu, karena jika tidak ditutup dahulu maka SESSION nya masih aktif. Dengan menutup browser, maka SESSION akan terhapus.
Mudah bukan membuatnya? selamat mencoba dan semoga bermanfaat ya. Stay tune terus di blog tutorial gratis ini ya.


Posting Komentar

Lebih baru Lebih lama

Formulir Kontak