Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah mysqli_real_escape_string cukup untuk menghindari injeksi SQL atau serangan SQL lainnya?

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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Melakukan UPSERT sehingga saya dapat menggunakan nilai baru dan lama di bagian pembaruan

  2. Cara Membatasi Baris dalam Kumpulan Hasil MySQL

  3. Kesalahan fatal:Panggilan ke fungsi anggota bind_param() di boolean

  4. MySQL - Menggunakan COUNT(*) dalam klausa WHERE

  5. MySQL menunjukkan status - koneksi aktif atau total?