青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Dict.CN 在線詞典, 英語學習, 在線翻譯

學海苦作舟,書山勤為徑

留下點回憶

常用鏈接

統計

積分與排名

Denoise

English study

Web技術

數據壓縮

一些連接

最新評論

Strlcpy和strlcat-一致的、安全的字符串復制和串接

?

概要:

時下緩沖區溢出攻擊已經增加,越來越多的程序員使用帶有 size 或長度邊界的字符串函數,例如: strncpy strncat 。這的確是一個趨勢,但標準的 C 字符串函數并不是真正為這些任務而設計的。本文描述一個專門設計用于安全字符串復制的可選的、直覺的和一致的 API

strncpy strncat 作為 strcpy strcat 安全版本有幾個問題。兩個函數都是以不同的和非直覺的方法來處理 NULL 結尾的和長度參數,即使有經驗的程序員都有時迷惑;而檢查什么時候發生截斷也是不容易的。最后, strncpy 0 來填充目標字符串剩余的部分,這是以損失性能為代價的。所有這些迷惑都是由長度參數引起的,空結束的要求也非常重要。當我們評估 OpenBSD 源樹的潛在安全漏洞的時候,我們發現大量濫用 strncpy strncat 。當然,并不是所有的都導致暴露的安全漏洞,上面的這些使說明了一點:使用 strncpy strncat 作為安全字符串操作容易被誤解。推薦使用的函數是 strlcpy strlcat ,通過為安全字符串設計的 API 來程序這些問題(見圖 1 的函數原型)。兩個函數都保證 NUL 結尾,長度參數是以字節記數的,并且提供了檢查截斷的方法,兩個函數都不是在目標字符串中填充 0

?

介紹

?

1996 年中,作者和其他 OpenBSD 項目的成員一起承擔了對 OpenBSD 源樹的評估,為了找出安全問題;以緩沖區溢出作為開始。緩沖區溢出最近在一些論壇(例如 BugTraq )大量關注,并且正被廣泛地開拓。我們發現大量的緩沖區溢出是由于較大的使用 sprintf strcpy strcat 進行的字符串復制;在循環中操作字符串而沒有明確地檢查循環變量的長度也是一個問題。另外,我們也發現許多程序員使用 strncpy strncat 來進程安全字符串操作但失敗的場景。

因此,在評估代碼的時候,我們發現不僅僅檢查 strcpy strcat 的不安全使用,同樣也要檢查 strncpy strncat 的不正確使用。檢查正確使用并不總是明顯地,特別在靜態變量和緩沖區或 calloc 分配的緩沖區,這些都容易被忽視。我們得到結論,一個安全的 strncpy strncat 是必要的,首先可以減輕程序員的工作;另外也可以是代碼評估更容易。

?

size_t strlcpy(char *dst, const char *src, size_t size);
size_t strlcat(char *dst, const char *src, size_t size);

Figure 1: ANSI C prototypes for strlcpy() and strlcat()

通常誤解

最通常的誤解是 strncpy 空結尾的目標字符串。然而,只有源符串的長度小于 size 參數才是正確的。當用戶輸入的任意長度字符串時候,可能有問題。這種情況下最安全方法是傳遞一個小于目標字符串的 size strncpy ,并且手動添加一個結束符號。這種方法下你可以總是保證目標字符穿是 NUL 結束的。嚴格地說,如果是一個靜態的字符串或一個 calloc 分配的字符串不必要手動添加一個結束符號;主要由于這些字符串在分配的時候是填充 0 的。然而這些特性時候比較迷惑的。

另外一個暗示的假定就是從 strcpy strcat 代碼轉換到 strncpy strncat 導致的性能下降是可以接受的。對于 strncat 來說是正確的,但同樣對于 strncpy 來說并不正確,由于 strncpy 將剩余的目標字節填充 0 ,這在字符串比較大的時候可能導致可觀的性能損失。確切的損失由 CPU 架構和實現的而決定。

最常見的錯誤是使用 strncat 和一個不正確的 size 參數。然而 strncat 保證目標字符串是 NULL 結尾的,你不需要在 size 參數中為 NUL 計算機空間。最重要的,這不是目標字符串自身的大小,而是可用空間的數量。因此這個值總是要計算,并且作為一個可靠的常量,它常常也不能正確計算。

為什么 strlcpy strlcat 能夠安全

?

這兩個函數提供了一個一致的、沒有二義性的 API 來幫助程序員寫比較防彈代碼。首先也是最重要的,兩個函數都能夠保證所有的目標字符串是 NUL 結尾的,給定的 size 0 ;其次,兩個函數都將目標字符串的整個 size 作為一個 size 參數。在大多數情況下,這個值比較容易在編譯期間使用 sizeof 操作符號來計算;最后,不管是 strlcpy 還是 strlcat 都不 0 填充他們的目標字符串(而是強迫 NUL 到字符串的結尾)。

Strlcpy strlcat 函數返回最終創建的字符串長度。對于 strlcpy 來說是源的長度,對于 strlcat 來說意味著目標的長度加源的長度。為了檢查截斷,程序員需要驗證返回值是否小于 size 參數。因此,如果發生截斷,可以發現已經存儲了多少個字節,并且程序員可以重新分配空間來重新復制字符串。返回值和 snprintf BSD 上的實現有相同的含義。如果沒有截斷發生,程序員現在有返回值長度的字符串;這是有用的,因為通常情況用 strncpy strncat 來構造字符串并且使用 strlen 來取得字符串的長度。使用 strlcpy strlcat strlen 就不需要了。

例子 1a 是潛在緩沖區溢出的例子( HOME 環境變量由用戶來控制可以是任意長度)。

strcpy(path, homedir);
strcat(path, "/");
strcat(path, ".foorc");
len = strlen(path);

Example 1a: Code fragment using strcpy() and strcat()

例子 1b 轉換到 strncpy strncat 的同樣代碼片段(注意,我必須自己添加字符串結束符號)。

strncpy(path, homedir,
sizeof(path) - 1);
path[sizeof(path) - 1] = '\?0';
strncat(path, "/",
sizeof(path) - strlen(path) - 1);
strncat(path, ".foorc",
sizeof(path) - strlen(path) - 1);
len = strlen(path);

Example 1b: Converted to strncpy() and strncat()

例子 1c 是到 strlcpy/strlcat 的變化,其有例子 1a 一樣簡單的好處,但卻沒有利用 API 的返回值:

strlcpy(path, homedir, sizeof(path));
strlcat(path, "/", sizeof(path));
strlcat(path, ".foorc", sizeof(path));
len = strlen(path);

Example 1c: Trivial conversion to strlcpy()/strlcat()

由于例子 1c 如此容易閱讀和理解,添加其他的檢查也是非常簡單,在例子 1d 中,我們檢查返回值來確保對于源字符串來說有足夠的空間。如果沒有,我們返回一個錯誤。這里稍微復雜一點,但它仍然很好,同時也避免了調用 strlen

len = strlcpy(path, homedir,sizeof(path);
if (len >= sizeof(path))
return (ENAMETOOLONG);
len = strlcat(path, "/",sizeof(path);
if (len >= sizeof(path))
return (ENAMETOOLONG);
len = strlcat(path, ".foorc",sizeof(path));
if (len >= sizeof(path))
return (ENAMETOOLONG);

Example 1d: Now with a check for truncation

?

設計決策

許多思想加入判斷 strlcpy strlcat 應該是什么語義。最初的想法是使 strlcpy strlcat strncpy strncat 相同,并且始終是 NUL 結束的目標字符串。然而,當我們回過來看常用(和誤用) strncat 說服我們 strlcat size 參數應該是字符串的所有大小而不僅僅是未分配的字符的數量。返回值開始作為復制字符串的數量,由于有復制和串聯的副作用。我們很快決定返回值應該與 sprintf 一樣,這樣程序可以比較彈性的處理截斷和恢復。

性能

當目標字符串的長度比源字符串明顯大很多的時候,程序員正在避免使用 strncpy ,主要由于其降低性能。例如, Apache 組用內部函數來代替 strncpy 并且注意到性能提升。同樣, ncurses 包最近刪除了 strncpy ,結果比 tic 實現提高了四倍。我們的希望是,將來更多的程序員使用 strlcpy 而不是自定義的接口。

為了對性能的降低有一個感覺,我們比較 strncpy strlcpy ,并且復制字符串 ’’ ;也就是復制 1000 次到 1024 字節的緩沖區中。這對 strncpy 有點不公平,由于使用了大的緩沖區和小的字符串,并且大緩沖區的時候, strncpy 不得不填充多余的緩沖為 NUL 字符。實際上,通常使用的緩沖區都比用戶輸入的大,例如,路徑名稱緩沖區是 MAXPATHLEN 長( 1024 ),但多數文件都比較短。表 1 中的平均運行時間在 HP9000/425t 25Mhz68040 CPU 運行 OPENBSD2.5 DEC AXPPCI166 166Mhz Alpha CPU 運行 OpenBSD 。所有的 case 都是相同 C 版本函數,時間由時間工具產生:

?cpu architecture?

?function?

?time (sec)?

m68k

strcpy

0.137

m68k

strncpy

0.464

m68k

strlcpy

0.14

alpha

strcpy

0.018

alpha

strncpy

0.10

alpha

strlcpy

0.02

1 :性能時間表

如我們在表 1 中看到的一樣, strncpy 的時間是最壞的。可能的原因不僅是 NUL 填充,也可能因為 CPU 數據緩沖區被長流 0flush 的原因。

?

什么時候不要 strlcpy strlcat

然而, strlcpy strlcat 處理固定大小的緩沖區很好,但他們不能在所有情況下代理 strncpy strncat 。有時候操作緩沖區并不是真正的 C 字符串(例如,結構體 utmp 中的字符串)時候就是必要的。然而,我們爭論的這樣假冒字符串不應該用在新的編碼中,由于他們可能被誤用,并且據我們的經驗,這也是 BUG 的根源。另外, strlcpy strlcat 函數并不是 C 里面修正字符串處理的嘗試,他們設計為來適應正常的 C 字符串框架。如果你需要字符串函數支持動態分配的、任意大小的緩沖區,你可能需要檢查 asstring 包,在 MIB 軟件中。

誰使用 strlcpy strlcat

Strlcpy strlcat 函數首先出現在 OpenBSD2.4 。這些函數最近被將來的 Solaris 版本中批準。第三方包也開始收集這些 API 。例如, rsync 包現在使用 strlcpy 并且提供它自己的版本如果 OS 不支持的話。其他的操作系統和應用程序將來使用 strlcpy strlcat 是我們的希望,并且它將某個時候接受標準。

下一步是什么?

Strlcpy strlcat 的源碼可以免費獲得,并且 BSD 風格的 license OpenBSD 操作系統的一部分。你可以通過匿名 ftp ftp.openbsd.org 下載代碼和相關的手冊;目錄為 /pub/OpenBSD/src/lib/libc/string strlcpy strlcat 的源碼在 strlcpy.c strlcat.c 中。也可以找到相應的文檔。

作者: Todd C. Miller

http://www.courtesan.com/todd/papers/strlcpy.html

posted on 2006-10-05 18:43 笨笨 閱讀(4203) 評論(0)  編輯 收藏 引用 所屬分類: Security

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区精品在线| 亚洲一级片在线观看| 蜜桃av综合| 亚洲欧美大片| 亚洲愉拍自拍另类高清精品| 在线一区欧美| 午夜精品久久久久久久白皮肤| 一本色道**综合亚洲精品蜜桃冫| 亚洲肉体裸体xxxx137| 老鸭窝毛片一区二区三区| 久久一区二区三区超碰国产精品| 亚洲伊人久久综合| 国产午夜精品全部视频播放| 国产一区欧美日韩| 91久久精品国产91性色tv| 亚洲理伦在线| 亚洲午夜成aⅴ人片| 性色av香蕉一区二区| 欧美在线视频免费观看| 久久国产精品第一页| 亚洲电影成人| 亚洲天堂成人在线观看| 久久久91精品国产一区二区三区| 久久精品国产91精品亚洲| 欧美福利专区| 国产欧美日本一区二区三区| 精品成人一区二区三区四区| 一区二区三区回区在观看免费视频| 亚洲色无码播放| 久久九九精品99国产精品| 欧美成人免费网| 亚洲影音一区| 久久综合给合久久狠狠色| 欧美日韩日本国产亚洲在线 | 久久精品视频免费| 欧美华人在线视频| 午夜免费在线观看精品视频| 麻豆国产精品一区二区三区| 国产精品资源| 亚洲第一网站| 亚洲久久一区二区| 米奇777在线欧美播放| 亚洲特色特黄| 欧美国产日韩一区二区| 国产欧美日韩精品专区| 中文在线资源观看网站视频免费不卡 | 亚洲一区黄色| 欧美国产日韩一区二区三区| 国产精品视频一二| 亚洲午夜精品福利| 最新国产の精品合集bt伙计| 新片速递亚洲合集欧美合集| 欧美三区在线| 这里只有视频精品| 亚洲激情综合| 欧美国产日韩a欧美在线观看| 黄色小说综合网站| 久久久亚洲一区| 亚洲免费在线观看| 国产精品欧美日韩一区| 亚洲一区二区三区精品在线| 亚洲人成小说网站色在线| 亚洲一区三区电影在线观看| 亚洲免费视频一区二区| 制服丝袜激情欧洲亚洲| 亚洲日本中文字幕区| 欧美在线啊v| 亚洲自拍啪啪| 欧美日韩日日夜夜| 亚洲人成高清| 9l国产精品久久久久麻豆| 欧美日韩中文字幕| 欧美激情成人在线视频| 国产精品久久9| 99国产精品99久久久久久粉嫩| 久久婷婷成人综合色| 午夜精品视频一区| 国产亚洲精品aa午夜观看| 久久精品理论片| 久久www成人_看片免费不卡| 狠狠色伊人亚洲综合成人| 久久久亚洲人| 免费在线欧美黄色| 亚洲精品国久久99热| 亚洲人成高清| 欧美日韩免费一区二区三区视频| 一区二区三区www| 亚洲理论在线| 亚洲视频国产视频| 狠狠色丁香久久婷婷综合_中| 久久综合中文| 欧美日本韩国一区| 性欧美超级视频| 欧美亚洲一区二区在线| 伊人精品视频| 一本色道婷婷久久欧美| 狠狠干综合网| 一个人看的www久久| 国内偷自视频区视频综合| 亚洲国产精品久久| 国产精品久久久久毛片软件 | 午夜精品久久久久久久久| 亚洲欧美视频在线观看视频| 久久国产精品久久久| 国产精品一二一区| 牛牛国产精品| 欧美日韩在线大尺度| 久久在线精品| 亚洲最新在线视频| 另类图片国产| 欧美高清视频在线观看| 亚洲国产乱码最新视频| 亚洲一区激情| 久久精品人人做人人爽| 国产精品欧美在线| 欧美一区二区三区视频免费播放| 欧美在线亚洲一区| 国产欧美一区二区精品性| 国产伦精品一区二区三区高清| 免费观看一级特黄欧美大片| 一本色道婷婷久久欧美| 欧美制服第一页| 玖玖视频精品| 国产啪精品视频| 亚洲理伦在线| 亚洲激情婷婷| 久久本道综合色狠狠五月| 一本大道久久精品懂色aⅴ| 亚洲午夜国产成人av电影男同| 91久久久久久国产精品| 久久精品免费看| 久久精品青青大伊人av| 国产精品私人影院| 亚洲伦理在线观看| 亚洲国产乱码最新视频| 性高湖久久久久久久久| 亚洲视频福利| 欧美日韩视频在线| 亚洲国产欧美不卡在线观看| 国精产品99永久一区一区| 亚洲女爱视频在线| 欧美在线高清| 国产麻豆视频精品| 亚洲欧美美女| 久久精品日韩欧美| 国产精品自在欧美一区| 亚洲欧美自拍偷拍| 久久成人国产| 国产精品自拍一区| 久久精品1区| 久久午夜精品| 精品av久久707| 欧美在线播放高清精品| 久久另类ts人妖一区二区| 欧美视频日韩视频在线观看| 欧美在线免费视屏| 国产一区欧美日韩| 久久久久久久久久久久久久一区| 久久中文精品| 亚洲人午夜精品| 欧美视频在线一区二区三区| 亚洲免费视频网站| 国产日韩欧美另类| 亚洲二区三区四区| 亚洲一区欧美| 久久久久久午夜| 欧美黄色一级视频| 亚洲综合清纯丝袜自拍| 久久久精品免费视频| 欧美激情精品久久久久久黑人| 欧美系列一区| 亚洲乱码一区二区| 久久久精品一品道一区| 亚洲电影av在线| 国产精品三级视频| 久久人人看视频| 日韩一区二区精品葵司在线| 欧美在线视频网站| 亚洲人成在线观看网站高清| 欧美午夜精品理论片a级按摩| 午夜精品亚洲| 久热成人在线视频| 欧美国产三区| 亚洲激情视频在线| 国产精品va在线播放| 欧美一区亚洲一区| 亚洲精品乱码久久久久| 久久精品国产成人| 99视频精品| 悠悠资源网亚洲青| 国产精品你懂的在线欣赏| 久久综合一区| 亚洲一区免费观看| 亚洲激情社区| 欧美aⅴ99久久黑人专区| 西瓜成人精品人成网站| av成人毛片| 在线看一区二区| 欧美日韩日本国产亚洲在线| 久久精品国产v日韩v亚洲|