第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么strlcpy和strlcat被認為是不安全的?

為什么strlcpy和strlcat被認為是不安全的?

心有法竹 2019-06-28 10:49:37
為什么strlcpy和strlcat被認為是不安全的?我明白strlcpy和strlcat的安全替換strncpy和strncat..然而,有些人仍然認為不安全,只會導致另一種類型的問題.有人能給出一個如何使用的例子嗎?strlcpy或strlcat(即指總NULL終止其字符串)會導致安全問題嗎?烏爾里希·德雷珀和詹姆斯·安蒂爾說這是真的,但永遠不要提供例子或澄清這一點。
查看完整描述

3 回答

?
Helenr

TA貢獻1780條經(jīng)驗 獲得超4個贊

首先,strlcpy的安全版本。strncpy(和strncpy的安全版本。strcpy)。這兩種功能是完全不相關(guān)的。strncpy是一個與C-字符串(即空終止字符串)完全無關(guān)的函數(shù)。事實上它有str...其名稱中的前綴只是一個歷史錯誤。的歷史和宗旨strncpy是眾所周知的,也是有據(jù)可查的。這是一個函數(shù),用于處理一些Unix文件系統(tǒng)的歷史版本中使用的所謂“固定寬度”字符串(而不是C-字符串)。今天有些程序員被它的名字弄糊涂了,并且認為strncpy作為有限長度的C-字符串復制函數(shù)(“安全”的兄弟姐妹)strcpy),這在現(xiàn)實中完全是胡說八道,導致了糟糕的編程實踐。目前形式的C標準庫沒有任何限制長度C字串復制的功能.這里是strlcpy合身。strlcpy確實是為處理C-字符串而創(chuàng)建的真正的有限長度復制函數(shù)。strlcpy正確地完成有限長度的復制函數(shù)應該做的所有事情。唯一能針對它的批評是,令人遺憾的是,它不是標準的。

第二,strncat另一方面,它確實是一個與C字符串一起工作并執(zhí)行有限長度連接的函數(shù)(它確實是strcat)。為了正確地使用這個函數(shù),程序員必須特別小心,因為這個函數(shù)接受的大小參數(shù)實際上不是接收結(jié)果的緩沖區(qū)的大小,而是其剩余部分的大小(另外,終止符字符被隱式計算)。這可能會讓人感到困惑,因為為了將該大小與緩沖區(qū)的大小聯(lián)系起來,程序員必須記住執(zhí)行一些額外的計算,這通常用于批評strncatstrlcat處理這些問題,更改接口,這樣就不需要額外的計算(至少在調(diào)用代碼中是這樣)。再一次,我看到的唯一一個可以批評這一點的基礎(chǔ)是,這個功能是不標準的。另外,功能來自strcat由于基于重新掃描的字符串連接的概念的可用性有限,所以在專業(yè)代碼中經(jīng)??床坏浇M。

至于這些功能如何導致安全問題.。它們根本不能導致安全問題,它們不能比C語言本身“導致安全問題”更大程度上導致安全問題。您知道,有相當一段時間,人們強烈認為C+語言必須朝著開發(fā)成某種奇怪的Java風格的方向發(fā)展。這種情緒有時也會蔓延到C語言領(lǐng)域,導致對C語言特性和C標準庫特性的無知和強制批評。我懷疑,在這種情況下,我們可能也在處理類似的事情,盡管我當然希望事情沒有那么糟糕。


查看完整回答
反對 回復 2019-06-28
?
ITMISS

TA貢獻1871條經(jīng)驗 獲得超8個贊

Ulrich的批評是基于這樣的觀點,即沒有被程序檢測到的字符串截斷會通過不正確的邏輯導致安全問題。因此,為了安全起見,您需要檢查截斷。要對字符串連接執(zhí)行此操作,就意味著要按照以下方式進行檢查:

if (destlen + sourcelen > dest_maxlen){
    /* Bug out */}

現(xiàn)在,strlcat有效地執(zhí)行此檢查,如果程序員記得檢查結(jié)果-所以能,會,可以安全使用:

if (strlcat(dest, source, dest_bufferlen) >= dest_bufferlen){
    /* Bug out */}

烏爾里希的觀點是既然你必須destlensourcelen(或重新計算它們,這就是strlcat),您最好使用更高效的memcpy總之:

if (destlen + sourcelen > dest_maxlen){
    goto error_out;}memcpy(dest + destlen, source, sourcelen + 1);destlen += sourcelen;

(在上述代碼中,dest_maxlen中存儲的字符串的最大長度。dest-比dest緩沖器。dest_bufferlendest buffer).


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關(guān)注
  • 1613 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號