Skip to main content

PHP: Menyembunyikan Path File Download

Hah, mulai lagi. Sebagai pemanasan dimulai dengan yang mudah dulu,dalam hal pengamanan download file. Tujuannya adalah dengan membuatsebuah script download tanpa harus langsung diarahkan ke file tujuanyang bisa diambil user. Langkah yang paling primitif dalam menyediakan download file adalah dengan anchor hyperlink.
<a href='Arsip/Laporan-jun-08.pdf' >download</a>
Dengan hyperlink diatas, file yang disediakan di server akan dikirimkan untuk diambil, misalkan dengan fullpath dari file tersebut'/var/www/Arsip/Laporan-jun-08.pdf'. Sekarang dengan fasilitas headerdari php, kita bisa menyembunyikan relatif sekaligus fullpath dari file.
Dengan menyembunyikan url file, user tidak perlu mengetahui path asli dari file, download dialog cuma menampilkan bahwa file diambil darisebuah file php.

Dengan tujuan dan keuntungan dari metode ini adalah:
- Lebih menyamarkan susunan direktori dari htdocs server.
- Memaksa browser untuk langsung menyediakan download dialog, tanpa terlebih dahulu melihat tipe file yang didownload.
Pada direct url, browser terlebih dahulu melihat plugin pembuka fileyang ada didalam dirinya, dan membuka, bukan lagi mendownload file, apabila memungkinkan. Misalkan kita menyediakan url dengan tipe filepdf, maka browser mendeteksi mime-type-nya sebagai application/pdf,membuka internal viewer untuk pdf, misalkan berupa plugin dari acrobatreader. Tentu ini menjengkelkan bagi user karena lebih mudah kalau filedidownload terlebih dahulu setelah itu file yang sudah tersimpan dilain waktu.
Dengan menggunakan hiding url, browser tidak bisa melakukan deteksitipe file karena mime-type-nya sudah disamarkan sebagai octet-stream,bahkan apabila kita memberikan download untuk file dengan tipe yangbisa dibuka langsung oleh browser, misalkan html, php, atau xml.
- Tidak menyediakan langsung alamat aslinya, artinya lebih menyulitkanuser yang menggunakan download manager yang bersifat multiple downloadsekaligus yang bisa memperlambat user yang lain. Url yang diperlihatkankepada user adalah url dari file php dengan skrip hiding url ini.
- Dengan memanfaatkan session, kita bisa mengatur hanya user yang sudahmelakukan autentifikasi yang bisa mengambil file yang kita sediakan.
- kita bisa menyediakan url file yang bersifat valid untuk sementara,dengan penambahan angka random dalam url, dengan tanggal expired yang bisa ditentukan.
- Bisa meyediakan fasilitas php yang lain, selain session dan random,misalkan, integrasi dengan database untuk manajemen dan statistikdownload, download file yang di-generate secara dinamis melalui imagecreate, memanfaatkan variabel $_POST, dll. Tergantung kreatifitas aja deh.

Fungsi dasar yang digunakan adalah:
- ob, untuk melakukan output buffering, mengumpulkan beberapa data untuk dikirimkan semua sekaligus ke user secara langsung.
- header, untuk menentukan header dari respon server. header, artinyaskrip ini harus diletakkan di paling atas dari skrip yang lain. Tidak boleh didahului dengan header yang lain dan respon server lainnya.Misalkan didahului oleh echo atau tag html, bahkan harus diatas<html> sekalipun. HMMM, sekarang masalah header agak sedikitpanjang seritanya, makanya coba dulu beberapa hal.

+ Contoh dari penggunaan header adalah untuk melakukan redirect dengan cara berikut:
<?
header('Location: http://www.om4gus.blogspot.com/');
?>


+ kemudian letakkan skrip diatas yang lain, tambahkan exit untuk memastikan tidak ada respon lainnya yang dikirimkan:
<?
header('Location: http://www.om4gus.blogspot.com/');
exit();
?>


+ Header yang didahului respon lainnya akan mengembalikan error berikut:
Warning: Cannot add header information - headers already sent
contohnya untuk :
<html>
<?
header('Location: http://www.om4gus.blogspot.com/');
?>


untuk memastikan tidak ada error yang berhubungan dengan header tersebut cek isi header terlebih dahulu:
if (!headers_sent()) {
header('Location: http://www.om4gus.blogspot.com/');
exit;
}


Sekarang Alternatif untuk redirect tanpa harus memikirkan header segala macam, bisa diletakkan dibagian manapun, adalah dengan menggunakan js
<?
echo "<script>location.assign('http://www.om4gus.blogspot.com/')</script>";
exit();
?>


atau memaksa user untuk kembali ke halaman sebelumnya dengan back(), forward untuk halaman berikutnya:
<? echo "<script>history.back();</script>"; ?>

Tambahan, karena perintah header selalu diletakkan di paling atas, usahakan selalu menggunakan file php yang terpisah dari file lain, dengan keperluan khusus untuk menangani download file. Atau kalaupun bersamaan dengan lainnya, gunakan sebuah kondisi, misalkan pengecekan dengan variabel session atau get, sehingga hanya dijalankan karena kondisi tertentu.

Sekarang kembali ke topik utama, masalah implementasi.....
Tinggal membuat hiperlink yang diarahkan ke sebuah php, yang mentrigger terjadinya proses download.
<html>
<a href='dl.php' />Download</a>
</html>


Yup, simple! ingat, ke php, bukan file aslinya seperti sebelumnya, <a href='Arsip/Laporan-jun-08.pdf'>, kemudian buat file pdf sesuai alamat tersebut untuk percobaan selanjutnya.


Untuk Source dari file php yang dipanggil, coba satu-persatu contoh implementasi berikut:
Fungsi dasar untuk melakukan hiding url fullpath, dengan tetap menggunakan nama file asli dari file yang didownload:
<?
//file dengan nama dl.php
//pembuatan fungsi
function download($url){
ob_start();
$mm_type="application/octet-stream";
header("Cache-Control: public, must-revalidate");
header("Pragma: File Download");
header("Content-Type: $mm_type");
header("Content-Length: ".(string)(filesize($url)));
header('Content-Disposition: attachment; filename="'.basename($url).'"');
header("Content-Transfer-Encoding: binary\n");
ob_end_clean();
readfile($url);
exit();
}
//Contoh pemanggilan
if(file_exists("Arsip/Laporan-jun-08.pdf"))
download("Arsip/Laporan-jun-08.pdf");
?>


Fungsi dengan melakukan hiding fullpath, sekaligus memberikan nama file falsu sebagai default save name:
<?
//pembuatan fungsi
function download($url,$fakename){
ob_start();
$mm_type="application/octet-stream";
header("Cache-Control: public, must-revalidate");
header("Pragma: File Download");
header("Content-Type: $mm_type");
header("Content-Length: ".(string)(filesize($url)));
header('Content-Disposition: attachment; filename="'.$fakename.'"');
header("Content-Transfer-Encoding: binary\n");
ob_end_clean();
readfile($url);
exit();
}
//Contoh pemanggilan
if(file_exists("Arsip/Laporan-jun-08.pdf"))
download("Arsip/Laporan-jun-08.pdf","Laporan-current.pdf");
?>



Sekarang, contoh yang menggunakan session
<?
session_start();
function download(){
$url=$_SESSION[user]."/Laporan-jun-08.pdf";
ob_start();
$mm_type="application/octet-stream";
header("Cache-Control: public, must-revalidate");
header("Pragma: File Download");
header("Content-Type: $mm_type");
header("Content-Length: ".(string)(filesize($url)));
header('Content-Disposition: attachment; filename="'.$_SESSION[user]."_".basename($url).'"');
header("Content-Transfer-Encoding: binary\n");
ob_end_clean();
readfile($url);
exit();
}
if(isset($_SESSION[user]))
download();

if(isset($_POST[uname])){
if($_POST[uname]=="me"&&$_POST[pass]=="em"){
session_register(user);
$_SESSION[user]="Aku";
//<script>location.assign('http://www.om4gus.blogspot.com/')</script>
}else if($_POST[uname]=="mine"&&$_POST[pass]=="enim"){
session_register(user);
$_SESSION[user]="Saya";
} header('Location: '.$_SERVER[PHP_SELF]);
}else{
?>
<form method=POST>
<center>
<input type=text name=uname><br/>
<input type=password name=pass><br/>
<small>coba, username me passwordnya em</small><br/>
<input type=submit name=login value="login untuk mendownload">
<center>
</form>
<?
}
?>


That's it. Gampang khan?

Comments

  1. This comment has been removed by a blog administrator.

    ReplyDelete
  2. @ PORTABLE SOFTWARE
    MAKASIH, ORANG YANG HEBAT SEPERTI ANDA SUDAH MENYEMPATKAN DIRI UNTUK MENINGGALKAN KOMENTAR DI BLOG SAYA YANG JELEK INI. OH IYA, NERAKA JAHANAMNYA SEBELAH MANA MAS? SIAPA TAU KITA TETANGGAAN

    ReplyDelete
  3. Om, saya udah coba script di atas.
    Yg 1 dan 2, yg pakai session belum.
    Itu kalau di localhost bisa jalan tapi setelah saya upload koq gak bisa ya ..??
    Memang bener dialog box untuk download tampil, tapi begitu file yg didownload dibuka selalu error. Dan ukurannya sama, 135 byte.
    Itu kenapa om, bagaimana benerinnya ..??
    Terima kasih

    ReplyDelete
  4. @mahjonk
    Kasusnya bisa saja sama dengan yang ini , coba set output typenya.
    Hal ini disebabkan konfigurasi apache server yang berbeda. Lakukan tes dengan file dan server yang berbeda.

    ReplyDelete
  5. Nah, gan... kalau filenya bentuk video semacam flv gimana ya.

    ReplyDelete

Post a Comment

Popular posts from this blog

Java-MySql: Aplikasi Database dengan Data Gambar (Updated)

Untuk update metode simpan gambar lihat di appGambar 2.0 Bagaimana caranya menyimpan data yang membutuhkan penyimpanan data gambar? Misalkan data pegawai yang membutuhkan penyimpanan gambar dari setiap pegawai. Alternatifnya ada dua, dengan kelebihan dan kekurangan masing-masing. Cara yang pertama adalah dengan membuat field dengan tipe data binary, kemudian menyimpan gambar yang dibutuhkan dalam field di database tersebut. Cara ini membutuhkan manajemen program yang lebih rumit, tapi data gambar akan terjamin, karena tersimpan didalam database yang terintegrasi dengan data lainnya. Kekurangan lainnya adalah ukuran database yang akan membesar dan lambat. Bayangkan saja, sebuah field membutuhkan gambar dengan format jpeg, 200kB. Apabila ada 200 juta record, maka ukuran field yang diperuntukan khusus untuk gambar dengan perhitungan kasar adalah 0.2 MB x 200M = 40 x 10^12 = 40 TB. Belum ditambah dengan ukuran data dari field lainnya, kalau misalkan untuk menyimpan data penduduk Indonesia.

PHP: Kalkulator

Pada intinya, kalkulator berbasis web ini menggunakan tiga dasar, yaitu CSS, PHP, dan HTML. CSS (Cascading Style Sheets) agar mudah mengatur tampilan, PHP (PHP Hypertext Prepocessor) untuk operasi perhitungan, dan HTML (Hypertext Markup Language) untuk pembuatan form kalkulator. Kesemuanya dalam bentuk dasar dengan logika perhitungan sederhana untuk melakukan perhitungan. Sedangkan array diatas digunakan untuk debugger dan memahami jalannya algoritma. <html> <head> </head> <body> <style type="text/css"> .Hasil { color: #fcc; background-color: blue; font-size: 4em; border: 1px solid #660; padding: 4px; } .Operator { color: #fcc; background-color: #900; font-size: 1.5em; border: 1px solid #660; width: 100px; padding: 4px; } .Angka { color: white; background-color: #660; font-size: 1.5em; border: 1px solid #660; padding: 4px; width: 100px; } </style> <?php function Hitung($b1,$b2,$o){ switch($o){ case '+': return $b1

Pembuatan PDF di PHP dengan FPDF dan HTML2FPDF

Untuk membuat pdf dengan menggunakan php, kita bisa menggunakan fpdf yang berbasis class. Sedangkan html2fpdf digunakan untuk mengubah html menjadi pdf. Dengan hanya menggunakan fpdf, kita harus menentukan semua hal yang mengatur tampilannya berbasis code sesuai dengan aturan dan fungsi yang disediakan class tersebut. Dengan menggunakan html2fpdf, kita cuma perlu membuat sebuah file html dan tampilannya langsung diubah menjadi sebuah file pdf, tentu dengan beberapa keterbatasan dan perubahan tampilan. Saat ini, fpdf terbaru pada versi 1.6 sedangkan html2fpdf versi 3. Instalasi: + Ekstrak file fpdf dan html2fpdf. Sebenarnya html2fpdf merupakan inheritance dari class fpdf, tapi class di fpdf yang disdertakan di paket html2fpdf telah dimodifikasi dari aslinya sesuai dengan kebutuhan konversi tersebut. Class original dari fpdf akan kita pakai untuk pembuatan pdf secara manual, bukan dari html. + Ganti nama file fpdf.php misalkan menjadi fpdf16.php. Karena untuk bebrapa versi instalasi php