adfly.468x60.5 Dulang Dollar Melalui ShortURL adf.ly | short URL

04 September 2008

Batasi File Download dgn PHP
Share

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.

echo "Yang sudah Registrasi dan bayar duitnya ... :D~~~


Kalo mau ngetest yang nggak bayar browsernya di clear sessionnya dulu ...

Tukang download tapi nggak bayar, gw banget :D~~~";
?>
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 .
session_start();
require_once "code.php";
$codenya = generateCode(6);
$_SESSION['code'] = $codenya;
$_SESSION['download'] = session_id();
$_SESSION['cekdownload'] = $_SESSION['download'];
echo "









Nama
Email
$codenya
Codenya
";
?>
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 :
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 :
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 :
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
echo "

Kalo mau Download
Bayar Donk ...

huehuheu :D~~

";
?>
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

Cetak

Artikel Lain :


0 komentar:

Berlangganan

Berlangganan RSS Feed via Email:


Artikel Populer

Blog Archive

Pengikut

blog-indonesia.com



Recomended Download


Add to Your Blog