Bisakah seseorang memberi tahu saya apakah itu aman atau rentan terhadap serangan SQL Injection atau serangan SQL lainnya?
Tidak. Seperti yang dikatakan uri2x, lihat Injeksi SQL yang mengatasi mysql_real_escape_string()
.
Cara terbaik untuk mencegah injeksi SQL adalah dengan menggunakan pernyataan yang disiapkan. Mereka memisahkan data (parameter Anda) dari instruksi (string kueri SQL) dan tidak meninggalkan ruang bagi data untuk mengotori struktur kueri Anda. Pernyataan yang disiapkan memecahkan salah satu masalah mendasar keamanan aplikasi .
Untuk situasi di mana Anda tidak dapat menggunakan pernyataan yang disiapkan (mis. LIMIT
), menggunakan daftar putih yang sangat ketat untuk setiap tujuan tertentu adalah satu-satunya cara untuk menjamin keamanan.
// This is a string literal whitelist
switch ($sortby) {
case 'column_b':
case 'col_c':
// If it literally matches here, it's safe to use
break;
default:
$sortby = 'rowid';
}
// Only numeric characters will pass through this part of the code thanks to type casting
$start = (int) $start;
$howmany = (int) $howmany;
if ($start < 0) {
$start = 0;
}
if ($howmany < 1) {
$howmany = 1;
}
// The actual query execution
$stmt = $db->prepare(
"SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}"
);
$stmt->execute(['value']);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
Saya berpendapat bahwa kode di atas kebal terhadap injeksi SQL, bahkan dalam kasus tepi yang tidak jelas. Jika Anda menggunakan MySQL, pastikan Anda menonaktifkan persiapan yang diemulasi.
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);