Antisipasi SQL Injection

Data adalah hal yang sangat berharga, karena data mengandung informasi yang mungkin didalamnya terdapat informasi rahasia yang orang lain tidak diperkenankan untuk tahu. Bagaimana jika data tersebut dapat diakses oleh orang yang tidak semestinya? Itu akan merugikan sekali. Salah satu celah yang dapat digunakan untuk melakukan itu adalah SQL injection.

Penjelasan mudahnya, SQL injection itu adalah memasukkan input berupa query yang dapat dimengerti oleh SQL, sehingga hal-hal yang tidak diinginkan terjadi. Kenapa hal itu bisa terjadi? Lihat contoh dibawah:

function login($email, $password){
	$db = new connect();
	$query = mysql_query("SELECT * FROM user WHERE email = '$email'");
	if(mysql_num_rows($query)>0){
		$query = mysql_query("SELECT * FROM user WHERE email = '$email' AND password = '$password'");
		if(mysql_num_rows($query)>0){
			$row = mysql_fetch_array($query);
			$response["id"] = $row["id"];
			$response["email"] = $row["email"];
			$response["full_name"] = $row["full_name"];
			$response["kode"] = 2;
			$response["pesan"] = "Login berhasil";
			echo json_encode($response);
		}else{
			$response["kode"] = 1;
			$response["pesan"] = "Password tidak cocok";
			echo json_encode($response);
		}
	}else{
		$response["kode"] = 1;
		$response["pesan"] = "Email tidak ditemukan";
		echo json_encode($response);
	}
}

Contoh diatas adalah sebuah fungsi login, dengan masukkan email dan password. Kita ambil query untuk cek emailnya:

$query = mysql_query("SELECT * FROM user WHERE email = '$email'");

Query tersebut menerima masukkan berupa email. Kalau user memang benar-benar memasukkan email, maka program akan berjalan semestinya. Tapi bagaimana jika user memanipulasi input, yang seharusnya email, tetapi diberi tambahan berupa syntax query.

Contoh masukkan seperti berikut:

';DROP TABLE user;--'

Query diatas, akan menghilangkan table bernama user. Sangat berbahaya bukan? Oleh karena itu, kita perlu mengantisipasinya. Salah satu caranya dengan menggunakan PDO. Definisinya bisa dilihat disini Introduction PDO.

 

Dalam tutorial kali ini, saya akan memberikan beberapa contoh penggunaan PDO untuk CRUD dan juga cara connect database.

1. Connect database

define('DB_USER',"root");
define('DB_PASSWORD',"");
define('DB_SERVER',"127.0.0.1");
define('DB_DATABASE',"andevindo");

$db = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_DATABASE,DB_USER,DB_PASSWORD);

Diatas adalah contoh connect database menggunakan PDO. Saya buat konstanta terlebih dahulu, agar enak untuk diliat dan mudah untuk dimaintenance kedepan. Jika projek sudah besar, taruh konstanta tersebut dilain file, config.php misalnya. Variable $db diatas, akan terus digunakan ketika melakukan query.

2. Insert

$username = "andevindo";
$email = "admin@andevindo.com";
$password = "andevindo";
$query = $db->prepare("INSERT INTO user (username, email, password)
		VALUES (:username, :email, :password)");
$check = $query->execute([
	'username'=>$username,
	'email'=>$email,
	'password'=>$password,
	]);

Contoh diatas adalah contoh penggunaan PDO untuk insert. Terdapat prepare dan execute. Prepare digunakan untuk mempersiapkan syntax query yang akan dieksekusi. Nilai yang diinputkan dalam VALUES, tidak langsung berupa variable yang ingin diinputkan, namun seperti membuat variabel lagi, dengan tambahan “:” untuk menandakan bahwa variabel ini dapat diisi ketika execute. Setelah itu, syntax query yang telah dibuat, di-execute. Variabel yang telah dibuat di-prepare tadi, diberi nilai waktu execute. Misal variabel yang telah disiapkan bernama :username, maka di-execute dituliskan ‘username’ lalu diikuti dengan input, contoh kasus diatas misalnya $username sebagai inputnya.

Untuk mengecek apakah inputan berhasil atau tidak, cukup mudah,

if($check){
//success
}else{
//failed
}

3. SELECT

$id = 1;
$query = $db->prepare("SELECT * FROM user WHERE id=:id");
$query->execute([
	'id'=>$id,
	]);

Untuk select penjelasannya sama dengan insert. Untuk mengecek, apakah query berjalan, dapat dilakukan seperti berikut:

if($query->rowCount()){
//Hasil query tidak sama dengan null
}else{
//Tidak ada data yang diperoleh
}

Lalu untuk mengambil data yang diperoleh, dapat dilakukan seperti berikut:

if ($query->rowCount()) {
	$response["users"] = array();
	while ($row = $query->fetch()) {
		$list["id"] = $row["id"];
		$list["username"] = $row["username"];
		array_push($response["users"], $list);
	}
		
	$response["kode"] = 2;
	response["pesan"] = "Sukses";
	echo json_encode($response);
}else{
	$response["kode"] = 1;
	$response["pesan"] = "No event has been added";
	echo json_encode($response);
}

$row[“id”], id sebagai nama column didatabase, lalu $list[“id”], id sebagai nama yang ingin dimunculkan di JSON. Hasil output diatas adalah berupa JSON.

4. UPDATE

$username = "heendher";
$id = 5;
$query = $db->prepare("UPDATE user SET username=:username WHERE id=:id");
$check = $query->execute([
'username'=>$username,
'id'=>$id,
]);

Untuk mengecek apakah berhasil atau tidak, langkahnya sama dengan insert.

5. DELETE

$id = 5;
$query = $db->prepare("DELETE FROM user WHERE id=:id");
$check = $query->execute([
'id'=>$id,
]);

Untuk mengecek apakah berhasil atau tidak, langkahnya sama dengan insert dan update.

Itu saja mungkin yang dapat saya share untuk tutorial kali ini, jika ada pertanyaan monggo langsung comment aja dibawah.