PHP程式開發網站安全簡介
PHP 程式語言被廣泛運用在網站的建置與開發,
這篇文章主要探討用PHP 程式語言開發網站時,
設定上或是PHP 使用上所要注意的地方,分為下列五大部分:
- 使用者輸入的變數
- 檔案存取的 API
- 動態指令執行的 API
- 資料庫存取 API
- 境變數設定
另外,可以 ASP .NET 可以參考這篇
http://www.qa-knowhow.com/?p=698
使用者輸入變數
PHP 可以透過變數讀取使用者輸入資料,
這些使用者輸入資料建議做一定程度的檢查,而非直接處理或是儲存至資料庫
$_POST $HTTP_POST_VARS |
$_GET $HTTP_GET_VARS Contains |
$_COOKIE $HTTP_COOKIE_VARS |
||
$_FILES $HTTP_POST_FILES |
$_SERVER[‘REQUEST_METHOD’]$_SERVER[‘REQUEST_URI’]$_SERVER[‘QUERY_STRING’]$_SERVER[‘HTTP_USER_AGENT’]$_SERVER[‘HTTP_REFERER’] |
|
||
檔案存取
如果存取的檔案名稱經由使用者輸入透過下列 API 執行,
那麼駭客就有可能讀取到其他非預期的系統檔案。
- fopen
- readfile
- file
- fpassthru
- gzopen
- gzfile
- gzpassthru
- readgzfile
- copy
- rename
- rmdir
- mkdir
- unlink
- file_get_contents
- file_put_contents
- parse_ini_file
資料庫相關存取
PHP 中支援資料庫存取的API 相關的輸入值必須做一定的驗證,避免SQL injection 的發生
- mysql_query
- mssql_query
- pg_query
動態執行程式碼
下列 API 因為可以動態執行程式碼或是執行系統指令,因此盡量避免使用。
- eval
- exec
- passthru
- popen
- proc_open
- shell_exec
- system
PHP 設定
allow_url_fopen = 0
這個值預設為 =1 ,也就是允許遠端檔案存取。這樣一來也會造成檔案存取的資訊安全風險。建議將該設定值設定為 0
safe_mode = 1
這個值safe_mode建議設定為 enabled 。PHP 將會對於一些危險的 API 限制執行。
例如:下列兩個 API 就會被停止使用,避免 OS command injection。
- shell_exec
- exec
magic_quotes_gpc = 1
這個值建議設定為 enabled。PHP 將會對於 ‘ 或是 ” 等符號進行編碼。
這樣可以避免輸入值為潛在的程式碼,而讓PHP 執行。也會避免 SQL injection 的攻擊。
然而,額外的編碼值有可能會造成非預期的結果。
所以,針對 SQL injection的防護來說,還是建議使用 Prepared SQL Statement 或是 stored procedure.
display_errors = 0
這個值可以避免將過多的錯誤訊息 (程式碼錯誤、版本資訊等)回傳給browser 端。因為駭客會利用這些訊息得知Web Server程式碼的運作與相關本版資訊。
file_uploads = 0
這個設定值將決定是否允許檔案上傳。如果設定允許檔案上傳,就必須對上傳的檔案內容、型態與檔名做檢查,以免駭客上傳有害的檔案。
可另外參考這篇 “檔案上傳的資訊安全風險”
http://www.qa-knowhow.com/?p=389
總結
這篇文章介紹幾個重要 PHP 網站開發需要注意的地方:
- 使用者輸入的變數
- 檔案存取的 API
- 動態指令執行的 API
- 資料庫存取 API
- 境變數設定
這些API 並須對於使用者輸入的資料做進一步的檢查,才能夠進一步的執行與儲存。
進行 Code Review 時,針對這幾個重點再次檢視相關輸入的處理,讓網站安全更加周全。
參考資料:
https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet