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

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 笨笨 閱讀(4206) 評論(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>
            亚洲作爱视频| 国产热re99久久6国产精品| 在线视频精品| 久久亚洲精品视频| 香蕉久久夜色| 欧美午夜欧美| 亚洲精品在线免费| 在线观看欧美视频| 欧美一级久久久| 午夜精品视频在线观看| 欧美日韩国产精品成人| 欧美**人妖| 在线精品国产欧美| 久久国产成人| 久久国产精品免费一区| 国产精品国产一区二区| 日韩网站免费观看| 日韩视频永久免费| 欧美激情国产日韩| 欧美激情精品久久久久久蜜臀| 红桃视频一区| 久久久久国产精品人| 久久国产精品色婷婷| 国产日产欧产精品推荐色| 亚洲小视频在线观看| 午夜精品久久99蜜桃的功能介绍| 欧美日韩卡一卡二| 一本色道久久综合| 一区二区三区四区国产| 欧美日韩午夜激情| 亚洲先锋成人| 久久久久久日产精品| 国产日韩欧美综合| 久久久久久久尹人综合网亚洲| 免费影视亚洲| 亚洲精品裸体| 欧美日韩亚洲系列| 亚洲一区网站| 老司机精品久久| 亚洲人成在线观看网站高清| 欧美激情精品久久久久久蜜臀| 亚洲精品免费在线播放| 日韩亚洲欧美在线观看| 欧美网站大全在线观看| 亚洲一区日韩| 免费观看日韩av| 亚洲精品一区在线| 欧美手机在线| 久久av一区二区三区漫画| 欧美大片在线看免费观看| 99视频一区二区| 国产欧美一区二区精品忘忧草 | 一本大道久久精品懂色aⅴ| 亚洲视频一区在线观看| 国产日韩成人精品| 免费久久99精品国产自| 一区二区免费在线视频| 久久久久久日产精品| 亚洲人精品午夜| 国产精品毛片一区二区三区| 久久久人成影片一区二区三区观看| 91久久极品少妇xxxxⅹ软件| 午夜激情亚洲| 亚洲国内自拍| 国产美女精品视频免费观看| 老妇喷水一区二区三区| 亚洲视频免费在线| 欧美激情视频给我| 亚洲综合电影| 亚洲理论在线观看| 国模叶桐国产精品一区| 欧美喷潮久久久xxxxx| 欧美在线视频免费观看| 日韩午夜av在线| 欧美成人午夜激情在线| 午夜亚洲福利| 一区二区日韩精品| 在线日韩成人| 国产日韩欧美电影在线观看| 欧美日韩美女一区二区| 巨胸喷奶水www久久久免费动漫| 亚洲一区二区三区四区中文| 欧美黑人多人双交| 久久人人爽人人爽| 欧美一区二区在线免费观看| 在线亚洲精品| 日韩视频在线播放| 亚洲观看高清完整版在线观看| 国产欧美一区二区精品性色| 欧美视频日韩视频| 欧美日本免费| 欧美大片免费看| 麻豆精品视频在线观看| 欧美一区影院| 欧美一区综合| 久久av最新网址| 小辣椒精品导航| 亚洲综合精品四区| 亚洲视频欧洲视频| 夜夜嗨一区二区| 一区二区av| 亚洲最新视频在线| 一本色道久久综合亚洲精品不| 亚洲国产成人av| 亚洲国产欧美国产综合一区 | 久久国产精品亚洲va麻豆| 亚洲一区二区三区高清不卡| 亚洲深夜影院| 亚洲一级网站| 亚洲欧美三级在线| 亚洲欧美乱综合| 欧美一区二区三区视频免费| 欧美一区二区精品久久911| 午夜视频在线观看一区| 性做久久久久久久久| 欧美影院精品一区| 久久久久久久91| 久久综合色天天久久综合图片| 美女主播精品视频一二三四| 免费成人高清视频| 亚洲风情亚aⅴ在线发布| 最近看过的日韩成人| 亚洲开发第一视频在线播放| 一区二区三区国产在线| 亚洲欧美久久| 久久午夜影视| 欧美精品三级在线观看| 欧美网站在线观看| 国产真实精品久久二三区| 在线成人小视频| 99精品欧美一区| 午夜精品久久久99热福利| 久久免费精品日本久久中文字幕| 欧美va亚洲va日韩∨a综合色| 亚洲欧洲一区二区三区久久| 亚洲一区二区少妇| 久久久久国产免费免费| 欧美日韩1区2区| 国产午夜精品理论片a级大结局 | 亚洲免费av网站| 亚洲专区在线视频| 久久天堂成人| 欧美视频中文字幕| 黄色一区三区| 宅男精品导航| 鲁大师影院一区二区三区| 亚洲欧洲日本专区| 欧美一区二区三区播放老司机 | 亚洲影院一区| 蜜臀久久久99精品久久久久久| 亚洲国产精品一区在线观看不卡 | 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲国产另类久久久精品极度| 在线一区亚洲| 老司机一区二区三区| 国产精品久久久久免费a∨大胸| 极品少妇一区二区| 亚洲永久免费观看| 欧美国产成人在线| 午夜精品999| 欧美日本高清一区| 黄色亚洲免费| 小黄鸭精品aⅴ导航网站入口| 亚洲大片在线观看| 久久激情婷婷| 国产精品成人一区二区艾草| 亚洲美女精品久久| 免费久久精品视频| 午夜视频久久久| 国产精品igao视频网网址不卡日韩| 极品少妇一区二区三区| 性亚洲最疯狂xxxx高清| 亚洲精品乱码久久久久久| 久久一区二区精品| 激情久久影院| 久久精品最新地址| 99国产精品久久久久久久| 欧美高清视频在线| 亚洲国产第一| 欧美高清在线播放| 久久久亚洲精品一区二区三区 | 国产精品久久久久久影视| 亚洲精品美女久久久久| 免费日韩精品中文字幕视频在线| 欧美亚洲免费| 国产乱肥老妇国产一区二| 亚洲手机视频| 国产精品99久久99久久久二8 | 亚洲在线一区二区| 欧美三级资源在线| aaa亚洲精品一二三区| 亚洲国产日韩一级| 欧美激情国产高清| 99精品国产在热久久下载| 亚洲国产欧美一区二区三区丁香婷| 免费看的黄色欧美网站| 亚洲国产精品激情在线观看| 欧美福利视频| 欧美激情日韩| 亚洲综合色噜噜狠狠|