Pertanyaan PHP MySQLI Mencegah SQL Injection [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya telah membuat situs web yang akan segera ditayangkan dan hanya memiliki beberapa pertanyaan tentang mencegah injeksi SQL, saya mengerti cara menggunakannya mysqli_real_escape_string tapi saya hanya ingin tahu apakah saya harus menggunakan itu pada semua variabel yang saya peroleh untuk pernyataan SQL saya dan apakah saya harus menggunakannya ketika saya melakukan pernyataan pilih juga atau hanya pada sisipkan pembaruan dan hapus? Juga apa keamanan lain yang akan Anda rekomendasikan untuk saya terapkan sebelum saya menempatkan situs ini secara langsung, terima kasih sebelumnya atas bantuan apa pun!


32
2018-04-29 15:08


asal


Jawaban:


Setiap kueri dapat disuntikkan apakah itu membaca atau menulis, persisten atau sementara. Suntikan dapat dilakukan dengan mengakhiri satu permintaan dan menjalankan satu permintaan terpisah (mungkin dengan mysqli), yang menjadikan kueri yang dimaksudkan 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 diberi parameter. Ini mengarah ke kueri dengan parameter yang tepat yang dapat Anda buat pernyataan siap dari dan jalankan dengan argumen. Sebagai contoh:

SELECT col1 FROM t1 WHERE col2 = ?

? adalah placeholder untuk parameter. Menggunakan mysqli, Anda dapat membuat pernyataan siap pakai prepare, ikat variabel (argumen) ke parameter menggunakan bind_param, dan jalankan kueri dengan execute. Anda tidak perlu membersihkan argumen sama sekali (sebenarnya itu merugikan untuk melakukannya). mysqli melakukan itu untukmu. 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 permintaan parameter dan pernyataan siap. Pernyataan ini, ketika disiapkan, tidak diparameterisasi dan rentan terhadap injeksi:

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

Untuk meringkas:

  • Semua

38
2018-04-29 15:16



Ini akan ditutup dalam hitungan detik, tetapi hanya untuk membuat semuanya menjadi lurus

Saya mengerti cara menggunakan mysqli_real_escape_string

Saya takut anda tidak.

jika saya harus menggunakan itu pada semua variabel yang saya dapatkan untuk pernyataan SQL saya

tentu saja tidak.
fungsi ini harus digunakan untuk memformat string SQL hanya

apakah saya harus menggunakannya ketika saya sedang melakukan pernyataan pilih juga atau hanya pada sisipkan pembaruan dan hapus?

APA SAJA Pernyataan SQL. Tetapi sekali lagi, bukan "menggunakan mysqli_real_escape_string" tetapi memformat literal Anda sepenuhnya dan dengan benar

Juga keamanan apa yang akan Anda rekomendasikan

tentang keamanan SQL - Anda harus benar memformat tidak hanya string tetapi literal apa saja jenis. Dan masing-masing membutuhkan serangkaian aturan pemformatan yang berbeda


3
2018-04-29 15:09