目錄
什麼是零字節,為什麼重要?
陷阱1:文件操作中的意外截斷
陷阱2:文件上傳中的安全風險
陷阱3: strcmp和字符串比較的問題
陷阱4:正式表達式的不當行為
一般最佳實踐
首頁 後端開發 php教程 用零字節和PHP中的字符串終止解決常見的陷阱

用零字節和PHP中的字符串終止解決常見的陷阱

Jul 28, 2025 am 04:42 AM
PHP Strings

當與C擴展或系統調用接口時,null字節(\ 0)可能會導致PHP中的意外行為,因為C將\ 0視為字符串終端,即使PHP字符串是二進制安全並保留了全長。 2。在文件操作中,包含諸如“ config.txt \ 0.php.bak”之類的null字節的文件名可以截斷為“ config.txt”,從而導致文件訪問不正確或安全風險。 3。在文件上傳期間,攻擊者可以利用$ _post ['filename']中的null字節來繞過擴展檢查,例如,“ shell.php \ 0.jpg”被保存為“ shell.php”。 4。純php中的字符串比較(===,strCMP)正確處理null字節,但是基於C的擴展或數據庫驅動程序可能會截斷字符串,冒著數據完整性的風險。 5。正則表達式可以與null字符部分匹配,除非用\ a和\ z正確錨定,否則必須在處理前檢查輸入以獲取\ 0。 6.最佳實踐包括使用str_replace(“ \ 0”,',$輸入)過濾零字節,或使用Basename(),realpath()和filter_input()和filter_input()拒絕它們,驗證所有用戶輸入,避免使用系統呼叫或SQL中的直接字符串插值,以及使用準備好的語言來確保安全的語言來確保安全。始終將零字節視為潛在的危險輸入,並明確處理它們,以防止截斷和安全漏洞。

用零字節和PHP中的字符串終止解決常見的陷阱

使用PHP中的字符串通常感覺很簡單 - 直到您遇到涉及null字節\0 )和字符串終止的邊緣案例,尤其是在與C擴展名,文件操作或用戶輸入的連接時。儘管PHP比低級語言更靈活地處理字符串,但這些問題仍然會導致意外的行為,安全漏洞或數據截斷。這是理解和避免最常見的陷阱的方法。

用零字節和PHP中的字符串終止解決常見的陷阱

什麼是零字節,為什麼重要?

null字節\0 )是一個字符,其ASCII值為0。在C風格的字符串中,它標誌著字符串的末端。但是,PHP字符串是二進制安全的,這意味著它們可以包含空字節並仍然保留全長。當PHP將字符串傳遞到C函數(例如擴展或系統調用中的\0 )時就會出現問題。

例如:

用零字節和PHP中的字符串終止解決常見的陷阱
 $ string =“ Hello \ 0world”;
Echo strlen($ string); //輸出:11

即使使用零字節,PHP也知道字符串長11個字符。但是,如果該字符串傳遞給了C函數,則可以期待一個無效的字符串,則只會看到"hello"


陷阱1:文件操作中的意外截斷

當使用file_get_contents()fopen()之類的函數時,就會發生最常見的問題之一。

用零字節和PHP中的字符串終止解決常見的陷阱
 $ filename =“ config.txt \ 0.php.bak”;
file_get_contents($ filename); //可能只讀“ config.txt”

PHP可以允許通過該字符串,但是基礎系統調用(以C為編寫)在\0停止,可能導致:

  • 讀錯誤的文件
  • 繞過文件擴展名(文件上傳中的安全風險)

解決方案:始終對輸入進行消毒和驗證:

 if(strpos($ filename,“ \ 0”)!== false){
    拋出新的無效Exception(“在文件名中不允許null字節”);
}

更好的是,使用白名單進行文件操作,並在可能的情況下避免動態文件名。


陷阱2:文件上傳中的安全風險

攻擊者可以將null字節注入$_GET$_POST或上傳文件名以利用字符串終止行為。

危險模式的例子:

 //不要這樣做
$ uploadDir ='/uploads/';
move_uploaded_file($ _ files ['file'] ['tmp_name'],$ uploadDir。$ _post ['filename']);

如果$_POST['filename']"shell.php\0.jpg" ,則某些系統可能將其保存為shell.php (因為\0之後忽略.jpg ),繞過擴展檢查。

解決方案

  • 永遠不要相信用戶輸入文件路徑
  • 使用basename()剝離目錄信息
  • 驗證實際文件內容上的擴展名,而不僅僅是名稱
  • 明確過濾null字節:
     if(preg_match('/[\ x00]/',$ filename)){
      die(“無效文件名”);
    }

陷阱3: strcmp和字符串比較的問題

雖然PHP的本機字符串比較( =====strcmp )正確處理null字節,但使用依賴C字符串的擴展程序或數據庫驅動程序時可能會出現問題。

例如,比較php中的"admin\0""admin"

 var_dump(“ admin \ 0” ===“ admin”); // 錯誤的
var_dump(strcmp(“ admin \ 0”,“ admin”)); //非零(不相等)

這在純PHP中是安全的,但是如果這些字符串通過基於C的驅動器在SQL查詢中使用,則可能會發生截斷。

最佳實踐:使用準備好的語句避免注入並確保數據完整性:

 $ stmt = $ pdo->準備(“從用戶select * select * username =?”);
$ stmt->執行([$ username]); // PDO處理逃逸和二進制數據

陷阱4:正式表達式的不當行為

PHP中的PCRE功能通常是二進制安全的,但是NULL字節仍然會引起混亂,尤其是在處理用戶輸入時。

例子:

 preg_match('/^[\ w \。] $/',“ file.txt \ 0.php”); //可能返回1(!)

正則表達式與空字節匹配,但完整的字符串不安全。

修復:明確拒絕null字節,然後再發行:

 if(strpos($輸入,“ \ 0”)!== false){
    //拒絕或處理
}

或使用\A\z (絕對啟動/結束)使用更嚴格的模式:

 preg_match('/\ a [\ w \。] \ z/',$ input); //確保完整的弦匹配

一般最佳實踐

為了避免php中的零字節陷阱:

  • ✅從用戶輸入中的過濾null字節
     $ clean = str_replace(“ \ 0”,'',$ input); //或完全拒絕
  • ✅使用basename()realpath()filter_input()之類的內置功能()
  • 驗證和消毒所有外部數據 - 永遠不要假設它是安全的
  • 避免在系統調用或SQL中直接插值
  • ✅處理原始數據時,請使用二進制安全功能

  • 零字節並不是固有的邪惡,但是它們通過PHP的高級字符串處理與C的低級世界之間的差距。

    基本上:將null字節視為其他任何危險輸入,將其濾出或明確處理。

    以上是用零字節和PHP中的字符串終止解決常見的陷阱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

防禦弦處理:防止XSS和PHP注射攻擊 防禦弦處理:防止XSS和PHP注射攻擊 Jul 25, 2025 pm 06:03 PM

TodefendagainstXSSandinjectioninPHP:1.Alwaysescapeoutputusinghtmlspecialchars()forHTML,json_encode()forJavaScript,andurlencode()forURLs,dependingoncontext.2.Validateandsanitizeinputearlyusingfilter_var()withappropriatefilters,applywhitelistvalidation

超越JSON:了解PHP的本地字符串序列化 超越JSON:了解PHP的本地字符串序列化 Jul 25, 2025 pm 05:58 PM

PHP的原生序列化比JSON更適合PHP內部數據存儲與傳輸,1.因為它能保留完整數據類型(如int、float、bool等);2.支持私有和受保護的對象屬性;3.可安全處理遞歸引用;4.反序列化時無需手動類型轉換;5.在性能上通常優於JSON;但不應在跨語言場景使用,且絕不能對不可信輸入調用unserialize(),以免引發遠程代碼執行攻擊,推薦在僅限PHP環境且需高保真數據時使用。

帶有' sprintf”和' vsprintf”的高級字符串格式化技術 帶有' sprintf”和' vsprintf”的高級字符串格式化技術 Jul 27, 2025 am 04:29 AM

sprintf和vsprintf在PHP中提供高級字符串格式化功能,答案依次為:1.可通過%.2f控制浮點數精度、%d確保整數類型,並用d實現零填充;2.使用%1$s、%2$d等positional佔位符可固定變量位置,便於國際化;3.通過%-10s實現左對齊、]右對齊,適用於表格或日誌輸出;4.vsprintf支持數組傳參,便於動態生成SQL或消息模板;5.雖無原生命名佔位符,但可通過正則回調函數模擬{name}語法,或結合extract()使用關聯數組;6.應通過substr_co

解開二進制數據:PHP的' PACK()”和' unvack()”的實用指南````'' 解開二進制數據:PHP的' PACK()”和' unvack()”的實用指南````'' Jul 25, 2025 pm 05:59 PM

PHP的pack()和unpack()函數用於在PHP變量與二進制數據之間轉換。 1.pack()將變量如整數、字符串打包成二進制數據,unpack()則將二進制數據解包為PHP變量,二者均依賴格式字符串指定轉換規則。 2.常見格式碼包括C/c(8位有/無符號字符)、S/s(16位短整型)、L/l/V/N(32位長整型,分別對應不同字節序)、f/d(浮點/雙精度)、a/A(填充字符串)、x(空字節)等。 3.字節序至關重要:V表示小端序(Intel),N表示大端序(網絡標準),跨平台通信時應優先使用V

角色級的弦樂及其性能含義 角色級的弦樂及其性能含義 Jul 26, 2025 am 09:40 AM

角色級別的manipulationCanseverelyImpactperformanceInimmutable-stranguagesDuetorePeatEdeDallocations andCoppy; 1)避免使用repeatePeatedConcatenation = InvolyOps,而不是usemutablebufferslikelist''.join()inpythonorstringbuilderdringbuilderdercerinjava; 2)minimizizizizizin; 2)

PHP中的大型數據集的存儲效率字符串處理 PHP中的大型數據集的存儲效率字符串處理 Jul 26, 2025 am 09:42 AM

Processlargefilesline-by-lineorinchunksusingfgets()orfread()insteadofloadingentirefilesintomemorywithfile()orfile_get_contents().2.Minimizeunnecessarystringcopiesbyavoidingchainedstringfunctions,breakingdownoperations,andusingunset()onlargestringswhe

導航PHP字符串編碼的迷宮:UTF-8及以後 導航PHP字符串編碼的迷宮:UTF-8及以後 Jul 26, 2025 am 09:44 AM

UTF-8處理在PHP中需手動管理,因PHP默認不支持Unicode;1.使用mbstring擴展提供多字節安全函數如mb_strlen、mb_substr並顯式指定UTF-8編碼;2.確保數據庫連接使用utf8mb4字符集;3.通過HTTP頭和HTML元標籤聲明UTF-8;4.文件讀寫時驗證並轉換編碼;5.JSON處理前確保數據為UTF-8;6.利用mb_detect_encoding和iconv進行編碼檢測與轉換;7.預防數據損壞優於事後修復,需在所有層級強制使用UTF-8以避免亂碼問題。

php中字符串比較的細微差別:`==`vs. php中字符串比較的細微差別:`==`vs. Jul 27, 2025 am 04:01 AM

避免== forStringComParisonDuetypy juggling,cancaveunexpedResultSlike“ 0E12345” ==“ 0E67890” beTrue; 2.usestrcmp()可兌現,可啟發性,病例敏感的,詞素敏感的,詞典的CommodraphicalComparisonThateTthateTrenturnS0Foreftrings0Foreftrings,coldicfterftherftherftherftherftherfthirstississississississ和p. andpp

See all articles