Jadual Kandungan
Apakah bait null dan mengapa mereka penting?
Pitfall #1: Pemotongan yang tidak dijangka dalam operasi fail
Pitfall #2: Risiko keselamatan dalam muat naik fail
Pitfall #3: Isu dengan strcmp dan Perbandingan String
Pitfall #4: Ketidaksuburan dalam Ekspresi Biasa
Amalan Terbaik Umum
Rumah pembangunan bahagian belakang tutorial php Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php

Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php

Jul 28, 2025 am 04:42 AM
PHP Strings

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.

Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php

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.

Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php

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:

Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php
 $ 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.

Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php
 $ 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() , dan filter_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!

Kenyataan Laman Web ini
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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1535
276
Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php Menyelesaikan masalah biasa dengan bait null dan penamatan rentetan dalam php Jul 28, 2025 am 04:42 AM

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

Strings sebagai objek nilai: Pendekatan moden untuk jenis rentetan khusus domain Strings sebagai objek nilai: Pendekatan moden untuk jenis rentetan khusus domain Aug 01, 2025 am 07:48 AM

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

Teknik pemformatan rentetan lanjutan dengan `sprintf` dan` vsprintf` Teknik pemformatan rentetan lanjutan dengan `sprintf` dan` vsprintf` Jul 27, 2025 am 04:29 AM

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

Padan corak lanjutan dengan fungsi PCRE PHP Padan corak lanjutan dengan fungsi PCRE PHP Jul 28, 2025 am 04:41 AM

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 (??

Pengendalian String Defensive: Mencegah serangan XSS dan suntikan di PHP Pengendalian String Defensive: Mencegah serangan XSS dan suntikan di PHP Jul 25, 2025 pm 06:03 PM

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

Menavigasi labirin pengekodan rentetan PHP: UTF-8 dan seterusnya Menavigasi labirin pengekodan rentetan PHP: UTF-8 dan seterusnya Jul 26, 2025 am 09:44 AM

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.

Membongkar Data Binari: Panduan Praktikal untuk PHP's `Pack ()` dan `Membongkar ()` Membongkar Data Binari: Panduan Praktikal untuk PHP's `Pack ()` dan `Membongkar ()` Jul 25, 2025 pm 05:59 PM

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.

Beyond JSON: Memahami Serialization String Asli PHP Beyond JSON: Memahami Serialization String Asli PHP Jul 25, 2025 pm 05:58 PM

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.

See all articles