Jawaban yang buruk:
Tidak andal. Anda mengacu pada mysql_escape_string()
, yang tidak memperhitungkan penyandian koneksi (sementara mysql_real_escape_string()
tidak).
Jadi mungkin string yang dibuat dengan hati-hati, dengan codepoint UTF8 tidak lengkap yang dibuat dengan hati-hati di depan, mungkin menghasilkan, katakanlah, tanda kutipan diloloskan oleh mysql_escape_string()
tetapi pelarian itu sendiri diabaikan oleh MySQL karena akan "melihatnya" sebagai karakter UTF8.
Mis.:
0xC2' OR 1=1 ;--
akan diloloskan oleh mysql_escape_string()
sebagai
0xC2\' OR 1=1 ;--
yang akan dirakit menjadi
WHERE password='0xC2\' OR 1=1 ;--';
dan dilihat oleh MySQL (jika penyandian koneksi yang benar berlaku) sebagai, katakanlah,
WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
yang akan menjadi injeksi SQL klasik.
Tapi ini memainkan fakta bahwa Anda menentukan, mungkin melalui gangguan, fungsi yang tidak digunakan lagi . Jika Anda benar-benar mengacu pada mysql_real_escape_string()
, maka itu tidak akan berhasil.
Juga, ini mengasumsikan bahwa baik server, maupun lapisan aplikasi (misalnya PHP) tidak menggunakan validasi charset apa pun saat mengisi input. Jika ya, UTF8 yang tidak valid akan dihapus pada saat kedatangan, dan bahkan tidak pernah terlihat oleh mysql_escape_string
, yang tentu saja sudah cukup.
Jawaban sebenarnya:
Jangan gunakan mysql_escape_string
(atau mysql_whatever
) sama sekali. Mereka sudah usang dan kode Anda mungkin berhenti bekerja. Gunakan fungsi PDO sebagai gantinya.