PHP程式開發網站安全簡介

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’]
$_REQUEST

 

檔案存取

如果存取的檔案名稱經由使用者輸入透過下列 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

 

Leave a Reply

Your email address will not be published. Required fields are marked *