Opsi character_set_client
adalah apa yang digunakan MySQL untuk kumpulan karakter kueri dan data yang dikirim klien.
Standarnya adalah utf8 di MySQL 5.5, 5.6, dan 5.7, dan utf8mb4 di 8.0.
Itu juga dapat diubah secara global di file opsi my.cnf Anda, atau per sesi dengan SETEL NAMA pernyataan.
Sebaiknya atur opsi secara eksplisit saat Anda terhubung, jadi Anda tidak perlu menganggap nilai defaultnya.
Kembali komentar Anda:
Saya khawatir Anda membingungkan dua kasus injeksi SQL yang berbeda. Ada risiko saat menggunakan lima set karakter tertentu, tetapi tidak terkait dengan injeksi SQL orde kedua.
Risiko set karakter disebabkan oleh beberapa set karakter multi-byte. Biasanya menyisipkan garis miring terbalik untuk menghindari karakter kutipan literal. Tetapi dalam beberapa set karakter, byte garis miring terbalik digabungkan ke dalam byte sebelumnya, membentuk karakter multi-byte. Itu membuat kutipan tidak bisa dihindari.
Injeksi SQL orde kedua benar-benar berbeda. Itu dapat terjadi dengan set karakter apa pun. Ini adalah saat penyerang menambahkan data ke database Anda melalui cara yang sah, seperti mengisi formulir. Memasukkan data ditangani tanpa kesalahan. Tetapi nilai yang mereka masukkan berisi sintaks yang dirancang untuk mengeksploitasi beberapa kueri SQL selanjutnya.
Itu bergantung pada pengembang yang percaya bahwa data yang telah disimpan dengan aman ke database mereka entah bagaimana "aman" untuk digunakan tanpa parameterisasi yang tepat.
Contoh injeksi SQL orde kedua yang hanya tidak disengaja dan bukan berbahaya dapat berupa seseorang memiliki nama belakang "O'Reilly", dan nama tersebut dibaca oleh kode dan digunakan dalam kueri berikutnya.
$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";
Jika nama berisi apostrof literal, itu akan mengacaukan kueri kedua dalam contoh itu.