


Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php
Null bytes (\ 0) boleh menyebabkan tingkah laku yang tidak dijangka dalam PHP apabila interfacing dengan sambungan C atau panggilan sistem kerana C merawat \ 0 sebagai terminator rentetan, walaupun rentetan PHP adalah binari-selamat dan mengekalkan panjang penuh. 2. Dalam operasi fail, nama fail yang mengandungi bait null seperti "config.txt \ 0.php.bak" boleh dipotong ke "config.txt", yang membawa kepada akses fail atau risiko keselamatan yang salah. 3. Semasa muat naik fail, penyerang boleh mengeksploitasi bait null dalam $ _post ['filename'] untuk memintas cek sambungan, misalnya, "shell.php \ 0.jpg" diselamatkan sebagai "shell.php". 4. Perbandingan rentetan dalam php tulen (===, strcmp) betul mengendalikan bait null, tetapi sambungan berasaskan C atau pemacu pangkalan data boleh memotong rentetan, mempertaruhkan integriti data. 5. Ekspresi biasa mungkin sepadan dengan rentetan dengan bait null kecuali berlabuh dengan betul dengan \ a dan \ z, jadi input mesti diperiksa untuk \ 0 sebelum diproses. 6. Amalan terbaik termasuk penapisan bait null menggunakan str_replace ("\ 0", '', $ input) atau menolaknya, menggunakan nama base (), realpath (), dan filter_input (), mengesahkan semua input pengguna, mengelakkan interpolasi rentetan langsung dalam panggilan sistem atau sql, dan menggunakan pernyataan yang disediakan untuk queries pangkalan data untuk memastikan keselamatan. Sentiasa merawat bait null sebagai input yang berpotensi berbahaya dan mengendalikannya secara eksplisit untuk mengelakkan kerentanan pemotongan dan keselamatan.
Bekerja dengan rentetan dalam PHP biasanya terasa mudah -sehingga anda mengalami kes -kes kelebihan yang melibatkan bait null ( \0
) dan penamatan rentetan , terutama ketika interfacing dengan sambungan C, operasi fail, atau input pengguna. Walaupun PHP mengendalikan rentetan lebih fleksibel daripada bahasa peringkat rendah, isu-isu ini masih boleh membawa kepada tingkah laku yang tidak dijangka, kelemahan keselamatan, atau pemotongan data. Inilah cara untuk memahami dan mengelakkan perangkap yang paling biasa.

Apakah bait null dan mengapa mereka penting?
Byte null ( \0
) adalah watak dengan nilai ASCII 0. Dalam rentetan gaya C, ia menandakan berakhirnya rentetan . Walau bagaimanapun, rentetan PHP adalah binari-selamat , bermakna mereka boleh mengandungi bait null dan masih mengekalkan panjang penuh. Masalahnya timbul apabila PHP melepasi rentetan ke fungsi C (seperti yang ada dalam sambungan atau panggilan sistem) yang menafsirkan \0
sebagai terminator.
Contohnya:

$ string = "Hello \ 0world"; echo strlen ($ string); // output: 11
Walaupun dengan byte null, PHP tahu rentetan adalah 11 aksara panjang. Tetapi jika rentetan ini diserahkan kepada fungsi C yang mengharapkan rentetan yang ditamatkan null, ia hanya akan melihat "hello"
.
Pitfall #1: Pemotongan yang tidak dijangka dalam operasi fail
Salah satu isu yang paling biasa berlaku apabila menggunakan fungsi seperti file_get_contents()
atau fopen()
dengan nama fail atau laluan yang mengandungi bait null.

$ filename = "config.txt \ 0.php.bak"; file_get_contents ($ filename); // hanya boleh membaca "config.txt"
PHP boleh membenarkan rentetan itu diluluskan, tetapi panggilan sistem yang mendasari (ditulis dalam c) berhenti di \0
, yang berpotensi membawa kepada:
- Membaca fail yang salah
- Memintas sambungan fail (risiko keselamatan dalam muat naik fail)
✅ Penyelesaian : Sentiasa membersihkan dan mengesahkan input:
jika (strpos ($ filename, "\ 0")! == false) { membuang InvalidArgumentException baru ("bait null tidak dibenarkan dalam nama fail"); }
Lebih baik lagi, gunakan senarai putih untuk operasi fail dan elakkan nama fail dinamik jika mungkin.
Pitfall #2: Risiko keselamatan dalam muat naik fail
Penyerang boleh menyuntik bait null ke $_GET
, $_POST
, atau memuat naik nama fail untuk mengeksploitasi tingkah laku penamatan rentetan.
Contoh corak berbahaya:
// Jangan buat ini $ uploaddir = '/muat naik/'; move_uploaded_file ($ _ files ['file'] ['tmp_name'], $ uploaddir. $ _post ['filename']);
Jika $_POST['filename']
adalah "shell.php\0.jpg"
, sesetengah sistem mungkin menyelamatkannya sebagai shell.php
(kerana .jpg
diabaikan selepas \0
), melangkaui cek lanjutan.
✅ Penyelesaian :
- Jangan pernah mempercayai input pengguna untuk laluan fail
- Gunakan
basename()
untuk menyentuh maklumat direktori - Mengesahkan sambungan pada kandungan fail sebenar, bukan hanya nama
- Penapis null byte secara eksplisit:
jika (preg_match ('/[\ x00]/', $ filename)) { mati ("nama fail tidak sah"); }
Pitfall #3: Isu dengan strcmp
dan Perbandingan String
Walaupun perbandingan rentetan asli PHP ( ==
, ===
, strcmp
) mengendalikan bait null dengan betul, isu boleh timbul apabila menggunakan sambungan atau pemacu pangkalan data yang bergantung pada rentetan C.
Sebagai contoh, membandingkan "admin\0"
dan "admin"
dalam php:
var_dump ("admin \ 0" === "admin"); // palsu var_dump (strcmp ("admin \ 0", "admin")); // bukan sifar (tidak sama)
Ini selamat dalam PHP tulen, tetapi jika rentetan ini digunakan dalam pertanyaan SQL melalui pemandu berasaskan C, pemotongan boleh berlaku.
✅ Amalan Terbaik : Gunakan pernyataan yang disediakan untuk mengelakkan suntikan dan memastikan integriti data:
$ STMT = $ pdo-> Sediakan ("Pilih * dari pengguna di mana username =?"); $ stmt-> Execute ([$ username]); // mengendalikan PDO melarikan diri dan data binari
Pitfall #4: Ketidaksuburan dalam Ekspresi Biasa
Fungsi PCRE dalam PHP biasanya selamat binari, tetapi bait null masih boleh menyebabkan kekeliruan, terutamanya apabila memproses input pengguna.
Contoh:
preg_match ('/^[\ w \.] $/', "file.txt \ 0.php"); // boleh kembali 1 (!)
Regex sepadan dengan byte null, tetapi rentetan penuh tidak selamat.
✅ Betulkan : secara jelas menolak bait null sebelum regex:
jika (strpos ($ input, "\ 0")! == false) { // menolak atau mengendalikan }
Atau gunakan corak ketat dengan \A
dan \z
(permulaan/akhir mutlak):
preg_match ('/\ a [\ w \.] \ z/', $ input); // memastikan perlawanan rentetan penuh
Amalan Terbaik Umum
Untuk mengelakkan perangkap byte null dalam php:
- ✅ Penapis bait null dari input pengguna:
$ clean = str_replace ("\ 0", '', $ input); // atau menolak sepenuhnya
- ✅ Gunakan fungsi terbina dalam seperti
basename()
,realpath()
, danfilter_input()
- ✅ Mengesahkan dan membersihkan semua data luaran -tidak pernah menganggapnya selamat
- ✅ Elakkan interpolasi rentetan langsung dalam panggilan sistem atau SQL
- ✅ Gunakan fungsi selamat binari ketika berurusan dengan data mentah
Null Bytes tidak semestinya jahat, tetapi mereka mendedahkan jurang antara pengendalian rentetan peringkat tinggi PHP dan dunia peringkat rendah C. Dengan mengesahkan input awal dan pemahaman di mana rentetan anda pergi, anda boleh mengelakkan pemotongan, kelemahan keselamatan, dan debugging sakit kepala.
Pada asasnya: merawat bait null seperti mana -mana input berbahaya yang lain -memancarkan mereka atau mengendalikannya secara eksplisit.
Atas ialah kandungan terperinci Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php. 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)

Nullbytes (\ 0) cancauseunexpectedbehaviorinphpwheninterfacingwithcextensionSorsystemcallsbecausectreats \ 0asastringminator, eventHoughphpstringsarebinary-safeAndpreserveFullengh.

Rawstringsindomain-drivenapplicationsshouldbereplacedwithvalueobjectstopreventbugsandimprovetypesafety; 1.ingrawstringsleadstoprimitiveobSession, di mana interinterchangeablestringtypescancausesubtslikeArentswapping;

SPRINTF dan VSPRINTF menyediakan fungsi pemformatan rentetan lanjutan dalam PHP. Jawapannya ialah: 1. Ketepatan titik terapung dan %D boleh dikawal melalui %.2F, dan jenis integer dapat dipastikan dengan D, dan sifar padding dapat dicapai dengan D; 2. Kedudukan pembolehubah boleh diperbaiki menggunakan tempat letak posisi seperti %1 $ s dan %2 $ D, yang mudah untuk pengantarabangsaan; 3. Penjajaran kiri dan] penjajaran kanan boleh dicapai melalui %-10s, yang sesuai untuk jadual atau output log; 4. VSPrintf menyokong parameter array untuk memudahkan penjanaan dinamik SQL atau templat mesej; 5. Walaupun tidak ada tempat asal tempat asal, {nama} sintaks boleh disimulasikan melalui fungsi panggil balik biasa, atau array bersekutu boleh digunakan dalam kombinasi dengan ekstrak (); 6. substr_co

Fungsi PCRE PHP menyokong fungsi tetap lanjutan, 1. Gunakan kumpulan penangkapan () dan kumpulan bukan tangkapan (? :) Untuk memisahkan kandungan yang sepadan dan meningkatkan prestasi; 2. Gunakan pernyataan preemptive positif/negatif (? =) Dan (?!)) Dan pernyataan pasca isu (???)) dan pernyataan pasca isu (??

TODefendAgainStxSandInjectionPhp: 1.AlwaysescapeOutputusingHtmlSpecialChars () forhtml, json_encode () forjavaScript, andurlencode () forurls, dependoNcontext.2.validateAndIsPareSpoSpoSfilterfilter_)

Pemprosesan UTF-8 perlu diuruskan secara manual dalam PHP, kerana PHP tidak menyokong Unicode secara lalai; 1. Gunakan lanjutan MBSTRING untuk menyediakan fungsi keselamatan multi-bait seperti MB_STRLEN, MB_SUBSTR dan secara jelas menentukan pengekodan UTF-8; 2. Pastikan sambungan pangkalan data menggunakan set aksara UTF8MB4; 3. Mengisytiharkan UTF-8 melalui tajuk HTTP dan tag Meta HTML; 4. Sahkan dan tukar pengekodan semasa membaca dan menulis fail; 5. Memastikan data adalah UTF-8 sebelum pemprosesan JSON; 6. Gunakan MB_DETECT_ENCODING dan ICONV untuk Pengesanan dan Penukaran Pengekodan; 7. Mencegah rasuah data lebih baik daripada pasca pembaikan, dan UTF-8 mesti digunakan di semua peringkat untuk mengelakkan masalah kod yang dihiasi.

Fungsi PHP () dan membongkar () digunakan untuk menukar antara pembolehubah PHP dan data binari. 1.Pack () pembolehubah pakej seperti integer dan rentetan ke dalam data binari, dan membongkar () membongkar data binari ke dalam pembolehubah PHP. Kedua -duanya bergantung pada rentetan format untuk menentukan peraturan penukaran. 2. Kod format biasa termasuk C/C (8-bit dengan/aksara yang tidak ditandatangani), S/S (Integer pendek 16-bit), l/l/v/n (integer panjang 32-bit, sepadan dengan endianness yang berbeza), F/D (titik terapung/Double Precision) Besar-endian (Standard Rangkaian). V harus digunakan terlebih dahulu apabila berkomunikasi di seluruh platform.

Serialization asli PHP lebih sesuai untuk penyimpanan dan penghantaran data dalaman PHP daripada JSON, 1. Kerana ia dapat mengekalkan jenis data lengkap (seperti int, float, bool, dll.); 2. Menyokong sifat objek swasta dan dilindungi; 3. Boleh mengendalikan rujukan rekursif dengan selamat; 4. Tidak ada keperluan untuk penukaran jenis manual semasa deserialization; 5. Ia biasanya lebih baik daripada JSON dalam prestasi; Tetapi ia tidak boleh digunakan dalam senario silang bahasa, dan unserialize () tidak boleh dipanggil untuk input yang tidak dipercayai untuk mengelakkan pencetus serangan pelaksanaan kod jauh. Adalah disyorkan untuk menggunakannya apabila ia terhad kepada persekitaran PHP dan memerlukan data kesetiaan tinggi.
