![]() |
Patch SQL Injection |
Sebagian besar aplikasi dan situs web modern menggunakan bentuk konten yang dinamis. Konten tersebut bisa dalam bentuk artikel, buku tamu, gallery, detail produk, halaman login, dll. Dengan demikian dalam scriptingnya pasti melibatkan database sebagai penyimpan data konten dinamis tadi.
Contoh script yang vuln terhadap SQLi:
<?php
// (nama host, username mysql, password, nama table)
$conn = mysqli_connect("localhost","root","","sqli");
if ($conn->connect_errno) {
echo die("Failed to connect to MySQL: " . $conn->connect_error);
}
$id = $_GET['id'];
$stmt = mysqli_query($conn, "SELECT * FROM user where id ='$id' ");
while($row = mysqli_fetch_array($stmt)){
?>
Pada source code diatas jelas terlihat tidak adanya filtering terhadap karakter seperti ('), ("), (-) sehingga bisa disisipi dengan perintah SQLi. Lalu bagaimana cara menutup bug tersebut? Mudah saja, kali ini saya akan memberi beberapa cara untuk patch bug SQLi tersebut.Menggunakan fungsi is_numeric()
if(!is_numeric($id)) {
echo "Patched.";
exit;
}
Keterangan: jika nilai $id bukan merupakan angka (numeric) maka akan tampil "Patched."Menggunakan fungsi mysqli_real_escape_string().
$id = mysqli_real_escape_string($conn,$_GET['$id']);
Fungsi tersebut berguna untuk memberi backslash di beberapa script yang akan ditampilkan di halaman, namun saat menyimpan menuju database, kode akan tetap normal tanpa ada backslash.Patch SQLi dengan Prepared Statement
<?php
// (nama host, username mysql, password, nama table)
$conn = mysqli_connect("localhost","root","","sqli");
if ($conn->connect_errno) {
echo die("Failed to connect to MySQL: " . $conn->connect_error);
}
// Prepare
$stmt = $conn->prepare("SELECT * FROM user where id = ? ")
// Bind
$stmt->bind_param("s", $_GET['id']);
// Execute
$stmt->execute();
$hasil = $stmt->get_result();
while($row = mysqli_fetch_array($hasil)){
?>
Proses pembuatan prepared statements membutuhkan 3 langkah yaitu Prepared, Bind, dan Execute. Pada proses prepared, kita mempersiapkan query yang akan dijalankan, tetapi tanpa mengisi 'data'. Bagian dimana 'data' berada digantikan dengan tanda tanya (?) sebagai tanda bahwa bagian ini akan diisi dengan variable data.Proses selanjutnya adalah BIND, merupakan proses kedua setelah query dilakukan, dimana nantinya akan ada sebuah proses pengiriman data yang sebelumnya telah di tandai dalam sebuah proses prepare pada query yang menggunakan tanda (?). Hal yang harus diperhatikan adalah data type yang kita kirim sebagai variable, sebagai contoh diatas saya isi dengan (s) yang berarti tipe data berupa string, (i) untuk integer, (d) untuk double, dan (b) untuk boolean.
Langkah berikutnya adalah mengeksekusi prepared query yang telah kita buat.
Dan cara yang sangat saya rekomendasikan untuk patch bug sqli adalah cara ketiga yaitu dengan menggunakan Prepared Statement. Sekian pembahasan tentang mencegah bug sqli kali ini. Terimakasih
Share This :
comment 3 komentar
more_vertHy bang,thanks info nya:)
11 September 2020 10.24ok
9 Oktober 2020 08.44Good
18 November 2020 11.17