Blog Posts » General » [PHP] Pengamanan Terhadap SQL Injection

[PHP] Pengamanan Terhadap SQL Injection

Apa sih SQL Injection?
SQL Injection adalah teknik penyisipan data ke database (SQL) dengan cara meng-eksploitasi kelemahan (vulnerability) pada suatu aplikasi.

Bagaimana cara melakukan SQL Injection?
Silahkan cari di Google banyak sekali tutorialnya :) Disini saya hanya akan membahas bagaimana cara mengamankan skrip PHP kita dari kemungkinan SQL Injection. Ya meski tidak bisa 100% aman dari SQL Injection tapi tak ada salahnya kita berusaha untuk meminimalisasinya :d

Bagaimana caranya?
SQL Injection biasanya memanfaatkan klausa WHERE pada Query:
[Textarea][RAW][Download]

  1. $id = $_GET['id'];
  2. $query = mysql_query("SELECT user FROM tabel_user WHERE id = '$id'");

Contoh pada URL: http;//blog.anggit.com/blog.php?id={kode injeksi bisa berawal dari sini}
Kalau kita lihat contoh diatas kita bisa memasukkan karakter apa saja (selain angka) pada $id, termasuk single quote yang memungkinkan Si Hacker untuk menyisipkan perintah atau kode injeksi. Maka solusinya kita bisa mengganti
[Textarea][RAW][Download]

  1. $id = $_GET['id'];

Menjadi sebagai berikut:

1. Menambahkan fungsi intval()
[Textarea][RAW][Download]

  1. $id = intval($_GET['id']);

Sangat aman sekali karena semua karakter akan dikembalikan sebagai integer (angka). Tetapi jika menggunakan cara ini maka nilai maksimal integer adalah 2147483647 (pada sistem 32 bit).

2. Menggunakan fungsi mysql_real_escape_string()
[Textarea][RAW][Download]

  1. $id = mysql_real_escape_string($_GET['id']);

Fungsinya hampir sama dengan addslashes() yaitu menambah escape \ (backslash) pada karakter tertentu misal quote atau single quote.

3. Menggunakan Regular Expression
[Textarea][RAW][Download]

  1. $id = $_GET['id'];
  2. $id = preg_replace('#[^0-9]+#', '', $id);

Jika terdapat karakter bukan 0-9 (angka) maka akan dikosongkan.

Masih banyak lagi cara yang bisa dilakukan. Tapi saya sudah capek nulisnya :d Silahkan jika ada yang mau bertanya, mengkoreksi atau menambahkan :)

Tambahan dari komentar mas Rogger. Bisa juga menggunakan fungsi absolut: abs(), dalam hal ini bisa sampai 14 digit di PHP 5.3.x dan hanya 12 digit di PHP 5.2.x.