防禦性程式設計(defensive programming)與安全程式設計(secure programming)

Defensive

找資料的時候剛好看到這篇:What is the different between if (‘value’ == $var) and if ($var == ‘value’) in PHP?

if ('value' === $var)

if ($var === 'value')

主要在問說上面兩個 PHP 的判斷式裡面,將常數與變數分別放在三個(或兩個)等號的前或後的差別:

基本上是沒差別的 XD

但是回答內有人提出了「防禦性程式設計(defensive programming)」這個概念,而這種寫法單純只是防禦性程式設計的其中一個方式。例如:

if ($var = 0) {
  // 判斷式少了一個等號,導致程式流程非預期
}

if (0 = $var) {
  // 語法錯誤
}

如果把變數放在後面時,如果不小心把判斷式中比較語法的兩個等號只寫了一個等號變成賦予數值時,「’value’ = $var」會在 parse 語法時就會出錯,可以讓開發者更容易發現有問題的語法,不會找半天找不到問題。

另外像是在 if – else if – else if 語法裡面,無論無和都要加上 else 區塊,避免有例外狀況導致整個區塊被跳過而沒被處理到,或是 switch – case 語法中,一定要加上 default,避免意外的 case 出現。

而類似的方式如「安全程式設計(secure programming)」,概念類似,最常見的例子像是 C 語言中,使用 strncpy 搭配結尾的 ‘\0’ 字元來取代 strcpy,避免 char array 使用到超過預期的記憶體空間,導致程式出現緩衝區溢位攻擊的漏洞。

另外程式在處理外來輸入的資料時(對外公開的 API、網頁輸入等),不可以相信任何外來的輸入,因此也需要及早檢查資料,降低往後程式執行時出錯的機率,最好的方式就是在外來資料一進入程式的當下就檢查、過濾,確認沒問題後才繼續交給後續的程式使用,而往後程式內部在執行時,也就不需要再花時間去重複檢查資料,降低系統消耗。

參考:Defensive Programming in PHP

圖片來源:Sharon Sinclair

Leave a Reply

Your email address will not be published. Required fields are marked *