Strsafe h 更安全的C語言字串處理函式

2022-06-23 07:27:10 字數 2126 閱讀 4950

原文出處:strsafe.h: safer string handling in c

在微軟公司舉行的microsoft windows security push 活動期間,一批測試者、程式管理經理和普通程式設計師共同決定要為 c 語言量身定製一套具有較高安全性的字串處理函式,並且希望這些函式能被 windows 程式設計師和微軟公司內部的程式設計師所採用。

簡單說來,現有的 c 語言執行時函式實在難以在當今充斥著惡意攻擊企圖的大環境下立足。這些函式要麼在返回值和引數上缺乏一致性,要麼隱含著所謂的「截斷誤差」(truncation errors) 錯誤,要麼無法提供足夠強大的功能。坦言之,呼叫這些函式的**太容易產生「記憶體溢位」問題了。

我們發現,面向 c++ 程式設計師的類足以應付各種安全處理字串的程式設計需要;他們能夠選擇 mfc 的cstring 類、atl 的ccombstr 類 或者stl 的string 類,等等。然而,經典的 c 語言程式仍然普遍地存在,何況許多人正在把 c++ 當作 「改良的 c 語言」 來用,卻把豐富的 c++ 類束之高閣。

其實只需要新增一行**,你就能在 c 語言**中呼叫安全性良好的 strsafe 系列函式了,詳細請參閱:

《using the strsafe.h functions》

這些新函式包含在乙個標頭檔案和乙個函式庫(可選)中,而後兩者能在新版的 platform sdk 中找到。對,就這麼簡單:

#include "strsafe.h"
還等什麼呢!

再強調一次,對 strsafe 函式庫的引用是可選的。

為了實現 strsafe 系列函式的目標,你的**必須滿足下列條件:

我們覺得,缺乏統一性是導致現有許多 c 語言字串處理函式容易產生安全漏洞的根本原因,而 strsafe 系列函式所帶來的高度統一性恰恰是解決此問題的一劑良藥。然而,strsafe 也不是萬能藥。單純依靠 strsafe 系列函式並不能保證**的安全性和堅固性——你還必須開動你的大腦才行——然而這樣對解決問題還是大有幫助的!

下面給出一段採用經典 c 語言執行時間函式的**:

void unsafefunc(lptstr szpath,dword cchpath)
以上**中的 bug 隨處可見 —— 它沒有檢查任何乙個返回值,而且在對 strncat 函式的呼叫中也沒有正確地使用 cchpath (因為max_path 中儲存的是目標緩衝區內剩餘空間的長度,而不是目標緩衝區的總長度)。於是,「記憶體溢位」 問題將會快找上門來。然而,象這樣的**片段早已氾濫成災了。如果改用 strsafe 系列函式,那麼以上**應該變成:

bool saferfunc(lptstr szpath,dword cchpath) 

return false;

}

這段**不但檢查了每乙個返回值,還保證了適時傳入同一目標緩衝區的總長度。你還可以採用 ex 版本的 strsafe 系列函式來實現更加高階的功能,比如:

如此改進後的**效能又如何呢?告訴你乙個好訊息:它與原先的**在效能上幾乎沒有差別。我曾在自己的 1.8 ghz 電腦上測試過混用經典 c 語言中各種字串連線函式的**、混用 strsafe 系列中各種字串連線函式的**和混用 ex 版本 strsafe 系列中各種字串連線函式的**。它們各自獨立執行一百萬次(沒錯,就是 10,000,000 次)所消耗的時間分別為:

在測試中,呼叫 ex 版本的 strsafe 系列函式的程式會在呼叫失敗時把緩衝區設為 null ,並以 0xfe 作為填充位元組,**如下:

dword dwflags = strsafe_null_on_failure | strsafe_fill_byte(0xfe);
其中設定填充位元組的**耗時較多。事實上,如果這裡僅僅把緩衝區設定為 null 的話,則採用 ex 版本的 strsafe 系列函式的**將會與採用普通的 strsafe 系列函式的**耗時相同。

由此可見,以上三種方案的效能差異極小。我相信你也不會經常在乙個程式中數百萬次地反覆執行包含大量字串處理函式的**吧!

還有一點值得引起注意:當你引用 strsafe 系列函式時,原有的 c 語言字串處理函式都將被自動進行 #undef 處理。這也沒問題,因為除錯過程中的出錯資訊將會告訴你哪些函式已經被相應的 strsafe 系列函式取代了。好了,請放心地使用 strsafe.h 吧!更多相關資訊請參閱 《using the strsafe.h functions》。

只為更快 更省 更安全的 Azure CDN

經過最近一次更新,azure cdn 高階版服務 https ssl 證書的申請方式有所改進啦,除了現有的 azure cdn 代為申請證書外,還支援使用者自己申請的證書。同時自 2017 年 5 月 1 日起,azure cdn 高階版服務降價了哦,使用高階版的小夥伴們能夠更節省地使用了 急性子想...

使用更安全的HTTP HTTPS

http 主要有這些不足 為了統一解決上述這些問題,需要在 http 上再加入加密處理和認證等機制。我們把新增了加密及認證機制的 http 稱為 https http secure 通常,http 直接和 tcp 通訊。當使用 https 時,則演變http成先和 ssl 通訊,再由 ssl 和 t...

C語言基礎(第四更)

指標是一塊記憶體的位址,常用於函式改變實參以及鍊錶中 指標的使用比較靈活 示例 include intmain 有時程式中會使用一些資料來表示乙個物體的屬性,這個時候再用普通的變數就不再方便 include struct x x是結構體型別,a,b是x型別結構體的屬性 鍊錶中屬性可以使任意型別甚至新...