C語言程式設計中常見的漏洞原因

2021-07-25 04:03:51 字數 967 閱讀 6122

gets()函式不檢查緩衝長度,可能導致漏洞。呼叫函式gets(buffer),會把使用者輸入的內容放在buffer中,但是對這個內容沒有檢查長度。如果使用者輸入內容過長,就會覆蓋在buffer之後定義的變數,也就是說使用者可以隨意更改一些程式中的變數。

那麼應該怎麼用才安全呢?使用fgets()函式更好一些。首先你要用malloc為buffer分配一部分固定的空間,然後呼叫fgets的時候傳遞進去預計長度的值,這樣就不會造成溢位了。

這個家族有三個函式:strcpy、strcat和strcmp,都有溢位問題,因為不檢查長度。一種對應方法就是,在使用這些函式前加入檢查長度的語句。還有一種方法是使用strncpy、strncat和strncmp,是會檢查長度的版本,不過這種方法的問題是,如果擷取了長度,不能保證字串以』\0』結尾,所以可能需要新增一些**判斷一下。

這個函式的問題也是不檢查長度。使用snprintf更好一些。這個函式不僅能夠避免緩衝區溢位(檢查長度),還可以返回傳遞字串的長度,以供判斷是否需要處理擷取後的』\0』結尾問題。

這一類的漏洞與字串格式攻擊相關,也就是我們常說的利用格式化字串漏洞進行攻擊。這種攻擊通常會導致資訊洩露、覆蓋記憶體(%n)等等。這個漏洞可以被以下函式觸發:printf, fprintf, sprintf以及snprintf。這些函式的共同特點就是,都以格式化的字串作為引數,即百分號之後的格式約定。

這種漏洞的應對方式就是,記住一定要硬編碼格式化字串。

開啟檔案的時候要特別小心。檔案處理可能有多種被攻擊的方法,這裡只介紹幾個例子。

一般來說我們在開啟檔案之前都會先確認檔案是否存在,但是攻擊者可能會建立乙個檔案(甚至只是建立了乙個重要系統檔案的符號化鏈結),在你的檢查和實際使用檔案之間的時候。open函式比fopen要更安全一些。在開啟檔案前,unlink檔案以消除符號化鏈結。先用open函式生成乙個檔案描述符fd,如果fd為-1則開啟檔案失敗。然後再用fdopen來開啟這個檔案描述符所指的檔案,如果之前有符號化鏈結,那麼因為被消除,這個檔案就不能開啟。

C 中常見的程式設計錯誤

1 嘗試修改字串常量 char p i m hungry p 0 s 答案與分析 上面的 能成功通過編譯,但會產生執行時的錯誤即造成記憶體的非法寫操作。i m hungry 實質上是字串常量,而常量往往被編譯器放在唯讀的記憶體區,不可寫。p初始指向這個唯讀的記憶體區,而p 0 i 則企圖去寫這個地方...

C語言中常見錯誤

c語言的最大特點是 功能強 使用方便靈活。c編譯的程式對語法檢查並不象其它高階語言那麼嚴格,這就給程式設計人員留下 靈活的餘地 但還是由於這個靈活給程式的除錯帶來了許多不便,尤其對初學c語言的人來說,經常會出一些連自己都不知道錯在 的錯誤。看著有錯的程式,不知該如何改起,本人通過對c的學習,積累了一...

KEIL程式設計中常見的警告

keil程式設計中常見的警告 1 warning l16 uncalled segment,ignored for overlay process 這句話直譯就是 未呼叫段,忽略覆蓋過程 意思就是說 中有乙個函式,你定義了,卻沒有呼叫,圖示 裡沒有被呼叫的函式名字即第二行顯示的lcd dat 消除方...