Tutorial MySQL dan SQL Injection

Jika Anda mengambil input pengguna melalui halaman web dan memasukkannya ke dalam database MySQL ada kemungkinan bahwa Anda telah meninggalkan diri Anda terbuka lebar untuk masalah keamanan yang dikenal sebagai SQL Injection. Pelajaran ini akan mengajarkan Anda bagaimana untuk membantu mencegah hal ini terjadi dan membantu Anda mengamankan skrip Anda dan pernyataan MySQL.

Injeksi biasanya terjadi ketika Anda meminta pengguna untuk masukan, seperti nama mereka, dan bukannya nama mereka memberikan pernyataan MySQL bahwa anda tidak sadar akan berjalan pada database Anda.

Jangan pernah percaya disediakan pengguna data, proses data ini hanya setelah validasi; sebagai suatu peraturan, hal ini dilakukan dengan pencocokan pola. Pada contoh di bawah, nama pengguna dibatasi untuk karakter alfanumerik ditambah menggarisbawahi dan panjang antara 8 dan 20 karakter – memodifikasi aturan ini sesuai kebutuhan.

if (preg_match(“/^\w{8,20}$/”, $_GET[‘username’], $matches))
{
$result = mysql_query(“SELECT * FROM users
WHERE username=$matches[0]”);
}
else
{
echo “username not accepted”;
}

Untuk menunjukkan masalah, pertimbangkan kutipan ini:

// supposed input
$name = “Qadir'; DELETE FROM users;”;
mysql_query(“SELECT * FROM users WHERE name='{$name}'”);

Fungsi panggil seharusnya mengambil record dari tabel users dimana kolom nama sesuai dengan nama yang
ditentukan oleh pengguna. Dalam keadaan normal, $ nama hanya akan berisi karakter alfanumerik dan mungkin ruang,
seperti illa string. Tapi di sini, dengan menambahkan query sama sekali baru untuk $ nama, panggilan
ke database berubah menjadi bencana: DELETE query disuntikkan menghapus semua catatan dari pengguna.

Untungnya, jika Anda menggunakan MySQL, mysql_query () fungsi tidak mengizinkan permintaan susun,
atau mengeksekusi beberapa query dalam panggilan fungsi tunggal. Jika Anda mencoba untuk tumpukan pertanyaan,
panggilan gagal.

Namun, ekstensi database lain PHP, seperti SQLite dan PostgreSQL, dengan senang hati melakukan query ditumpuk,
mengeksekusi semua pertanyaan yang diberikan dalam satu string dan menciptakan masalah keamanan serius.

Mencegah SQL Injection:

Anda dapat menangani semua karakter melarikan diri cerdas dalam bahasa scripting seperti PERL dan PHP. Ekstensi MySQL untuk PHP menyediakan fungsi mysql_real_escape_string () untuk melarikan diri karakter input yang khusus untuk MySQL.

if (get_magic_quotes_gpc())
{
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query(“SELECT * FROM users WHERE name='{$name}'”);

Para Quandary SEPERTI:

Untuk mengatasi kebingungan SEPERTI, mekanisme melarikan diri kustom harus mengkonversi pengguna yang disediakan% dan karakter _ untuk literal. Gunakan addcslashes (), fungsi yang memungkinkan anda menentukan berbagai karakter untuk melarikan diri.

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Leave a Reply

Your email address will not be published. Required fields are marked *