用C語言寫的程式不安全
關於C語言記憶體管理薄弱的問題幾年前我們就討論過。有人試圖反駁,說現代各種作業系統或runtime平臺的進步,對記憶體管理的風險提供了各種保護,比如地址空間隨機化,還有各種諸如Valgrind這樣的工具可以發現記憶體訪問bug,大大削弱危險程度。我十分推薦大家重新閱讀一下那次討論。
我的觀點——當時和現在——都是C語言不適合用來寫安全性要求高的程式,任何缺乏記憶體檢查機制的程式語言都不適合。很簡單,就是不適合。它們應該僅限於用來寫一些小的核心繫統,最好是小到可以用一些常規的方法(被證明的方法)進行檢查,所有其它的,包括全部應用邏輯,都應該用受控程式碼實現(例如C#,Java或其它的,我沒有偏向)。
心臟出血就是這種缺乏邊界檢查造成的結果的另一個例子。它無法被Valgrind這樣的工具檢查出,因為它不是普通的被觸發的動作——它需要是一種惡意的行為或是一種足夠智慧的測試協議才能發現(很難很難)。
事實上,沒有哪個程式設計師能夠聰明到可以寫出完全避免心臟出血這樣的bug的程式。畢竟,程式設計師的學習和編碼關注的是他們的程式的邏輯。在沒有邊界檢查機制的程式語言裡,邏輯可能會走錯路,因為計算機可以訪問和執行任意記憶體內容,這些內容是和你的程式裡的程式碼和變數是沒關係的。所有沒有邊界檢查的程式語言將計算機的多個維度暴露給程式,如果你覺得自己比OpenSSL開發團隊強、能很好的處理這種情況,那是自欺欺人。
我們無法在軟體中避免bug的存在,但我們可以堵住這些看起來無窮無盡的bug的源頭。因為它,很早之前我們的網際網路就遭受了Morris蠕蟲病毒的危害。現在,2年的時間裡,世界70%的網際網路流量都暴露無疑,代價慘重。如果不堵住這源頭,以後會讓我們損失更多。
英文原文:The Heartbleed Bug
相關文章
- 用C語言編寫windows服務程式C語言Windows
- 用C語言編寫Linux實用程式的藝術(轉)C語言Linux
- 用C語言寫strcat、strcpy、strlen、strcmpC語言
- 現代程式語言用什麼語言寫成?
- 用C語言編寫的公式計算器C語言公式
- C語言程式書寫規範 (轉)C語言
- 用 PHP 寫一個"程式語言"PHP
- 如果用程式語言來寫作文
- 讀寫硬碟扇區的C語言程式 (轉)硬碟C語言
- 用 C 語言編寫多程式 Web 伺服器【粗暴版】Web伺服器
- 快速排序用C語言可以這麼寫排序C語言
- 用C++語言寫遊戲——蟲戰世界C++遊戲
- 用C++語言寫遊戲——打怪小遊戲C++遊戲
- 聊聊C語言/C++—程式和程式語言C語言C++
- 使用C語言編寫貪食蛇程式原始碼C語言原始碼
- 用19種程式語言寫Hello World
- 「趣圖」這是用 e 語言寫的 C++ 程式碼,客官請慢用C++
- C語言程式C語言
- 用C語言編寫小遊戲——“井字棋”C語言遊戲
- 用 C 語言寫一個簡單的 Unix Shell(1)
- 用 C 語言寫一個簡單的 Unix Shell(2)
- C語言中如何寫斷言C語言
- 用 C 語言編寫一個簡單的垃圾回收器
- C語言爬蟲程式編寫的爬取APP通用模板C語言爬蟲APP
- C語言:一種高效、易學的程式語言C語言
- 奇怪的C語言——C51程式設計C語言注意事項C語言程式設計
- C語言 編寫線段樹C語言
- 自己用C語言寫的一個模擬退火演算法C語言演算法
- 那些主流程式語言的知識,C語言(Ⅰ)C語言
- c語言程式環境C語言
- C語言程式設計C語言程式設計
- C51-------時鐘程式(C語言編寫的微控制器時鐘)C語言
- Matlab與C語言程式的應用程式設計介面(轉)MatlabC語言程式設計
- 幽默:儘量用領域語言編寫程式碼
- 用“Whitespace”程式語言編寫無字天書
- 人人都可以用C語言寫推箱子小遊戲C語言遊戲
- C語言用三目運算實現判斷大寫C語言
- 用 C 語言寫面向的物件是一種什麼樣的體驗物件