Rumah >pembangunan bahagian belakang >tutorial php >Adakah `mysql_real_escape_string()` benar-benar selamat terhadap suntikan SQL, atau adakah terdapat kelemahan halus?

Adakah `mysql_real_escape_string()` benar-benar selamat terhadap suntikan SQL, atau adakah terdapat kelemahan halus?

Susan Sarandon
Susan Sarandonasal
2025-01-03 10:30:39998semak imbas

Is `mysql_real_escape_string()` truly secure against SQL injection, or are there subtle vulnerabilities?

Adakah mysql_real_escape_string() Sempurna?

Walaupun biasanya digunakan untuk melindungi daripada serangan suntikan SQL, mysql_real_escape_string() boleh dielakkan, walaupun dalam kes yang jarang berlaku dan rumit. >

Yang Cerdik Serangan

Dengan muatan yang direka dengan teliti dalam set aksara yang sangat khusus, mysql_real_escape_string() boleh dieksploitasi. Berikut ialah pecahan:

  1. Pemilihan Set Aksara: Set aksara sambungan pelayan mesti ditetapkan kepada yang menyokong kedua-dua garis miring ke belakang ASCII ('') dan aksara yang bait terakhirnya ialah ASCII '. Sebagai contoh, 'gbk' memenuhi kriteria ini.
  2. Muat bayar: Apayload yang terdiri daripada jujukan bait '0xbf27' dipilih. Dalam 'gbk', ia adalah aksara tidak sah, manakala dalam 'latin1', ia mewakili '¿''.
  3. mysql_real_escape_string(): Pelaksanaan MySQL bagi fungsi ini mengenali set aksara sambungan ( dalam kes ini, 'gbk') dan terpakai melarikan diri mengikut peraturannya. Walau bagaimanapun, pelanggan masih percaya sambungan menggunakan 'latin1'. Oleh itu, apabila ia melarikan diri daripada jujukan bait dengan 'mysql_real_escape_string()', ia memasukkan garisan ke belakang.
  4. Pertanyaan: Rentetan terhasil mengandungi aksara ' gantung bebas: '縗' ATAU 1=1 /*' dalam 'gbk'. Ini ialah muatan berniat jahat yang diperlukan untuk serangan itu.

Kerentanan yang Menyilaukan

  1. Pernyataan Ditiru PDO:PDO, secara lalai, meniru kenyataan yang disediakan menggunakan mysql_real_escape_string(), menjadikannya terdedah kepada ini serangan.
  2. mysql_real_escape_string() Bug: Sebelum MySQL 4.1.20 dan 5.0.22, mysql_real_escape_string() mempunyai pepijat yang menganggap aksara multibait tidak sah sebagai bait tunggal, walaupun pelanggan adalah dimaklumkan tentang pengekodan sambungan yang betul, membenarkan serangan ini berjaya.
  3. Perlindungan Terhad PDO: Parameter set aksara DSN PDO, yang diperkenalkan dalam PHP ≥ 5.3.6, tidak disokong secara konsisten untuk semua arahan. Ini memberi ruang untuk kebolehgunaan.

Menghilangkan Bayang-bayang

  1. Set Watak Selamat: Menggunakan set watak kebal seperti 'utf8' atau 'utf8mb4' mengurangkan ini serangan.
  2. NO_BACKSLASH_ESCAPES Mod SQL: Mendayakan mod ini mengubah cara mysql_real_escape_string() berfungsi, menghalang penciptaan aksara yang sah dalam pengekodan terdedah.
  3. Modern MySQL Versions dan Penyata Disediakan: Versi MySQL 5.1 (lewat), 5.5 dan lebih tinggi, bersama-sama dengan kenyataan yang disediakan benar (mis., dalam MySQLi), kebal terhadap eksploitasi ini.

Kesimpulannya, walaupun mysql_real_escape_string() secara amnya berkesan, ia mungkin dielakkan dalam senario tertentu. Versi moden MySQL, pemilihan set aksara yang sesuai dan kenyataan yang disediakan benar memastikan perlindungan lengkap terhadap serangan rumit ini.

Atas ialah kandungan terperinci Adakah `mysql_real_escape_string()` benar-benar selamat terhadap suntikan SQL, atau adakah terdapat kelemahan halus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn