Untuk menghindari serangan SQL Injection, Anda harus menggunakan Prepared Statements atau Parameterized Queries dalam kode Anda. Berikut ini adalah contoh script PHP yang menggunakan Prepared Statements:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Membuat koneksi ke database $conn = new mysqli($servername, $username, $password, $dbname); // Memeriksa koneksi if ($conn->connect_error) { die("Koneksi gagal: " . $conn->connect_error); } // Menyiapkan pernyataan SQL dengan parameter $stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); // Mengikat parameter ke pernyataan SQL $stmt->bind_param("ss", $username, $password); // Menetapkan nilai parameter $username = $_POST['username']; $password = $_POST['password']; // Menjalankan pernyataan SQL $stmt->execute(); // Mengambil hasil dari pernyataan SQL $result = $stmt->get_result(); // Menampilkan hasil while ($row = $result->fetch_assoc()) { echo "username: " . $row["username"] . " - password: " . $row["password"] . "<br>"; } // Menutup koneksi $conn->close(); ?>
Perhatikan bahwa dalam script di atas, kita menggunakan fungsi prepare()
untuk menyiapkan pernyataan SQL dengan parameter. Kemudian, kita menggunakan fungsi bind_param()
untuk mengikat parameter ke pernyataan SQL. Kemudian, kita menetapkan nilai parameter dari input pengguna dan menjalankan pernyataan SQL menggunakan fungsi execute()
. Selain itu, kita juga menggunakan fungsi get_result()
untuk mengambil hasil dari pernyataan SQL.
Dengan menggunakan Prepared Statements atau Parameterized Queries, Anda dapat memastikan bahwa input pengguna tidak dapat digunakan untuk melakukan serangan SQL Injection.
SQL Injection adalah teknik serangan pada aplikasi web yang memanipulasi input pengguna untuk menyisipkan kode SQL yang berbahaya ke dalam query SQL. Serangan ini biasanya dilakukan dengan mengirimkan input yang tidak diizinkan ke dalam form atau parameter URL pada aplikasi web. Ketika aplikasi web tidak memvalidasi input dengan benar, input yang tidak sah ini dapat mengubah perilaku query SQL yang dieksekusi pada database.
Contoh serangan SQL Injection:
Misalnya, Anda memiliki sebuah form login pada aplikasi web Anda yang mengizinkan pengguna untuk memasukkan username dan password mereka. Jika aplikasi web Anda tidak melakukan validasi input dengan benar, seorang penyerang dapat memasukkan input yang tidak valid, seperti username = ' OR 1=1 --
dan password = '
. Input yang tidak valid ini akan mengubah query SQL yang digunakan untuk memeriksa apakah username dan password yang dimasukkan oleh pengguna sesuai dengan data di dalam database. Akibatnya, query SQL tersebut akan menjadi seperti berikut:
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = ''
Karena 1=1 selalu benar, maka query SQL di atas akan mengembalikan semua data pada tabel users
, sehingga pengguna dengan input yang tidak valid tersebut akan diizinkan untuk masuk ke dalam aplikasi web Anda.
Untuk menghindari serangan SQL Injection, Anda harus menggunakan Prepared Statements atau Parameterized Queries dalam kode Anda. Prepared Statements adalah fitur pada bahasa pemrograman yang memungkinkan Anda untuk menyiapkan query SQL dengan parameter, dan kemudian mengikat nilai parameter ke query SQL sebelum dieksekusi. Dengan menggunakan Prepared Statements, nilai input pengguna tidak pernah disatukan dengan query SQL, sehingga tidak ada cara bagi penyerang untuk menyisipkan kode SQL yang berbahaya ke dalam query SQL.
Berikut ini adalah contoh kodenya dalam PHP:
<?php // Membuat koneksi ke database $conn = new mysqli("localhost", "username", "password", "database"); // Menyiapkan query SQL dengan parameter $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); // Mengikat parameter ke query SQL $stmt->bind_param("ss", $username, $password); // Menetapkan nilai parameter dari input pengguna $username = $_POST['username']; $password = $_POST['password']; // Menjalankan query SQL $stmt->execute(); // Mengambil hasil dari query SQL $result = $stmt->get_result(); // Menampilkan hasil while ($row = $result->fetch_assoc()) { echo "username: " . $row["username"] . " - password: " . $row["password"] . "<br>"; } // Menutup koneksi ke database $conn->close(); ?>
Perhatikan bahwa dalam kode di atas, kita menggunakan prepare()
untuk menyiapkan query SQL dengan parameter. Kemudian, kita menggunakan bind_param()
untuk mengikat nilai parameter dari input pengguna ke query SQL. Dengan menggunakan bind_param()
, kita memberi tahu PHP bahwa nilai input pengguna harus dianggap sebagai nilai parameter dalam query SQL. Dengan cara ini, nilai input pengguna tidak pernah disatukan dengan query SQL secara langsung, sehingga tidak dapat di inject
Pada $stmt->bind_param(“ss”, $username, $password); ada parameter “ss”. ss
adalah parameter pada method bind_param()
yang menunjukkan tipe data dari setiap parameter yang diikat ke query SQL.
Pada contoh kode di atas, parameter pertama "s"
menunjukkan bahwa nilai parameter pertama yang diikat ke query SQL adalah string (s
adalah singkatan dari string), dan parameter kedua "s"
juga menunjukkan bahwa nilai parameter kedua juga adalah string.
Anda harus menyesuaikan parameter pada method bind_param()
dengan tipe data parameter pada query SQL yang disiapkan menggunakan method prepare()
. Misalnya, jika Anda memiliki sebuah query SQL seperti ini:
SELECT * FROM users WHERE age > ?
Anda harus menggunakan parameter "i"
untuk nilai integer dan parameter "d"
untuk nilai double. Sehingga, kode untuk mengikat nilai parameter menjadi seperti ini:
$stmt->bind_param(“i”, $age);
Pada contoh kode di atas, parameter "i"
menunjukkan bahwa nilai parameter age
yang diikat ke query SQL adalah integer. Jika nilai parameter age
berupa string atau nilai yang tidak valid, maka method bind_param()
akan menghasilkan error. Semoga membantu.