安全字串處理函式

pamxy發表於2013-04-10

轉自:http://blog.csdn.net/zhang1chao5/article/details/7329830

緩衝區溢位錯誤(這是處理字串時的典型錯誤)已成為針對應用程式乃至作業系統的各個元件發起安全攻擊的媒介。,所以Microsoft在C執行庫中新增了很多安全函式。我們應該儘量使用這些新函式來防止應用程式在處理字串的時候發生的緩衝區溢位。

建議使用Unicode字串,而且始終應該通過新的安全字串函式來處理這些字串。

一、新的安全字串函式

C中的所有字串處理函式,都對應一個新版本的函式,前面名稱相同,但是最後新增了一個字尾 _s (代表secure)。如:

PTSTR _tcscpy (PTSTR strDestination, PCTSTR strSource ) ; //這是C執行庫現有的字串函式

errno_t _tcscpy_s(PTSTR strDestination, size_t numberOfCharacters ,PCTSTR strSource ) ;//新增安全函式

還有memcpy_s,memmove_s,wmencpy,wmemove_s等函式

這類函式檢查的專案有 1、指標不為空

2、整數在有效範圍內

3、列舉值是有效地

4、緩衝區足以容納結果資料

如果這些檢查中有一項失敗,函式就會設定區域性與執行緒的C執行時變數errno,然後返回一個errno_t值來指出成功或是失敗。然而,這些函式並不實際返回(如果有自己的處理函式是可以返回的,見上篇博文)。如果是debug build,則會呼叫 Debug Assertion Failed,然後終止應用程式(即利用斷言),如果是release build,程式自動終止。

C執行時實際允許我們自己提供處理函式。見上一篇博文

二、有更多控制力的處理函式

在Microsoft的StrSafe.h檔案中定義新的安全字串函式,除了新的安全字串函式,還新增了一些函式,用於在執行字串處理時提供更多的控制。可以控制填充符,或者指定如何進行截斷

下面為部分原型:常用的

HRESULT StringCchCat( PTSTR pszDest, size_t cchDest, PCTSTR pszSrc) ;

HRESULT StringCchCatEx( PTSTR pszDest, size_t cchDest, PCTSTR pszSrc,

PTSTR*ppszDestEnd, size_t *pcchRemaining, DWORD dwFlags );

還有 StringCchCpy

StringCchCpyEx

StringCchPrintf

StringCchPrintfEx等

可以看出 含有“Cch”,這表示count of characters字元數,通常用_countof巨集來獲取。

還有含有“Cb”,如StringCbCat(Ex),StringCbCopy(Ex),StringCbPrintf(Ex) 這些函式指定的是位元組數(轉者注:count of bytes)

通常使用sizeof操作符來獲取此值

這些函式都返回HRESULT不同於安全函式(帶_S字尾的),當緩衝區太小的時候,這些函式會執行截斷

詳情請見MSDN

三、windows字串函式

windows也提供了各種字串處理函式。

例如我們經常比較字串以進行相等性測試或是排序,為此,最理想的函式是

CompareString(Ex)和 CompareStringOrdinal

第一個函式功能大用法比較複雜,對於這兩個函式的用法,請見MSDN

注:只支援unicode


相關文章