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

Serangan injeksi yang berhasil dengan mysql_query, tetapi gagal dengan mysqli_query

Saya telah dituntun untuk percaya bahwa:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

dapat dengan mudah dikompromikan dengan nilai untuk $idValue yang menutup ' lalu tambahkan perintah tambahan, seperti

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Sementara saya menyadari Anda menyatakan bahwa beberapa pernyataan dinonaktifkan, sesuatu yang tidak mengerikan adalah mengembalikan data yang tidak sah daripada mengedit data dalam tabel secara langsung, seperti:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Sedangkan dengan MySQLi ada kemungkinan bahwa pendekatan tersebut dapat digunakan dengan prepared statements , yang akan mencegah variabel bertindak di luar statusnya hanya sebagai variabel. Seperti:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Pemahaman saya tentang bind_param adalah variabel tersebut akan membuat semua kata kunci dan karakter kunci MySQL lolos sehingga mencegah pelanggaran keamanan dan kembalinya baris yang tidak sah.

Ini adalah pilihan yang tidak dimiliki oleh MySQL . Pernyataan yang disiapkan membantu meningkatkan keamanan injeksi tetapi tidak akan mencegah serangan injeksi saja, tetapi lebih banyak yang harus digunakan sebagai bagian dari strategi yang lebih luas oleh programmer.

Sama seperti mengenakan pelindung tubuh tidak akan membuat Anda tak terkalahkan, tetapi itu akan sangat meningkatkan peluang Anda untuk bertahan hidup. MySQLi bukan peluru ajaib, dan juga bukan PDO, tetapi mereka akan meningkatkan tingkat keamanan secara keseluruhan.

MySQL juga ditinggalkan dan seperti yang dinyatakan oleh Christopher, tidak lagi dipertahankan berarti jumlah lubang dan masalah dengannya hanya akan meningkat seiring dengan berkembangnya teknologi lain.

Ringkasan

Jika Anda menulis MySQLi pernyataan dengan cara yang sama seperti Anda menulis pernyataan MySQL, maka Anda tidak akan memiliki perlindungan tambahan dari suntikan. Namun, MySQLi menawarkan Pernyataan yang Disiapkan pendekatan yang secara signifikan meningkatkan pertahanan terhadap injeksi SQL, tetapi perubahan antarmuka basis data yang mendasari itu sendiri tidak memberi Anda manfaat atau perlindungan yang melekat kecuali jika Anda memilih untuk mengkodekannya sendiri menggunakan pernyataan yang disiapkan .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih Kueri | Pilih Seluruhnya Yang Tidak Dimulai Dengan Angka - MySQL

  2. Cara Instal MySQL dengan phpMyAdmin di Debian 7

  3. 1045, Akses ditolak untuk 'username'@'NOT-local' pengguna (menggunakan kata sandi:YA)

  4. html/php/sql formulir dengan sisipan/perbarui

  5. Desain Basis Data - Model Push, atau Fan-out-on-write