Salah satu masalah seorang web developer adalah ketika berusaha melakukan pembatasan download. Pembatasan download disini bukanlah dimaksudkan sebagai manajemen bandwidth seperti yang dilakukan oleh administrator jaringan komputer. Tapi yang dimaksud pembatasan download disini adalah membatasi hanya user yang telah terdaftar saja yang boleh melakukan download. Masalah kembali muncul ketika browser menampilkan letak asli direktori penyimpanan file tersebut. Tentunya script yang telah di buat menjadi sia-sia.
Masalah lain berkenaan dengan pembatasan download kembali ada ketika user menggunakan download manager. Bisa diambil contoh www.pdfchm.com.
Belakangan ini penulis pun memiliki beberapa pertanyaan. Bagaimana melakukan pencegahan yang baik agar hanya user yang sudah registrasi saja yang dipersilahkan untuk mendownload. Maklum, banyak pendownload sejati yang tidak pernah kehabisan akal untuk mencari cara bagaimana mendownload yang baik. :D~~ Termasuk penulis sendiri. :D~~
Beberapa waktu terakhir penulis mencoba merakit sebuah script untuk memberikan solusi itu semua. Yang menakjubkan adalah didalamnya sudah termasuk solusi pencegahan download oleh Download Manager seperti IDM, Download Accelerator Plus, dan berbagai download manager lain. :D~~
Yang ada hanyalah user mendapatkan file html biasa ketika melakukan download menggunakan download manager. :D~~ Kesal memang di sisi pendownload. Tapi menguntungkan bagi kita. Setidaknya bisa meminimalisir masalah-masalah yang ada.
Yupsss... dari pada penulis berbicara sendirian nggak karuan, lebih baik langsung penulis jabarkan sedetil mungkin mengenai cara pembatasan download dengan php.
Di bawah ini hanyalah sebuah contoh yang penulis buat untuk menjelaskan bagaimana cara kerja script ini.
Pertama adalah file index.php penulis tidak akan menjelaskan script ini, karena cukup familiar.
<?php
echo "<a href=reg.php>Yang sudah Registrasi dan bayar duitnya ... :D~~~</a><br><br>
Kalo mau ngetest yang nggak bayar browsernya di clear sessionnya dulu ... <br>
<a href=non-reg.php>Tukang download tapi nggak bayar, gw banget :D~~~</a>";
?>
Kedua adalah file reg.php. Penulis andaikan script ini adalah keadaan ketika user telah teregistrasi dan akan mendownload file yang diinginkan.
Ditampilkan sebuah form berikut security codenya. User dipersilahkan untuk mengisi nama, email dan code yang telah disediakan. Jika syarat telah terpenuhi maka user diperbolehkan untuk melakukan download. Jika tidak user akan diredirect ke halaman redirect.php .
<?php
session_start();
require_once "code.php";
$codenya = generateCode(6);
$_SESSION['code'] = $codenya;
$_SESSION['download'] = session_id();
$_SESSION['cekdownload'] = $_SESSION['download'];
echo "<br><br><br><table border=0 align=center><form action=cek.php method=post>
<tr><td>Nama</td><td><input type=text name=nama></td></tr>
<tr><td>Email</td><td><input type=text name=email></td></tr>
<tr><td></td><td>$codenya</td></tr>
<tr><td>Codenya</td><td><input type=text name=code></td></tr>
<tr><td></td><td><input type=submit name=kirim value=Download!!></td></tr>
</form>
</table>";
?>
Sedikit penulis jelaskan script diatas. Terdapat suatu fungsi dan satu form.
Fungsi tersebut adalah generateCode() ...
$codenya = generateCode();
Fungsi ini diambil dari file code.php, isinya adalah sebagai berikut :
<?php
function generateCode() {
$characters = 5;
$possible = '24107ILMUWEBST';
$code = '';
$i = 0;
while ($i < $characters) {
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}
return $code ;
}
?>
Fungsi tersebut hanya melakukan proses randomisasi angka dan huruf. Kemungkinan angka-huruf dan berapa bit yang akan ditampilkan dapat diset sesuai keinginan.
Kalimat intinya adalah :
while ($i < $characters) {
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}
Ini berarti, lakukan proses randomisasi sepanjang n $characters dengan menggunakan variable $possible sebagai kemungkinannya.
Anda dapat menggunakan logika milik anda untuk melakukan proses randomisasi. Ini hanya sebagai contoh proses randomisasi yang nantinya digunakan sebagai security code.
Balik lagi ke halaman reg.php
$_SESSION['code'] = $codenya;
$_SESSION['download'] = session_id();
$_SESSION['cekdownload'] = $_SESSION['download'];
$_SESSION['code'] nantinya digunakan sebagai patokan untuk melakukan pencocokan dengan variable $_POST['code'].
Variable $_POST['code'] sendiri dihasilkan dari text inputan bernama 'code' yang dimasukkan oleh user ketika mengisi form inputan.
$_SESSION['download'] di peroleh dari session_id(), disini penulis gunakan ketika user dalam kondisi telah login. Dan nantinya pula akan digunakan untuk memberikan izin hanya user yang telah teregistrasi saja yang dipersilahkan untuk mendownload.
$_SESSION['cekdownload'], penulis gunakan variable session ini untuk penegasan saja.
Kemudian file cek.php berisi :
<?php
session_start();
if (ISSET($_POST['nama']) && ISSET($_POST['email']) && ISSET($_POST['code']))
{
if ( $_SESSION['code'] == $_POST['code']) { header ("location: download.php/true/$_SESSION[download]"); }
else { echo "Security Codenya Salah !!"; }
}
?>
script ini berfungsi untuk melakukan filterisasi :
if (ISSET($_POST['nama']) && ISSET($_POST['email']) && ISSET($_POST['code']))
ketika user telah berhasil memasukkan nama, email dan security code
if ( $_SESSION['code'] == $_POST['code'])
dan apabila user telah benar mengisi security codenya maka
header ("location: download.php/true/$_SESSION[download]")
user akan di redirect untuk mendownload filenya.
dan kalimat ini
else { echo "Security Codenya Salah !!"; }
terjadi karena user salah mengisi codenya.
Kemudian script intinya adalah download.php :
<?php
session_start();
if (ISSET($_SESSION['download']) && ($_SESSION['download'] == $_SESSION['cekdownload']) )
{
// artibut file
$fileName = 'sample.zip';
$mimeType = 'application/zip';
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 5') or
strpos($_SERVER['HTTP_USER_AGENT'], 'Opera 7')) {
$mimeType = 'application/x-download';
}
// file apa yang mau didownload --> untuk browser
header('content-disposition: attachment; filename=' . $fileName);
header('content-type: ' . $mimeType);
header('content-length: ' . filesize($fileName));
// Display the file
readfile($fileName);
}
else { header("location: redirect"); }
?>
Terdapat kalimat seperti ini :
if (ISSET($_SESSION['download']) && ($_SESSION['download'] == $_SESSION['cekdownload']) )
seperti yang penulis katakan tadi, ini hanyalah penyeleksian saja, sengaja penyeleksian penulis lakukan berulang-ulang karena pada dasarnya script inti ini berada di halaman yang berbeda dengan halaman ketika user baru berhasil login. Sehingga script ini yang menjadi tulang punggung. Tugasnya adalah menipu browser dengan memberikan spesial header. Sehingga walaupun user yang sebelumnya telah melakukan download, dan memberikan link seperti ini :
http://www.victim.com/download.php/true/80261996fc7a35138de58216ac02a78a
kepada temannya untuk mendownload sedangkan user yang telah teregistrasi telah habis masa sessionnya, yang ada hanyalah user yang belum teregistrasi tersebut diredirect ke halaman yang membuat keadaan menjadi sepi dan dunia semakin fana. :D~~
Di script contoh saya memberikan kalimat seperti ini berada dalam file redirect.php
<?php
echo "<h1><font color=red>Kalo mau Download <br>Bayar Donk ... <br>huehuheu :D~~</font></h1>";
?>
kembali ke script inti tadi, yakni download.php
kalimat ini :
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 5') or
strpos($_SERVER['HTTP_USER_AGENT'], 'Opera 7')) {
$mimeType = 'application/x-download';
}
Sebetulnya hanya mencegah kebiasaan buruk yang dilakukan oleh dua browser ketika membaca suatu type file.
Selanjutnya :
header('content-disposition: attachment; filename=' . $fileName);
header('content-type: ' . $mimeType);
header('content-length: ' . filesize($fileName));
// Display the file
readfile($fileName);
yang pertama
header('content-disposition: attachment; filename=' . $fileName);
header content-disposition ini memerintahkan browser untuk memperlakukan file yang kita letakkan dalam direktori hosting sebagai sebuah file yang akan didownload.
header content-type, ini sengaja digunakan karena terkadang kedua browser yakni opera dan internet explorer kembali gagal mengenali type file. Perlu diberitahukan berkali kali memang. Bandelll !! :D~~~ huehue . ( Makanya pake mozilla firefox dong :D~)
header('content-length: ' . filesize($fileName)); kalimat ini berfungsi untuk memberitahukan seberapa besar file yang akan di download, sehingga ketika browser melakukan download sang user bisa melihat dalam progress bar seberapa persen file yang sedang didownload.
Yang terakhir adalah readfile($fileName);, karena header-header sebelumnya telah mengenalkan kepada browser bahwa file ini bertipe zip, memiliki size sekian dan juga telah memberitahukan browser untuk mengenali bahwa file tersebut yang nantinya akan didownload maka readfile sebagai pelengkap untuk membaca file yang akan didownload, secara teknis hanya menampilkan form dialog download.
Tidak ketinggalan penulis pun membuat sebuah file .htaccess untuk melakukan redirect.
Hanya bertugas untuk menyamakan kedudukan http://www.victim.com/redirect.php sama dengan http://www.victim.com/download.php/true/redirect.
Jadi jangan lupa untuk mengaktifkan mod_rewite anda.
Untuk mengaktifkan mod_rewrite, anda bisa mengedit file httpd.conf dengan menghilangkan tanda # pada baris
#LoadModule rewrite_module modules/mod_rewrite.so
sehingga menjadi
LoadModule rewrite_module modules/mod_rewrite.so
Selamat mencoba.
Script lengkapnya dapat anda download disini http://www.networkandgame.890m.com/ilmuwebsite/labdownload.zip
By: Al-k
Alkemail@gmail.com
Tutorial Jaringan Komputer
http://www.ilmuwebsite.com
Silahkan dikembangkan.
Greetz :
b_scorpio --> tukang jualan CD. :D~~ jojo&zakki
syabab.el-bughury -->tukang download , tukang jamu :D~~ , tukang install
Learning PHP Tutorial Programing Tips and Sample Source Code
Sunday, July 6, 2008
Batasi Download File dengan PHP Script
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment