簡介
PHP 作為一種強大的語言,無論是以模組還是 CGI 的方式安裝,它的解譯器都可以在伺服器上訪問檔案、運行命令以及建立網路連接等。這些功能也許會給伺服器添加很多不安全因素,但是只要正確地安裝和配置 PHP,以及編寫安全的代碼,那麼 PHP 相對於 Perl 和 C 來說,是能建立出更安全的 CGI 程式的。而且,也可以在可用性和安全性之間找到一個很好的平衡點。
PHP 可能會被用在很多不同的方面,因此,PHP 內建的選項以方便使用者對其進行配置。雖然眾多的選項可以使 PHP 完成很多工作,但是對這些選項的設定以及對伺服器的配置很可能會產生安全問題。
PHP 的選項與其文法一樣,具有很高的靈活性。使用 PHP,可以在只有 shell 使用者權限的環境下建立完善的伺服器端程式,或者在被嚴格限制環境下使用它來完成伺服器端包含(Server-Side Includes)而無需承但太大的風險。如何建立這樣一種環境,其安全性如何,很大程度上取決於 PHP 的開發人員。
本章以一些常規的安全建議作開頭,講述如何在不同的環境下儘可能地提高安全性,以及介紹對於不同安全層級的一些編程原則。
總則
絕對安全的系統是不存在的,因此安全業界常用的方法有助於平衡可用性和風險。對使用者提交的每一個變數都進行雙步驟驗證可能是一個很負責任的行為,但會導致使用者必須花很多時間去填寫一張複雜無比的表格,從而迫使某些使用者嘗試繞過安全機制。
最好的安全機制應該能在不防礙使用者,並且不過多地增加開發難度的情況下做到能滿足需求。實際上,一些安全問題往往會發生在這種過度強化安全機制的系統上。
不要忘記著名的等強原則:一個系統的的強度是由它最薄弱的環節決定的(相當於木桶原理)。如果所有的事務都基於時間、地點、事務種類進行詳細的記錄,而使用者驗證卻只依靠一個 cookie,那麼使用者所對應的事務記錄的可信度就被大大剝弱了。
調試代碼的時候一定要記住,就算是一個簡單的頁面也很難對所有可能發生的情況進行檢測:對你不滿的僱員不一定會輸入如你所願的東西,駭客也有足夠的時間研究你的系統,當然,你的寵物貓也會跳到你的鍵盤上。這就是為什麼必須檢查所有的代碼,去發現哪裡可以引入不正當的資料,然後對代碼改進、簡化或者增強。
互連網上充滿了為了成名而破壞你的代碼、攻擊你的網站並輸入不正當資料的人,總之他們會使你的生活充滿樂趣。無論是大網站還是小網站,只要能和互連網串連,就會成為一個目標。很多駭客程式並不理會網站的大小,只會機械地掃描 IP 位址並找尋受害者。我們希望那個不要是你。