熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

教您如何應用PHP開發出安全的應用程序

2013-11-15 12:21:26  來源: PHP編程 

  PHP是一種跨平台的服務器端的嵌入式腳本語言它大量地借用CJava和Perl語言的語法 並耦合PHP自己的特性使WEB開發者能夠快速地寫出動態產生頁面最新版本PHP支持目前絕大多數數據庫(MysqlPostgreSQLOracleDBSybase等)還有一點PHP是完全免費的不用花錢你可以從PHP官方站點)自由下載PHP拓展了WEB Server的功能實現了Web最佳服務的後端延展界面見圖-
  
 

  
圖- PHP拓展了WEB Server的功能

  
  PHP全稱Professional HyperText PreProcessor以最新的PHP為例支持它的WEB服務器有Apache Microsoft Internet information Sereve Microsoft Personal web Server AOL server Netscape Enterprise 等等
  
  PHP是一種功能強大的語言和解釋器無論是作為模塊方式包含到web服務器裡安裝的還是作為單獨的CGI程序程序安裝的都能訪問文件執行命令或者在服務器上打開鏈接而這些特性都使得PHP運行時帶來安全問題
  
  雖然PH P是特意設計成一種比用Perl或C語言所編寫的CGI程序要安全的語言但正確使用編譯時和運行中的一些配置選項以及恰當的應用編碼將會保證其運行的安全性由於我們可以在很多不同的方面利用 PHP因此它有很多設置選項來控制其行為
  
  一組龐大的可選參數能夠保證您可以將 PHP 用於許多不同的目的但這同時也意味著這些參數和服務端配置的組合會帶來一些安全問題 PHP 的配置與其代碼相比有著同樣的靈活性PHP 可以用來建立完整的服務端應用程序擁有所有外殼用戶的權限它也可以在被嚴格控制的環境下用作一個簡單的服務端包含僅承擔很小的風險您如何建立該環境以及其安全性如何在很大程度上取決於 PHP 的開發者本文所有操作在Red Hat Linux 下完成
  
   安全從頭開始
  
  在編譯PHP之前首先確保操作系統的版本是最新的必要的補丁程序必須安裝過安裝編譯PHP過程中要注意的個問題
  
   使用Apachetoolbox整合ApachePHPMysql 目前最好的web建站黃金組合是Linux+Apache+Mysql+PHP 但是在實際工作過程中需要分別下載安裝配置apachephp和mysql並且需要根據具體情況修改apache的 php的phpini還有mysql的配置文件如果你還需要提供ssl功能那還得下載正確的ssl apache模塊並定制它的ini文件等其中的任何步驟出現問題都會導致網站不能正確運行
  
  想一次完全配置成功即使對於一個經驗豐富的Linux網絡管理員也比較困難Apache Toolbox是用shell腳本寫成的Apache Toolbox可以很很方便的使你定制你的apache按您的要求在Apache支持的個第三方的軟件包以及個模塊中選擇
  
  定制的過程完全用菜單驅動而且都有簡單的說明所有的組件都是用源代碼方式安裝在安裝過程中如果發現RPM包有問題它還會用wget去重新下載新的可用的組件包相信對那些網絡管理員是一個有用的工具
  
  Apache Toolbox 可以在GUN命令行下安裝也可以在X窗口下安裝為了方便讀者閱讀本文以在X窗口下安裝為例在w下載最新的apachetoolbox安裝包包括apachemysqlphpPython PostgresSQLv等常用建站軟件和APC (一種為PHP提供Cache的模塊)Apache Toolbox Apache Toolbox提供了一個簡單的編譯Apache方法能讓你很容易地安裝Apache SSLPHP ZendOptimizer mod_authndsmoddynvhostWebDAVmod_fastcgimod_gzipmod_layoutmod_throttlemod_accessref mod_auth_sys mod_bandwidth mod_auth_ldap mod_perl openldap等等以及最新的支持PNG格式的 gd 庫它支持完全的菜單界面
  
 

  
圖- Apachetoolbox安裝界面

  
  按照Apache 模塊安裝當 PHP 被用作 Apache 的模塊時它將繼承 Apache 的用戶權限(典型情況為用戶nobody 這將對安全及授權機制產生一些沖擊
  
  例如如果您使用 PHP 來訪問數據庫除非數據庫本身有內建的訪問控制否則您將使得數據庫能夠被用戶nobody訪問這意味著惡意的腳本能夠訪問並修改數據庫甚至不需要用戶名和密碼網絡黑客無意中訪問到了數據庫管理員的 WEB 頁面並通過這裡刪除所有的數據庫是完全有可能發生的
  
  您可以利用 Apache 的認證機制來防止這些的發生或者也可以利用 LDAP 或 htaccess 文件等來設計您自己的訪問模式並將這些代碼包含為您 PHP 腳本的一部分
  
  通常一旦安全機制建立並使得 PHP 的用於(在這種情況下為 Apache 用戶)僅為此承擔很小的風險時我們發現 PHP 此時被禁止往用戶目錄寫入任何文件或者還有可能被禁止訪問和更改數據庫無論往防止的對象中寫入文件的好壞以及進入的數據庫事務的好壞其安全性都是同等的
  
  在這個時候一個頻繁出現的安全錯誤是給 Apache root 權限或者用其它方法提升 Apache 的能力
  
  給 Apache 用戶賦予 root 權限是及其危險的而且有可能會連累整個系統因此進行 sudochroot或者以 root 賬號運行等操作不應該考慮讓那些非安全專家來執行 還有一些更簡單的情況您可以使用 open_basedir 來控制和限制 PHP 能夠使用的目錄您還可以建立 Apache 的專用區域以將所有基於 WEB 的活動都限制到非用戶系統和文件
  
  把PHP解析器放在Web目錄外
  
  一種安全性非常高的方法是把 PHP 解析程序放置到 WEB 文件目錄樹以外的某個地方例如放置到 /usr/local/bin這種做法唯一的弊病就是您現在需要在所有含有 PHP 標記符文件的第一行添加類似於以下的內容
  
  #!/usr/local/bin/php
  
  您需要使得這些文件成為可執行文件也就是說像對待任何其它 CGI 腳本一樣來對待它們這些 CGI 腳本可能是用 Perlsh 或者任何其它使用的 #! shellescape 機制來啟動它們自身的腳本語言來編寫的要使這個方法中 PHP 能夠正確處理 PATH_INFO 和 PATH_TRANSLATED 信息在編譯 PHP 解析器時必須使用配置參數enablediscardpath下面是一個能作為CGI程序運行的PHP腳的例子
  
  #!/usr/local/bin/phpecho
  This is a my small program
  
  最後將PHP請升級為最新穩定版本
  
  在PHP 添加了一組特殊數據以訪問外部數據這些數組可以在任何范圍內調用這使得外部數據的訪問更方便在PHP register_globals被默認關閉以鼓勵使用這些數組以避免無經驗的開發者編寫出不安全的PHP代碼作出這樣的變化是出於安全性的考慮的鏈接/downloadsphp
  
   安全使用PHP
  
  安裝安全模塊
  
  PHP 的安全模式是為了試圖解決共享服務器(sharedserver)安全問題而設立的在結構上試圖在 PHP 層上解決這個問題是不合理的但修改 WEB 服務器層和操作系統層顯得非常不現實因此許多人特別是 ISP目前使用安全模式
  
  表安全模式配置指令
  

  以下是該配置選項的簡要解釋
  
  ()safe_mode boolean
  
  是否啟用 PHP 的安全模式
  
  ()safe_mode_gid
  
  默認情況下安全模式在打開文件時會做 UID 比較檢查如果你想將其放寬到 GID 比較則打開 safe_mode_gid是否在文件訪問時使用 UID(FALSE)或者 GID(TRUE)來做檢查
  
  ()safe_mode_include_dir
  
  當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查
  
  從 PHP 開始本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑而不只是一個目錄
  
  ()safe_mode_exec_dir
  
  如果 PHP 使用了安全模式system() 和其它執行系統程序的函數將拒絕啟動不在此目錄中的程序
  
  ()safe_mode_allowed_env_vars
  
  設置某些環境變量可能是潛在的安全缺口本指令包含有一個逗號分隔的前綴列表在安全模式下用戶只能改變那些名字具有在這裡提供的前綴的環境變量默認情況下用戶只能設置以 PHP_ 開頭的環境變量(例如 PHP_FOO = BAR)
  
  ()safe_mode_protected_env_vars
  
  本指令包含有一個逗號分隔的環境變量的列表最終用戶不能用 putenv() 來改變這些環境變量甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變量
  
  ()disable_functions
  
  本指令允許你基於安全原因禁止某些函數接受逗號分隔的函數名列表作為參數 disable_functions 不受安全模式的影響 本指令只能設置在 phpini 中例如你不能將其設置在
  
  ()disable_classes
  
  本指令可以使你出於安全的理由禁用某些類用逗號分隔類名disable_classes 不受安全模式的影響 本指令只能設置在 phpini 中例如你不能將其設置在 該指令自 PHP 起可用
  
  ()open_basedir
  
  將 PHP 所能打開的文件限制在指定的目錄樹包括文件本身本指令不受安全模式打開或者關閉的影響
  
  以安全模式運行PHP
  
From:http://tw.wingwit.com/Article/program/PHP/201311/20784.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.