PHP是一個很容易學習的語言, 許多人在沒有任何編程背景下學習它作為一種去增加一些互動元素到他們的網站的方法. 不幸的是,這往往意味著PHP程式員,尤其是那些較新的Web開發程式員, 並沒有覺察他們網站中潛在安全風險. 這裡是一些比較常見的安全問題,以及如何去避免它們。
永遠,永遠信任你的使用者
不能說足夠的次數,你應該永遠,永遠, 信任你的使用者向你發送你期望的資料. 我聽到很多人回應,大概是"哦,沒有惡意的人將對我的網站感興趣"。這就錯了, 這裡總是有懷有惡意的使用者可以利用一個安全性漏洞,問題可以很容易被發現,因為一個使用者無意中做錯了。
因此, 所有網頁的發展的戒律,我不能再壓縮了的話就是:永遠,永遠,相信你的使用者。假定你的網站從使用者收集的每片資料含有惡意代碼,始終, 你認為已經檢查用戶端驗證的這些資料,例如在JavaScript ,如果你能夠達到這個目標,你應該有了一個良好的開端。如果PHP的安全性很重要,這一點就要重要地學習,個人來說,"PHP安全"是一個重大的問題。
全域變數
在許多語言,你必須明確地設定一個變數以使用它。 在PHP中,有一個選項" , register_globals" , 你可以在php.ini中設定,讓你可以使用全域變數,而不需要事先聲明。
考慮下面的代碼:
以下為引用的內容: if ($password == "my_password") { $authorized = 1; } if ($authorized == 1) { echo "Lots of important stuff."; } |
許多人看上去覺得沒什麼問題,而事實上,這方面的代碼在整個網站上應用. 但是,如果一個伺服器開啟"register_globals"。然後,只需添加"?authorized=1"的URL將讓任何人都看到. 這是一個最普遍的PHP的安全問題。
所幸的是,這有兩個簡單的解決辦法. 第一,也許最好的,就是把"register_globals"關閉. 二是你必須明確只有你使用變數. 在上面的例子中,這將意味著加入"?authorized=0"; 在指令碼的開始:
$authorized = 0;if ($password == "my_password") {$authorized = 1;}if ($authorized == 1) {echo "Lots of important stuff.";}
錯誤資訊
錯誤資訊是一個非常有用的工具,無論是程式員和駭客. 開發人員需要它們去改正錯誤. 駭客可以利用它們來找出一個網站的各種資訊, 從目錄結構的伺服器,資料庫登入資訊. 如果可能的話,最好是關閉所有的錯誤報表. PHP可以完成這項工作. htaccess或php.ini,設定"error_reporting" 的值改為"0" . 如果你有一個開發環境,您可以設定不同的錯誤報表層級。
SQL注入
PHP的一個最大優點就是,它可以方便地與資料庫中操作,最顯著的MySQL的. 很多人使用這個資料庫。不少網站,包括這一個,依賴於資料庫的函數. 然而,正如你所料,有這麼大的權力你就要夠面對龐大的潛在安全問題. 所幸的是,有很多解決辦法. 最常見面安全問題是一個資料庫 SQL注入-當使用者利用一個安全故障在你的資料庫運行SQL語句. 讓我們用一個常見的例子. 許多登入系統具有以下特點:一條線,看起來象不像是在檢查從表單輸入的使用者名稱和密碼, 比如去控制訪問一個管理員區:
$check = mysql_query("Select Username, Password, UserLevel FROM Users Where Username = '".$_POST['username']."' and Password = '".$_POST['password']."'");
看上去很眼熟? 就表面看來,它好像做得不錯.上述並不像可以做許多破壞. 但話又說回來,我在"username" 輸入框輸入這樣的值並提交:
'' 或者 1=1 #
這個執行語句現在是這個樣子:
elect Username, Password FROM Users Where Username = '' or 1=1 #' and Password = '';
散列符號(#)告訴MySQL的它之後一切,都會被忽略. 所以實際上只是執行的SQL到這一點. 1永遠等於1 ,所以SQL將從資料庫返回所有的使用者名稱和密碼. 在大多數使用者登入資料庫的首個戶名和密碼組合都是管理使用者, 他乾脆輸入了幾個符號作為管理員已登入你的網站, 果他們其實都知道的使用者名稱和密碼,他們會有同樣的權力如。