Advertisement

Mencegah SQL Injection di PHP

 

 Halo, programmer tangguh! Kamu tahu nggak, SQL Injection itu kayak mengundang tamu tak diundang ke pesta database kamu. Mereka datang tanpa permisi, makan semua makanan (baca: data), dan sebelum pergi, mereka mungkin bakal ngerusak dekorasi (alias sistem kamu). No, thank you!

Tapi tenang aja, hari ini kita bakal bahas gimana caranya mencegah tamu-tamu jahat ini masuk ke pesta database kamu.

1. Apa Itu SQL Injection? 🤔

SQL Injection adalah trik nakal yang digunakan hacker untuk menyisipkan kode SQL berbahaya ke dalam input aplikasi kamu.
Misalnya:
Kamu punya form login, dan seseorang yang niat jahat mengisi kolom username dengan:

' OR '1'='1'; --  

Hasilnya, kode SQL di belakang layar bisa jadi kayak gini:

SELECT * FROM users WHERE username = '' OR '1'='1'; --' AND password = 'password';  

Artinya, mereka berhasil bypass login tanpa tahu password sama sekali. BOOM, mereka masuk ke sistem kamu!

2. Tanda-Tanda Kamu Jadi Korban SQL Injection

  1. Data hilang atau berubah secara misterius.
  2. Login tanpa password mendadak bisa.
  3. Database penuh dengan entri aneh yang kamu nggak pernah buat.
  4. Kamu mendadak lebih sering mengeluh, "Kok begini sih?! ".

Kalau itu semua terjadi, fix deh, kamu kena serangan SQL Injection. Tapi jangan khawatir, kamu masih bisa melawan!

3. Cara Ampuh Mencegah SQL Injection

a. Gunakan Prepared Statements

Ini adalah jurus pamungkas yang bikin hacker nangis. Dengan prepared statements, kamu memisahkan kode SQL dan data, jadi hacker nggak bisa menyisipkan kode jahat.

Contoh menggunakan PDO:

// Koneksi database (jangan lupa ganti detailnya!)
$dbh = new PDO('mysql:host=localhost;dbname=pesta_db', 'root', '');

// Data dari form
$username = $_POST['username'];
$password = $_POST['password'];

// Gunakan Prepared Statements
$stmt = $dbh->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();

if ($stmt->rowCount() > 0) {
    echo "Selamat datang, $username!";
} else {
    echo "Username atau password salah!";
}

Kenapa Ini Ampuh?

  • Data user kayak $_POST['username'] dianggap sebagai data mentah dan nggak dieksekusi sebagai bagian dari SQL.
  • Hacker bakal kesal karena trik mereka nggak mempan.

b. Validasi dan Sanitasi Input

Sebelum data user masuk ke query, pastikan datanya valid dan bersih. Misalnya:

$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
$password = filter_var($_POST['password'], FILTER_SANITIZE_STRING);

Tapi ingat, sanitasi bukan pengganti prepared statements. Ini hanya lapisan keamanan tambahan!

c. Jangan Pernah Concatenate Data User ke Query

Kode ini SANGAT BERBAHAYA:

$query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'";

Kalau ada hacker yang masukin ' OR '1'='1, query kamu bakal dieksploitasi. HINDARI!

d. Gunakan Hak Akses Database yang Minim

Database user kamu nggak perlu jadi superadmin. Beri hak akses secukupnya, kayak hanya bisa SELECT, INSERT, atau UPDATE, tergantung kebutuhan. Kalau ada yang mau DROP TABLE, biarkan itu jadi tugas kamu aja.

4. Contoh Penerapan Anti-SQL Injection Sederhana

Misalnya kamu punya form login:

<form method="POST" action="login.php">
    <label for="username">Username:</label>
    <input type="text" id="username" name="username">
    <label for="password">Password:</label>
    <input type="password" id="password" name="password">
    <button type="submit">Login</button>
</form>

Berikut cara aman di login.php:

<?php
// Koneksi database
$dbh = new PDO('mysql:host=localhost;dbname=pesta_db', 'root', '');

// Validasi input (opsional)
$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
$password = filter_var($_POST['password'], FILTER_SANITIZE_STRING);

// Prepared Statements
$stmt = $dbh->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();

// Cek hasil query
if ($stmt->rowCount() > 0) {
    echo "Login berhasil! Selamat datang, $username!";
} else {
    echo "Username atau password salah!";
}
?>


5. Kesimpulan: 

SQL Injection itu kayak maling yang mencoba masuk ke rumah kamu. Tapi dengan prepared statements, validasi input, dan hak akses minimal, kamu bisa bikin rumah (database) kamu jadi benteng kokoh yang nggak bisa ditembus.

Ingat:

  • Prepared Statements = Pagar besi yang kokoh.
  • Validasi Input = Cek kartu identitas tamu.
  • Sanitasi Input = Cuci tangan sebelum masuk pesta.
  • Hak Akses Minimal = Nggak semua orang boleh ke ruang rahasia.

Selamat coding

 

Post a Comment

0 Comments