簡體   English   中英

將空字符添加到非空終止的字符串有什么問題?

[英]What is wrong with adding null character to non null-terminated string?

為什么我不應該像這樣的答案在不以null終止的字符串的末尾添加null字符? 我的意思是,如果我有一個非null終止的字符串,並在字符串末尾添加了null字符,那么我現在有了一個以null終止的字符串,應該很好,對吧? 有沒有我看不到的安全問題?

這是刪除答案的代碼:

char letters[SIZE + 1];  // Leave room for the null-terminator.

// ...
// Populate letters[].
// ...

letters[SIZE] = '\0';  // Null-terminate the array.

要知道字符串的結尾,您必須有一個以null結尾的字符串,否則就無法知道字符串的結尾

這樣用\\0終止字符串在技術上沒有任何錯誤。 但是, 添加\\0 之前可用於填充數組的方法容易出錯。 在某些情況下看一下:

  1. 假設你決定來填充letters的字符字符。 如果您忘記添加一些字母怎么辦? 如果添加的字母超過預期大小該怎么辦?

  2. 如果有成千上萬個字母填充數組怎么辦?

  3. 如果需要用Unicode字符填充letters (通常)每個符號需要多個字節怎么辦?

當然,您可以非常仔細地解決這些情況,但是在維護代碼時它們仍然很容易出錯。

需要明確的是:C中的字符串 始終只有一個且只有一個空字符-它是字符串的最后一個字符。 字符串是字符數組。 如果字符數組沒有空字符,則它不是字符串。

字符串是由第一個空字符終止並包括第一個空字符的連續字符序列。 C11dr 7.1.1 1

將空字符添加到按OP編碼的字符數組中沒有任何問題。

在以下情況下,這是形成字符串的一種好方法:

  1. 前面所有字符均已定義。

  2. 直到寫入空字符后才調用字符串函數。

通常,有兩種方法可以跟蹤數量可變的事物的數組:

  1. 使用終止符。 當然,這是表示字符串的C語言方法:大小未知的字符數組,其實際字符串長度由空終止符給出。
  2. 使用存儲在其他位置的顯式計數。 (碰巧的是,這就是Pascal傳統上表示字符串的方式。)

如果您的數組包含一個已知的但不是以Null結尾的字符序列,並且想要將其轉換為一個以Null結尾的字符串,並且您知道基礎數組分配的大小足以包含Null終止符,然后是的,將array[N]顯式設置為'\\0'不僅可以接受,而且是這樣做方法。

底線:這是一種很好的技術(如果滿足約束)。 我不知道為什么早先的答案遭到批評和低估。

您不應該使用它,以避免由於混合C / Pascal字符串而導致錯誤(或安全漏洞)。

  • C樣式字符串:char數組,以NULL('\\ 0')結尾
  • Pascal樣式字符串:一種結構,具有與字符串大小相同的int值,以及具有字符串本身的數組。

Pascal樣式不使用帶內控件 ,因此它可以使用其中的任何char,例如NULL。 C字符串不能,因為它們將其用作信令控制。

問題是當您將它們混合使用時,或者在將另一種樣式呈現為另一種樣式時。 甚至嘗試在它們之間進行轉換。

將C字符串轉換為pascal不會造成任何傷害。 但是,如果您有一個合法的Pascal字符串,其中包含多個NULL字符,那么將其轉換為C樣式將引起問題,因為它無法表示它。

X.509 Null Char Exploit是一個很好的例子,您可以在其中注冊ssl證書到:

www.mysimplesite.com\0www.bigbank.com

X.509證書使用Pascal字符串,因此這是有效的。 但是,在進行檢查時,CA可以使用或采用僅看到第一個www.mysimplesite.com並簽署證書的C代碼或字符串樣式。 一些經紀人認為該證書對www.bigbank.com也有效。

所以,你可以SHOULD'NT使用它,但是,因為它是有風險引起了一些bug,甚至安全漏洞。

更多詳細信息和信息: https : //www.blackhat.com/presentations/bh-usa-09/MARLINSPIKE/BHUSA09-Marlinspike-DefeatSSL-SLIDES.pdf https://sites.google.com/site/cse825maninthemiddle/odds-和結束/ x-509-null-char-exploit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM