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