Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk memintas petikan tunggal melarikan diri dalam ThinkPHP

Bagaimana untuk memintas petikan tunggal melarikan diri dalam ThinkPHP

PHPz
PHPzasal
2023-04-17 09:49:071205semak imbas

ThinkPHP 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:

  1. 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 ''.

  1. 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

  1. 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=1
Memintas 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!

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