


Bagaimana untuk memintas petikan tunggal melarikan diri dalam ThinkPHP
Apr 17, 2023 am 09:49 AMThinkPHP ialah rangka kerja PHP yang popular Kami selalunya perlu mengendalikan data dalam pangkalan data semasa proses pembangunan, dan suntikan SQL ialah ancaman keselamatan yang biasa. Untuk mengelakkan serangan suntikan SQL, kita perlu melarikan diri daripada aksara khas. Apabila menggunakan fungsi manipulasi data rangka kerja itu sendiri, rangka kerja itu telah melarikan diri daripada aksara khas, tetapi apabila menggunakan SQL asli, anda perlu mengendalikannya sendiri. Artikel ini akan memperkenalkan cara memintas petikan tunggal melarikan diri dalam ThinkPHP.
Apabila menggunakan SQL asli, kami biasanya menggunakan pernyataan yang disediakan PDO untuk mencegah serangan suntikan SQL, contohnya:
$sql?=?'SELECT?*?FROM?users?WHERE?username?=?:username'; $sth?=?$dbh->prepare($sql); $sth->bindParam(':username',?$username); $sth->execute();
Kaedah ini boleh mengelakkan serangan suntikan SQL dengan berkesan, kerana aksara Khas PDO akan menjadi melarikan diri secara automatik, yang juga boleh meningkatkan prestasi pertanyaan.
Walau bagaimanapun, dalam beberapa kes kami perlu menggunakan SQL asli, yang memerlukan kami mengendalikan SQL melarikan diri sendiri. Contohnya:
$username?=?$_GET['username']; $sql?=?"SELECT?*?FROM?users?WHERE?username?=?'".addslashes($username)."'";
Kaedah ini ialah cara biasa untuk mengendalikan SQL escape dan aksara khas dilarikan melalui fungsi addslashes. Walau bagaimanapun, pendekatan ini tidak selamat kerana dalam banyak kes, serangan suntikan SQL boleh dilakukan dengan memintas fungsi tanda miring tambahan. Katakan kita menggunakan petikan tunggal untuk membungkus aksara khas, contohnya:
$username?=?"123'?OR?'1'='1"; $sql?=?"SELECT?*?FROM?users?WHERE?username?=?'".addslashes($username)."'";
Hasil pertanyaan pernyataan SQL ini akan mengembalikan semua maklumat pengguna, kerana pada masa ini logik pernyataan SQL menjadi:
SELECT?*?FROM?users?WHERE?username?=?'123'?OR?'1'='1'
Memandangkan '1'='1' sentiasa benar, hasil pertanyaan pernyataan SQL ini ialah semua maklumat pengguna. Beginilah cara suntikan SQL berfungsi. Walau bagaimanapun, kami boleh menggunakan beberapa kaedah untuk memintas petikan tunggal melarikan diri, supaya walaupun ' digunakan untuk serangan suntikan, ia tidak akan menyebabkan sebarang bahaya.
Kaedah untuk memintas petikan tunggal melarikan diri adalah seperti berikut:
- Gunakan petikan berganda
Petikan berganda ialah watak undang-undang dalam SQL, jadi kami Menggandakan petikan boleh digunakan untuk memintas petikan tunggal melarikan diri. Contohnya:
$username?=?'123"?OR?"1"="1'; $sql?=?'SELECT?*?FROM?users?WHERE?username?=?"'.$username.'"';
Hasil pertanyaan pernyataan SQL ini akan mengembalikan semua maklumat pengguna, kerana pada masa ini logik pernyataan SQL menjadi:
SELECT?*?FROM?users?WHERE?username?=?'123"?OR?"1"="1'
Pada masa ini, gandaan Kandungan yang disertakan dalam tanda petikan akan dilaksanakan secara keseluruhan dan tidak akan terjejas oleh tanda petikan tunggal yang terlepas. Oleh itu, menggunakan petikan berganda secara berkesan boleh memintas petikan tunggal melarikan diri Walau bagaimanapun, perlu diingat bahawa menggunakan petikan berganda mungkin menghadapi masalah melarikan diri Sebagai contoh, petikan berganda itu sendiri perlu dilepaskan menggunakan ''.
- Gunakan backslash
Backslash'' ialah watak melarikan diri dalam SQL Backslash digunakan dalam SQL untuk melarikan diri daripada aksara khas ??>Pada masa ini, logik pernyataan SQL yang terlepas menjadi:
$username?=?'123\'?OR?\'1\'=\'1'; $sql?=?'SELECT?*?FROM?users?WHERE?username?=?"'.$username.'"';
Oleh kerana '' boleh dikenali secara normal dalam sintaks SQL, gunakan '' untuk melarikan diri adalah mungkin. Walau bagaimanapun, perlu diambil perhatian bahawa oleh kerana '' sendiri juga merupakan watak melarikan diri dalam PHP, anda perlu menggunakan aksara melarikan diri berganda '\'' untuk mewakili '' dalam PHP.
SELECT?*?FROM?users?WHERE?username?=?'123'?OR?'1'='1'
Gunakan fungsi CHR
- Fungsi CHR boleh menukar integer kepada aksara kod ASCII yang sepadan Kita boleh menggunakan fungsi CHR untuk menukar petikan tunggal kepada kod ASCII, dengan itu memintas Melarikan diri melalui petikan tunggal, sebagai contoh:
Pada masa ini, logik pernyataan SQL yang terlepas menjadi:
$username?=?'123'.chr(39).'?OR?1=1'; $sql?=?'SELECT?*?FROM?users?WHERE?username?=?"'.$username.'"';
Kerana chr(39) boleh mendapatkan petikan tunggal kod ASCII , jadi menggunakan fungsi CHR juga boleh memintas petikan tunggal dengan berkesan.
SELECT?*?FROM?users?WHERE?username?=?'123'?OR?1=1Memintas petikan tunggal melarikan diri ialah teknik biasa dalam serangan suntikan SQL Untuk mempertahankan diri daripada serangan sedemikian, anda perlu memberi perhatian untuk melarikan diri daripada aksara khas apabila menggunakan SQL asli Pada masa yang sama, anda perlu memberi perhatian kepada menggunakan cara melarikan diri. Apabila menggunakan fungsi manipulasi data rangka kerja itu sendiri, risiko serangan suntikan SQL dapat dikurangkan dengan berkesan.
Atas ialah kandungan terperinci Bagaimana untuk memintas petikan tunggal melarikan diri dalam ThinkPHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)