Rumah >pembangunan bahagian belakang >tutorial php >Adakah `mysql_real_escape_string()` Benar-benar Menghalang Suntikan SQL?

Adakah `mysql_real_escape_string()` Benar-benar Menghalang Suntikan SQL?

Susan Sarandon
Susan Sarandonasal
2024-12-27 11:20:12409semak imbas

Does `mysql_real_escape_string()` Really Prevent SQL Injection?

Adakah mysql_real_escape_string() Mencukupi untuk Pencegahan Suntikan SQL?

Walaupun ramai yang percaya bahawa menggunakan mysql_real_escape_string() sememangnya terdapat perlindungan terhadap suntikan SQL, pintasan kemungkinan.

The Flaw

Dalam kes tertentu, seperti:

mysql_query('SET NAMES gbk');
$var = mysql_real_escape_string("\xbf\x27 OR 1=1 /*");
mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");

Isu ini timbul kerana ketidakpadanan antara watak yang dijangkakan oleh pelayan ditetapkan dan persepsi klien. Dengan menggunakan 'SET NAMES' untuk mengubah suai set aksara pada pelayan, mysql_real_escape_string() mungkin terlepas ' seperti dalam ASCII, manakala pelayan menjangkakannya sebagai teks biasa. Ini mewujudkan percanggahan, membenarkan 'gantung bebas' dan suntikan.

The Bad

Emulasi lalai PDO bagi pernyataan yang disediakan juga boleh membawa kepada kelemahan ini. Melumpuhkan emulasi disyorkan, tetapi sandaran kepada emulasi untuk pertanyaan yang tidak disokong boleh menghalang perlindungan penuh.

The Ugly

Sebelum MySQL 4.1.20, pepijat membenarkan aksara multibait yang tidak sah seperti yang dilihat dalam muatan untuk dilepaskan sebagai bait tunggal, walaupun dengan set aksara pelanggan yang betul maklumat.

The Saving Grace

Menggunakan set aksara kedap seperti utf8mb4 atau utf8, atau mendayakan mod SQL NO_BACKSLASH_ESCAPES, memberikan perlindungan terhadap perkara ini kerentanan.

Kesimpulan

Menggunakan mysql_real_escape_string() kekal berkesan dalam banyak situasi, tetapi adalah penting untuk mengetahui kemungkinan kes kelebihan. Menggunakan teknik selamat seperti medan terhitung dan pernyataan yang disediakan, bersama set aksara dan konfigurasi mod yang betul, adalah penting untuk perlindungan suntikan SQL yang komprehensif.

Atas ialah kandungan terperinci Adakah `mysql_real_escape_string()` Benar-benar Menghalang Suntikan SQL?. 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