[英]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
之前可用於填充數組的方法容易出錯。 在某些情況下看一下:
假設你決定來填充letters
的字符字符。 如果您忘記添加一些字母怎么辦? 如果添加的字母超過預期大小該怎么辦?
如果有成千上萬個字母填充數組怎么辦?
如果需要用Unicode字符填充letters
(通常)每個符號需要多個字節怎么辦?
當然,您可以非常仔細地解決這些情況,但是在維護代碼時它們仍然很容易出錯。
需要明確的是:C中的字符串 始終只有一個且只有一個空字符-它是字符串的最后一個字符。 字符串是字符數組。 如果字符數組沒有空字符,則它不是字符串。
字符串是由第一個空字符終止並包括第一個空字符的連續字符序列。 C11dr 7.1.1 1
將空字符添加到按OP編碼的字符數組中沒有任何問題。
在以下情況下,這是形成字符串的一種好方法:
前面所有字符均已定義。
直到寫入空字符后才調用字符串函數。
通常,有兩種方法可以跟蹤數量可變的事物的數組:
如果您的數組包含一個已知的但不是以Null結尾的字符序列,並且想要將其轉換為一個以Null結尾的字符串,並且您知道基礎數組分配的大小足以包含Null終止符,然后是的,將array[N]
顯式設置為'\\0'
不僅可以接受,而且是這樣做的方法。
底線:這是一種很好的技術(如果滿足約束)。 我不知道為什么早先的答案遭到批評和低估。
您不應該使用它,以避免由於混合C / Pascal字符串而導致錯誤(或安全漏洞)。
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.