菲納格動態逆定律:php
會出錯的,終將會出錯 —- 在最糟糕的時刻。
防護性編程,簡單的說,就是在編程的時候有目的地預測可能的故障點。目的是在那些可能發生的問題發生前解決它們。你看見了問題,對吧?預測意料以外的事情原本就有內在的難度,當你想要預測意料以外的事情而且解決它就更是難上了好幾倍。html
下面咱們看幾個實際的例子。前端
這是最容易進行防護性編程的地方之一,也是最容易知足的地方。在用PHP編程的許多狀況下你不會須要「else」。程序員
假設,你在寫一個函數而且須要一個條件語句。在這裏,你只須要爲你特定的變量使用三個條件語句以下:數據庫
if($var == a){ } else if($var == b){ } else if($var == c){ }
沒有其餘可能性了,你說,而且繼續碼代碼。可是,讓咱們在這裏停一下。我知道你知道這裏沒有其餘可能性了。而且我相信你。但有時候(不可預測的)狀況會發生。咱們忘掉了一些狀況。咱們檢查錯誤。咱們最終重用了一些代碼,超出了本來的預約範圍。忽然咱們有了泄露錯誤或者有時候是靜默的錯誤狀態,由於咱們沒有使用catch。使用else代碼塊。在使用switch時要使用default。用它們來返回或者記錄錯誤,這樣你才知道發生了什麼(若是發生了的話)。雖然會多用兩行代碼,但當一些你沒法預測的事情發生時,這是值得的。編程
你之前有沒有據說過這個說法?大多數程序員聽過。這有一點含糊,通俗點講,理所固然。但它是真理。你毫不應該相信用戶輸入。這不是說你假設全部用戶是瘋狂的黑客,他們使用一些精心設計的命令來摧毀你的應用。沒有必要妄想。可是,你應該假設用戶不知道你的代碼,他們不知道你須要填寫什麼參數,或者參數應該多長。他們不知道什麼文件類型或者什麼大小能上傳(即便應用告訴了他們)。偶爾他們會是機器或者黑客而且他們但願在他們的輸入中運行腳本,有時候甚至是在登錄後的輸入中。你怎麼知道你能相信認證或者驗證碼能在用戶輸入以前提供一個安全的堡壘?後端
答案:毫不。安全
你毫不相信用戶輸入。若是你信任的用戶輸入,那麼你永遠不會有一個突破。明白了嗎?因此老是要評估你的輸入,必定要保證你在處理數據尤爲是要存入數據庫或者要把它展現出來時使用了合適的技術。所以 – 毫不相信輸入,即便來自不是用戶的輸入的地方 – 輸入驗證永遠是你的朋友。看看Survive the Deep End: PHP Security 而且使用 validation library.吧。函數
不要假設任何事情。若是前兩個主題教會咱們一些事情的話,那就是咱們不該該作任何假設。做爲程序員,尤爲是致力於一個項目過久後,咱們開始作不少假設。咱們假設用戶知道一些咱們知道的事情。不必定是技術細節,也能夠是程序的功能性細節。咱們假設用戶知道文件能有多大由於。。。咱們已經知道。或者他們知道爲了讓郵件腳本。。。但事實不是,他們不知道以上任何東西。這好像更多的是前端的工做,但明顯的是你在後端仍然要處理用戶行爲和用戶輸入,因此值得好好想一想。編碼
另外一個許多程序員都會作的驚人的假設是咱們在任什麼時候候對於咱們的函數,類或者其它代碼段的明顯的功能屬性。一個具備防護性的程序員會仔細考慮的不只僅是用通常的文檔來描述函數是幹什麼的——他們也將寫下他們對輸入,參數,用例,或任何其餘相似的東西作出的任何假設。由於咱們都是人,咱們過一段時間會忘掉一些事。咱們最後也極可能會面臨其餘人維護,擴展或者替換咱們的代碼。若是沒有別的,回想一下,編程是發生在一個充滿技術變革的世界裏。若是你的應用仍然能使用幾年,可能會升級PHP版本而且失去一些功能,或者一些你本身代碼裏面具備交互的組件之間須要改變。預測這些是很困難的,因此好的註釋和文檔是很是重要的。
另外一件可使咱們忘記好的評論實踐以及標準的東西是視野狹窄。許多程序員都具備視野狹窄的毛病。你知道這種感受 - 你解決問題,你處於最佳狀態。你以爲與你的音樂(或沒有)獨立於本身的小世界中,而且你就在編碼,忽然兩小時過了,你意識到你已經寫了無數行沒有註釋的代碼。咱們全部人偶爾都會遇到這種事情,但重要的是在某處發現這個狀況而且補上應有的註釋。
一致性是一個灰色地帶 – 它更多的是關於編碼標準之類的,但它和防護性編程也有聯繫。在PHP中,有標準規範你的代碼格式以便別人查看,或者你之後使用。但經常沒人讓你的代碼標準化。可是不管你是否按照標準編碼,你至少要保持一致性 – 這能讓你少犯錯誤。這對於須要大量時間返回而且修復的小的語法錯誤尤爲適用。若是你老是使用相同的間隔,格式和語法,命名規格等等你就能更好的避免犯錯以致於誤讀你本身的代碼。你更可能快速瀏覽代碼而且找到你須要的東西。
總的來講,除去用戶行爲和動做,不要對你的程序作任何假設。假設是具備防護性編程習慣的程序員最大的敵人。不要假設你不須要 default 語句或者 else 代碼塊。儘可能使用正確的用戶錯誤信息,警告,日誌或者任何其它你假設不會用到的代碼。你的假設一般是正確的 – 但咱們不在意。咱們在意的是它們出錯的時候。必定要計劃得好,準備着你可能須要在幾小時,幾周,幾個月甚至幾年後回顧你的代碼,或者其餘人須要 – 相應的就要好好寫文檔。別假設它永遠不須要升級,擴展或者維護。那是無知的,在更多的狀況下是疏忽。有時候保持一顆防護性編程的心能幫你更有效更安全地估計,計劃和編程。