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

PHP MySQLI Mencegah Injeksi SQL

Kueri apa pun dapat disuntikkan baik itu baca atau tulis, persisten atau sementara. Suntikan dapat dilakukan dengan mengakhiri satu kueri dan menjalankan kueri terpisah (mungkin dengan mysqli ), yang membuat kueri yang dimaksud menjadi tidak relevan.

Setiap masukan ke kueri dari sumber eksternal apakah itu dari pengguna atau bahkan internal harus dianggap sebagai argumen untuk kueri, dan parameter dalam konteks kueri. Parameter apa pun dalam kueri perlu diparameterisasi. Ini mengarah ke kueri yang diparameterisasi dengan benar sehingga Anda dapat membuat pernyataan yang disiapkan dari dan mengeksekusi dengan argumen. Misalnya:

SELECT col1 FROM t1 WHERE col2 = ?

? adalah tempat untuk parameter. Menggunakan mysqli , Anda dapat membuat pernyataan siap pakai menggunakan prepare , ikat variabel (argumen) ke parameter menggunakan bind_param , dan jalankan kueri dengan execute . Anda tidak perlu membersihkan argumen sama sekali (sebenarnya itu merugikan). mysqli melakukan itu untuk Anda. Proses lengkapnya adalah:

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

Ada juga perbedaan penting antara kueri berparameter dan pernyataan yang disiapkan . Pernyataan ini, sementara disiapkan, tidak diparameterisasi dan dengan demikian rentan terhadap injeksi:

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

Untuk meringkas:

  • Semua Kueri harus diparameterisasi dengan benar (kecuali jika tidak memiliki parameter)
  • Semua argumen untuk kueri harus diperlakukan sebermusuhan mungkin tidak peduli sumbernya



  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 menampilkan gambar dari database menggunakan php

  2. Cara Menemukan Nilai Non-Numerik di Kolom di MySQL

  3. Cara Mengoptimalkan Kinerja MySQL Menggunakan MySQLTuner

  4. #1071 - Kunci yang ditentukan terlalu panjang; panjang kunci maksimal adalah 1000 byte

  5. Cara Menginstal MySQL 8.0 di RHEL/CentOS 8/7 dan Fedora 35