PHP安全編程:網站安全設計的一些原則(轉)

深度防範

深度防範原則是安全專業人員人人皆知的原則,它說明了冗餘安全措施的價值,這是被歷史所證實的。php

深度防範原則能夠延伸到其它領域,不只僅是侷限於編程領域。使用過備份傘的跳傘隊員能夠證實有冗餘安全措施是多麼的有價值,儘管你們永遠不但願主傘失效。一個冗餘的安全措施能夠在主安全措施失效的潛在的起到重大做用。數據庫

回到編程領域,堅持深度防範原則要求您時刻有一個備份方案。若是一個安全措施失效了,必須有另一個提供一些保護。例如,在用戶進行重要操做前進行從新用戶認證就是一個很好的習慣,儘管你的用戶認證邏輯裏面沒有已知缺陷。若是一個未認證用戶經過某種方法假裝成另外一個用戶,提示錄入密碼能夠潛在地避免未認證(未驗證)用戶進行一些關鍵操做。編程

儘管深度防範是一個合理的原則,可是過分地增長安全措施只能增長成本和下降價值。瀏覽器

最小權限

我過去有一輛汽車有一個傭人鑰匙。這個鑰匙只能用來點火,因此它不能打開車門、控制檯、後備箱,它只能用來啓動汽車。我能夠把它給泊車員(或把它留在點火器上),我確認這個鑰匙不能用於其它目的。安全

把一個不能打開控制檯或後備箱的鑰匙給泊車員是有道理的,畢竟,你可能想在這些地方保存貴重物品。但我以爲沒有道理的是爲何它不能開車門。固然,這是由於個人觀點是在於權限的收回。我是在想爲何泊車員被取消了開車門的權限。在編程中,這是一個很很差的觀點。相反地,你應該考慮什麼權限是必須的,只能給予每一個人完成他本職工做所必須的儘可能少的權限。服務器

一個爲何傭人鑰匙不能打開車門的理由是這個鑰匙能夠被複制,而這個複製的鑰匙在未來可能被用於偷車。這個狀況聽起來不太可能發生,但這個例子說明了沒必要要的受權會加大你的風險,即便是增長了很小權限也會如此。風險最小化是安全程序開發的主要組成部分。網絡

你無需去考慮一項權限被濫用的全部方法。事實上,你要預測每個潛在攻擊者的動做是幾乎不可能的。spa

簡單就是美

複雜滋生錯誤,錯誤能致使安全漏洞。這個簡單的事實說明了爲何簡單對於一個安全的應用來講是多麼重要。沒有必要的複雜與沒有必要的風險同樣糟糕。.net

例如,下面的代碼摘自一個最近的安全漏洞通告:code

1 <?php
2       
3     $search = (isset($_GET['search']) ? $_GET['search'] : '');
4   
5 ?>

這個流程會混淆$search變量受污染*的事實,特別是對於缺少經驗的開發者而言(注:受污染變量,即在程序執行過程當中,該變量的值不是由賦值語句直接指定值,而是來自其它來源,如控制檯錄入、數據庫等。)。上面語句等價於下面的程序:

01 <?php
02   
03   $search '';
04   
05   if (isset($_GET['search']))
06   {
07         $search $_GET['search'];
08   }
09   
10 ?>

上面的兩個處理流程是徹底相同的。如今請注意一下下面的語句:

1 $search $_GET['search'];

使用這一語句,在不影響流程的狀況下,保證了$search變量的狀態維持原樣,同時還能夠看出它是否受污染。

暴露最小化

PHP應用程序須要在PHP與外部數據源間進行頻繁通訊。主要的外部數據源是客戶端瀏覽器和數據庫。若是你正確的跟蹤數據,你能夠肯定哪些數據被暴露了。Internet是最主要的暴露源,這是由於它是一個很是公共的網絡,您必須時刻當心防止數據被暴露在Internet上。

數據暴露不必定就意味着安全風險。但是數據暴露必須儘可能最小化。例如,一個用戶進入支付系統,在向你的服務器傳輸他的信用卡數據時,你應該用SSL去保護它。若是你想要在一個確認頁面上顯示他的信用卡號時,因爲該卡號信息是由服務器發向他的客戶端的,你一樣要用SSL去保護它。

好比前面的例子,顯示信用卡號顯然增長了暴露的機率。SSL確實能夠下降風險,可是最佳的解決方案是經過只顯示最後四位數,從而達到完全杜絕風險的目的。

爲了下降對敏感數據的暴露率,你必須確認什麼數據是敏感的,同時跟蹤它,並消除全部沒必要要的數據暴露。在本書中,我會展現一些技巧,用以幫助你實現對不少常見敏感數據的保護。

相關文章
相關標籤/搜索