Maksud
dari judul di atas adalah bagaimana ide membuat aplikasi untuk
keperluan upload dan download file, namun dengan disertai pembatasan hak
akses. Misalkan user A mengupload sebuah file. Nah… file ini hanya
boleh didownload oleh si A. Bila ada user lain yang mencoba mendownload
atau menghapus file tersebut maka tidak diperbolehkan.
Aplikasi
ini juga nantinya disertai semacam autentifikasi artinya tidak
sembarangan orang bisa upload file, melainkan hanya user-user tertentu
saja yang berhak.
Langkah
pertama, kita siapkan terlebih dahulu 2 buah tabel yaitu tabel ‘user’
dan tabel ‘upload’. Tabel ‘user’ digunakan untuk menyimpan data user
yang berhak mengakses, serta tabel ‘upload’ untuk menyimpan file-file
yang diupload oleh user.
CREATE TABLE user (
username varchar(20),
password varchar(32),
PRIMARY KEY (username)
)
CREATE TABLE upload (
id int(11) AUTO_INCREMENT,
name varchar(30),
type varchar(30),
size int(11),
content mediumblob,
username varchar(20),
PRIMARY KEY (id)
)
Pada
tabel ‘upload’, field ID digunakan untuk memberikan nomor ID dari
setiap file supaya unik (pembeda tiap file) karena bisa jadi nama file
yang diupload user adalah sama. Field ‘name’ terkait dengan nama file
yang diupload, ‘type’ terkait dengan jenis file apakah berupa image,
text file atau dokumen dll, ‘size’ menyatakan ukuran file, dan ‘content’
untuk menyimpan isi file (di sini menggunakan blob atau mediumblob).
Nah.. kemudian field ‘username’ digunakan untuk memberikan informasi
kepemilikan dari file, milik user siapakah file tersebut.
Selanjutnya untuk sekedar mencoba, Anda bisa sekalian tambahkan beberapa user
INSERT INTO `user` VALUES ('a', 'pass1');
INSERT INTO `user` VALUES ('b', 'pass2');
Catatan:
dalam contoh ini sengaja saya tidak mengenkripsi password login
masing-masing username supaya Anda bisa mencoba. Namun.. lebih baik jika
Anda gunakan enkripsi.
Langkah kedua, kita siapkan form login untuk user
index.htm
Login User
Username | |
Password | |
Langkah kedua, kita bisa buat script untuk memproses loginnya
login.php
// koneksi ke mysql
mysql_connect('dbhost', 'dbuser', 'dbpass');
mysql_select_db('dbname');
// membaca username dan password dari form login
$username = $_POST['user'];
$password = $_POST['pass'];
// mencari data user yang login tujuannya untuk mendapatkan password dari database
$query = "SELECT * FROM user WHERE username = '$username'";
$hasil = mysql_query($query);
$data = mysql_fetch_array($hasil);
// mencocokkan password user dari database dengan password dari form
if ($password == $data['password'])
{
// jika kedua password sama, maka login berhasil
// simpan username ke dalam session
session_start();
$_SESSION['username'] = $username;
echo "
Login Sukses
";
echo "
Anda login sebagai : ".$username."
";
// tampilkan menu user
}
else
{
// jika kedua password tidak cocok, maka login gagal
echo "
Maaf login gagal
";
}
?>
Perhatikan
script di atas! Terdapat 3 buah menu yang akan tampil begitu user
berhasil login. Menu ‘upload’ untuk melakukan proses upload file,
‘daftar file’ untuk melihat daftar file apa saja yang telah diuploadnya,
dan ‘logout’ untuk proses logout. Nah.. di antara ketiga menu tersebut,
menu ‘upload’ yang diarahkan ke script ‘formupload.php’ dan ‘daftar
file’ yang diarahkan ke script ‘list.php’ ini hendaknya diproteksi
supaya hanya bisa diakses oleh user yang telah terdaftar dalam database
saja. Maksudnya, kedua script tersebut haruslah hanya bisa diakses oleh
user yang telah melakukan login dengan sukses saja. Sehingga untuk
keperluan ini, kita harus mengatur strategi supaya user nakal tidak bisa
mengakses kedua script tersebut tanpa login (by pass)… he.. 3x kayak
mau perang saja pake strategi segala
Nah… untuk mencegah ada penyusup yang masuk tanpa login, kita buat dulu script untuk pengamanannya.
cek.php
session_start();
if (!isset($_SESSION['username']))
{
echo "
Maaf Anda belum login
";
exit;
}
?>
Ide
dari script pengaman di atas adalah dengan mengecek keberadaan session
dengan nama ‘$_SESSION['username']‘. Bila login berhasil, maka session
tersebut ada (perhatikan kembali script login.php). Namun bila user
mencoba masuk tanpa login, maka keberadaan session ini tidak ada.
Sehingga bila session tersebut dideteksi tidak ada, maka ditolak dengan
pesan ‘Maaf Anda belum login’.
Nah… selanjutnya script cek.php di atas diincludekan ke dalam script ‘formupload.php’ dan ‘list.php’.
Langkah berikutnya, kita sudah bisa buat script untuk formupload.php nya
formupload.php
session_start();
include "cek.php";
// membaca nama user yang tersimpan dalam session
$username = $_SESSION['username'];
echo "
Anda login sebagai : ".$username."
";
echo "Silakan upload file
";
";
?>
// form untuk upload
Perhatikan
pada tag . Tag ini digunakan
untuk input file yang akan diupload. Tag ini diberikan nama komponen
‘userfile’. Nama komponen ini selanjutnya akan digunakan dalam script
proses uploadnya.
upload.php
session_start();
// untuk keamanan, kita juga includekan cek.php
include "cek.php";
// membaca nama file
$fileName = $_FILES['userfile']['name'];
// membaca nama file temporary
$tmpName = $_FILES['userfile']['tmp_name'];
// membaca size file
$fileSize = $_FILES['userfile']['size'];
// membaca tipe file
$fileType = $_FILES['userfile']['type'];
// membaca username yang disimpan dalam session
// username ini sekaligus menyatakan informasi pemilik file
$username = $_SESSION['username'];
// langkah membaca isi file yang diupload
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// query SQL untuk menyimpan file ke database disertai username pemiliknya
$query = "INSERT INTO upload (name, size, type, content, username)
VALUES ('$fileName', '$fileSize', '$fileType', '$content', '$username')";
mysql_query($query);
echo "
Anda login sebagai : ".$username."
";
// konfirmasi
echo "File ".$fileName." telah terupload
";
";
?>
Setelah
kita membuat script untuk proses upload, berikutnya kita buat script
list.php untuk menampilkan daftar file yang telah diupload
list.php
session_start();
include "cek.php";
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// membaca username yang disimpan dalam session
$username = $_SESSION['username'];
echo "
Anda login sebagai : ".$username."
";
echo "
Daftar File Anda
";
// query untuk mencari file yang telah diupload milik si user yang sedang login
$query = "SELECT * FROM upload WHERE username = '$username'";
$hasil = mysql_query($query);
// menampilkan nama-nama file yang telah diupload si user yang sedang login
echo "
- ";
while ($data = mysql_fetch_array($hasil))
{
}
echo "";
?>
Pada
daftar file yang tampil, si user dapat mendownload file nya dengan
mengklik nama filenya atau menghapusnya dengan mengklik tanda X yang ada
di sebelah kanan nama file. Untuk proses download, linknya akan
diarahkan ke script ‘download.php’ dan hapus file di arahkan ke
‘delete.php’. Kedua link tersebut ditambahkan parameter ‘?id=…’ yang
digunakan untuk mengidentifikasi file apa yang akan didownload atau
dihapus, mengingat pembeda antar file adalah ID nya.
Bagaimana
script download.php nya? trus bagaimana idenya supaya file tersebut
hanya berhak didownload oleh user yang telah menguploadnya atau yang
berhak? ya… konsepnya kita cari dulu nama username pemilik file yang
akan didownload dalam database. Selanjutnya kita cocokkan username
pemiliknya dengan username yang sedang login. Jika sama atau cocok, maka
bolehlah file tersebut didownload. Jika tidak, maka tolak mentah-mentah
download.php
session_start();
// sisipkan cek.php untuk keamanan
include "cek.php";
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// membaca nilai ID file yang berasal dari link download.php?id=...
$id = $_GET['id'];
// membaca username yang sedang login melalui session
$username = $_SESSION['username'];
// query untuk mencari data file yang akan didownload dalam database
$query = "SELECT * FROM upload WHERE id = $id";
$hasil = mysql_query($query);
$data = mysql_fetch_array($hasil);
// mencocokkan username pemilik file dengan username yang sedang login
if ($username == $data['username'])
{
// bila usernamenya cocok maka file boleh didownload
header("Content-Disposition: attachment; filename=".$data['name']);
header("Content-length: ".$data['size']);
header("Content-type: ".$data['type']);
echo $data['content'];
}
else
{
// bila tidak sama maka file tidak boleh didownload
echo "
Anda tidak berhak mengakses file
";
}
?>
Konsep
yang hampir sama juga kita terapkan dalam delete.php. Artinya bahwa
mekanisme pencocokan username pemilik file dengan username yang sedang
login juga harus dilakukan sebelum file dihapus.
delete.php
session_start();
include "cek.php";
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// membaca id file yang akan dihapus
$id = $_GET['id'];
// membaca username yang sedang login
$username = $_SESSION['username'];
// mencari username pemilik file yang akan dihapus
$query = "SELECT username FROM upload WHERE id = $id";
$hasil = mysql_query($query);
$data = mysql_fetch_array($hasil);
// mencocokkan username pemilik file dengan username yang sedang login
if ($username == $data['username'])
{
// jika cocok maka hapus file
$query = "DELETE FROM upload WHERE id = $id";
mysql_query($query);
echo "
Anda login sebagai : ".$username."
";
echo "File telah dihapus
";
";
}
else
{
// jika tidak cocok maka tolak
echo "
Maaf Anda tidak berhak menghapus file ini
";
}
?>
Yang
terakhir, jangan lupa buat script logout.php untuk proses logoutnya.
Konsep logout adalah dengan menghapus session yang digunakan untuk
menyimpan username yang login.
logout.php
session_start();
// menghapus session
session_destroy();
echo "
Anda sudah logout
";
?>
Perhatian:
Script
di atas sudah melalui tahap pengujian dan dipastikan 100% dapat
berjalan dengan normal. Bila Anda mencoba dan mengalami kesalahan atau
berjalan tidak normal maka dipastikan kesalahan ada pada Anda. Coba cek
kembali script yang Anda buat.