Minggu, 18 Agustus 2013

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.


Sabtu, 03 November 2012

My Story in Senior High School




tak pernah terlintas dalam pikiran ku, seseorang yang dulu begitu di kagumi kini berubah menjadi teman terbaik yang pernah ada. seseorang yang dulu ketika di SMA membuatku sangat semangat menghadapi pagi, seolah-olah semua pagi terlihat cerah karena melihat wajahnya..

Ini adalah cerita ku saat SMA, cerita seorang anak SMA yang masih labil yang ingin mengenal apa itu cinta. Seperti kata pujangga “Cinta itu seperti semilir angin yang datang secara tiba-tiba, bisa kita rasakan kehadirannya, tapi tak bisa kita sentuh dan kita lihat, Sekali ia datang maka sulit untuk mengusirnya”.  Wajar jika anak SMA itu @llay sebab dimasa-masa itulah ia mencari jati dirinya, masa transisi menuju kedewasaan nya.

Cerita ini bermula suatu ketika ada acara keagamaan disekolah itu yang dimana yang memberi pidato yaitu murid SMA di sekolah tersebut, pidato itu bergiliran setiap kelasnya, dan dimulailah acara pidato dipagi itu, kalo gak salah ada tiga versi bahasa yang ditampilkan dalam pidato itu, yaitu versi pidato bahasa Indonesia, bahasa inggris dan bahasa arab. Kalo bahasa Indonesia sih ane juga bisa, tapi kalo bahasa inggris apalagi bahasa arab gigit jari aja deh..  hehhe..   Yang pertama tampillah murid yang pidato pakai bahasa Indonesia..  bla.bla.bla..  selesai. Dan yang kedua tampil lagi murid yang pidato pakai bahasa inggris..  bla.bla.bla..dengan logat sok kebule-bulean pada hal bu’le(sebutan untuk bibi dalam bahasa jawa) , dan selesai pakai bahasa inggris..   dan muncul lah saat yang ditunggu-tunggu, tengneng.. padahal apa coba yang ditunggu. Hehe J.  Dan saat itu pembawa acara memanggil seorang nama untuk pidato versi bahasa arab, kalo gak salah Pembawa acara nya ngomong seperti ini “dan acara selanjutnya pidato bahasa arab yang disampaikan oleh (…) kepada (…) dipersilahkan..”.(upps..  sorry untuk menjaga privasi nama tak disebut..  hehe J, kalo merasa perlu dikasih nama juga yaudah kasih aja namanya tukinem, hehe..) nama itu lah yang aku ingat sampai saat ini, eh bukan tukinem loh ya. heheh  J.  Dan tampillah dia dengan pidato bahasa arab nya yang membuat seluruh audien terpaku mendengar nya, padahal 100% yakin gak ada yang tau tuh artinya, Cuma sok-sok memperhatiin aja. Hhe J. Disamping itu mulailah konco-konco pada ngeributin tuh cewek yang pidato pake tuh bahasa arab, sambil main lempar-lemparan batu kecil (memang dasar anak-anak.. -_-“  heheh  J), kita sih santai aja, tapi tetap dalam hati ngotot ngapalin nama tuh cewek sama kelas nya.  Hhe.. .  Waktu itu aku Cuma salut aja sama tuh cewek , dalam hati “keren benar neh cewek udah tampang oke, pandai bahasa arab pula lagi”, padahal gak tau, mungkin tuh cewek Cuma ngapalin teks dan dia sendiri juga gak tau arti pidato yang disampaikannya, seperti film three idiots gitu, hehehe..  Dan saat itu mulailah timbul rasa – rasa penasaran sama tuh cewek yang membuat hati bertanya-tanya seperti : ‘nih cewek punggung nya bolong gak ya?’,nginjak tanah gak ya?’,’kalo marah ngegigit gak ya?’  hehe..  becanda J.


Semenjak acara pidato itu, mulailah rasa penasaran pengen melihat nya setiap jam istirahat kelas, saat itu sempat sih dalam hati ngerasa begok, kenapa ya baru sekarang nyadar ada cewek seperti itu disekolah ini, selama ni kemana aja (sambil mukul tangan J), mungkin juga waktu itu gak ngerasa keberadaan tuh cewek karena ane ada pujaan hati yang lain saat itu, yaitu dia kakak kelas disekolah itu, nah keren gak tuh bisa cinta-cintaan sama kakak kelas..  hahah  J, mungkin cerita tentang kakak kelas itu di kesempatan yang lainnya aja kali ya, soalnya di cerita ini pengen focus sama tuh cewek yang pidato pakai bahasa arab.yuk lanjutin cerita nya, Kalo dibilang sering, sering sih lihat tuh cewek waktu istirahat jam pelajaran, tapi ya itu, lihat aja tapi gak berani nyamperin (tensin dong J). Oh iya ingat banget waktu cpcp sama tuh cewek waktu senam pagi setiap hari sabtu. Dulu suka banget ngelihat tuh cewek sambil dalam hati berkata ”oh bidadari yang turun dari langit ke delapan (lebaii)” tapi waktu tuh cewek balas ngelihat, langsung secepat kilat mengalihkan pandangan seakan-akan gak peduli sama tuh cewek (biasa taktik cowok  J), yaitu waktu lebih lama bisa ngelihat tuh cewek kalo gak jam upacara senin ya waktu senam pagi sabtu, selain itu ngelihat Cuma sekilas doang, maka nya kesal banget kalo gak jadi senam atau upacara pagi..  hhe  ngarep..  J. apalagi tambah semakin penasaran sama tuh cewek karena sering banget ngelihat nya sholat dan di tambah dia tuh anak rohis, dengan begitu, tuh cewek punya imej cantik + soleha, perfek banget deh.. (makin suka aja jadinya  J).

Sampai lah suatu ketika ada teman yang udah lebih dulu kenal sama dia, dan ternyata tuh teman juga punya nomor hp dia, tapi masalah nya tuh teman gak mau ngasih nomor tuh cewek (kebayang gak gimana kesalnya waktu itu), yaudah mulai atur siasat gimana cara ngedapatin nomor hp tuh cewek dari tuh teman (berfikir keras). Sampai pada suatu ketika pelajaran olahraga yang dimana gurunya gak datang, yaudah kami bebas main, mau itu main futsal,basket,badminton atau sebagainya. Saat itu tuh teman ngajakin main futsal,tapi ane nolak dengan alasan kecapekan, dia bilang “yaudah aku main futsal dulu tapi tolong pegangkan HP sama dompet akulah” tengneng.. Ternyata pucuk dicinta ulam pun tiba, dengan secepat kilat langsung nyari nama tuh cewek dari contact numb. Tuh teman, ternyata ada dua nama yang sama , yaudah lgsg catat aja kedua-duanya, mulai deh nyalin nomor tuh cewek ke HP sambil mata berbinar-binar dan jantung berdebar-debar (aneh, padahal Cuma nyatat nomor hpnya tapi kok segitunya ya. Hhe..).

Setibanya dirumah langsung miskolin kedua nomor tersebut (nunggu nyampe dirumah dulu biar aman, hhe..), miskol nomor hp pertama, dan ternyata yang angkat cowok, dalam hati berkata buset deh, neh pasti dikerjain sama tuh teman, tapi pantang menyerah coba lagi, nomor yang kedua, wah ternyata yang angkat cewek, ada sedikit harapan.. malamnya baru sms tuh cewek, kira-kira bunyi sms nya seperti ini “Hai, salam kenal buat bidadari tercantik yang pernah ada..  boleh kenalan gak, nama aku ridho, nama kamu siapa?”(sedikit alai sih, tapi namanya juga usaha, hhehehe J).  Nunggu beberapa menit, dan ternyata sms nya dibalas. Gak kebayang kan gimana senang nya waktu itu, kalo di ibaratkan seperti roket yang langsung terbang ke langit ke tujuh, hhe.. kira-kira bunyi sms yang dibalas nya seperti ini “kamu salah orang kali, nama aku (…)” , biasalah cewek kalo di gombalin dikit, pasti dia sedikit bingung menerima gombalan dari kita para cowok, maka dia balas nya kayak gitu.. (hhehe..)  tapi yang pasti lampu hijau telah hidup dan terus smsin dia sampai benar-benar tau siapa dia sebenarnya.

(To be continued..)