原則:
1.2.1. 深度防范
深度防范原則是安全專業人員人人皆知的原則,它說明了冗余安全措施的價值,這是被歷史所證明的。
深度防范原則可以延伸到其它領域,不僅僅是局限於編程領域。使用過備份傘的跳傘隊員可以證明有冗余安全措施是多麼的有價值,盡管大家永遠不希望主傘失效。一個冗余的安全措施可以在主安全措施失效的潛在的起到重大作用。
回到編程領域,堅持深度防范原則要求您時刻有一個備份方案。如果一個安全措施失效了,必須有另外一個提供一些保護。例如,在用戶進行重要操作前進行重新用戶認證就是一個很好的習慣,盡管你的用戶認證邏輯裡面沒有已知缺陷。如果一個未認證用戶通過某種方法偽裝成另一個用戶,提示錄入密碼可以潛在地避免未認證(未驗證)用戶進行一些關鍵操作。
盡管深度防范是一個合理的原則,但是過度地增加安全措施只能增加成本和降低價值。
1.2.2. 最小權限
我過去有一輛汽車有一個傭人鑰匙。這個鑰匙只能用來點火,所以它不能打開車門、控制台、後備箱,它只能用來啟動汽車。我可以把它給泊車員(或把它留在點火器上),我確認這個鑰匙不能用於其它目的。
把一個不能打開控制台或後備箱的鑰匙給泊車員是有道理的,畢竟,你可能想在這些地方保存貴重物品。但我覺得沒有道理的是為什麼它不能開車門。當然,這是因為我的觀點是在於權限的收回。我是在想為什麼泊車員被取消了開車門的權限。在編程中,這是一個很不好的觀點。相反地,你應該考慮什麼權限是必須的,只能給予每個人完成他本職工作所必須的盡量少的權限。
一個為什麼傭人鑰匙不能打開車門的理由是這個鑰匙可以被復制,而這個復制的鑰匙在將來可能被用於偷車。這個情況聽起來不太可能發生,但這個例子說明了不必要的授權會加大你的風險,即使是增加了很小權限也會如此。風險最小化是安全程序開發的主要組成部分。
你無需去考慮一項權限被濫用的所有方法。事實上,你要預測每一個潛在攻擊者的動作是幾乎不可能的。
1.2.3. 簡單就是美
復雜滋生錯誤,錯誤能導致安全漏洞。這個簡單的事實說明了為什麼簡單對於一個安全的應用來說是多麼重要。沒有必要的復雜與沒有必要的風險一樣糟糕。
例如,下面的代碼摘自一個最近的安全漏洞通告:
CODE:
<?php
$search = (isset($_GET['search']) ? $_GET['search'] : '');
?>
這個流程會混淆$search變量受污染*的事實,特別是對於缺乏經驗的開發者而言。上面語句等價於下面的程序:
CODE:
<?php
$search = '';
if (isset($_GET['search'])){
$search = $_GET['search'];
}
?>
上面的兩個處理流程是完全相同的。現在請注意一下下面的語句:
$search = $_GET['search'];
使用這一語句,在不影響流程的情況下,保證了$search變量的狀態維持原樣,同時還可以看出它是否受污染。
* 譯注:受污染變量,即在程序執行過程中,該變量的值不是由賦值語句直接指定值,而是來自其它來源,如控制台錄入、數據庫等。