歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 教您如何應用PHP開發出安全的應用程序

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

日期:2017/2/27 14:23:31   编辑:更多Linux
  PHP是一種跨平台的服務器端的嵌入式腳本語言。它大量地借用C,Java和Perl語言的語法, 並耦合PHP自己的特性,使WEB開發者能夠快速地寫出動態產生頁面。最新版本PHP5.01支持目前絕大多數數據庫(mysql、PostgreSQL、Oracle,、DB2、Sybase等)。還有一點,PHP是完全免費的,不用花錢,你可以從PHP官方站點(http: //www.php.net)自由下載。PHP拓展了WEB Server的功能,實現了Web最佳服務的後端延展界面,見圖-1。     圖-1 PHP拓展了WEB Server的功能    PHP全稱Professional HyperText PreProcessor。以最新的PHP5.01為例支持它的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 9.0下完成。    一、 安全從頭開始    在編譯PHP之前,首先確保操作系統的版本是最新的,必要的補丁程序必須安裝過。安裝編譯PHP過程中要注意的4個問題:    1、 使用Apachetoolbox整合Apache,PHP,Mysql 目前最好的web建站黃金組合是Linux+Apache+Mysql+PHP, 但是在實際工作過程中需要分別下載,安裝,配置apache,php和mysql,並且需要根據具體情況修改apache的httpd.conf, php的php.ini還有mysql的配置文件,如果你還需要提供ssl功能,那還得下載正確的ssl apache模塊,並定制它的.ini文件等,其中的任何步驟出現問題都會導致網站不能正確運行。    想一次完全配置成功,即使對於一個經驗豐富的Linux網絡管理員也比較困難。Apache Toolbox是用shell腳本寫成的。Apache Toolbox可以很很方便的使你定制你的apache按您的要求在Apache支持的52個第三方的軟件包以及36個模塊中選擇。    定制的過程完全用菜單驅動,而且都有簡單的說明。所有的組件都是用源代碼方式安裝,在安裝過程中,如果發現RPM包有問題,它還會用wget去重新下載新的可用的組件包。相信對那些網絡管理員是一個有用的工具。    Apache Toolbox 可以在GUN命令行下安裝,也可以在X窗口下安裝,為了方便讀者閱讀本文以在X窗口下安裝為例。在www.apachetoolbox.com下載最新的apachetoolbox安裝包。包括apache2.0,mysql3.23.51,php4.3,Python 2.0、 PostgresSQLv7.1等常用建站軟件和APC (一種為PHP提供Cache的模塊),Apache Toolbox Apache Toolbox提供了一個簡單的編譯Apache方法,能讓你很容易地安裝Apache、 SSL,PHP, ZendOptimizer, mod_auth-nds,mod-dynvhost,WebDAV,mod_fastcgi,mod_gzip,mod_layout,mod_throttle,mod_Accessref, mod_auth_sys, mod_bandwidth, mod_auth_ldap, mod_perl, openldap.等等以及最新的支持PNG格式的 gd 庫。它支持完全的菜單界面。     圖-2 Apachetoolbox安裝界面    2、按照Apache 模塊安裝當 PHP 被用作 Apache 的模塊時,它將繼承 Apache 的用戶權限(典型情況為用戶"nobody")。 這將對安全及授權機制產生一些沖擊。    例如,如果您使用 PHP 來訪問數據庫,除非數據庫本身有內建的訪問控制,否則您將使得數據庫能夠被用戶"nobody"訪問。這意味著惡意的腳本能夠訪問並修改數據庫,甚至不需要用戶名和密碼。網絡黑客無意中訪問到了數據庫管理員的 WEB 頁面並通過這裡刪除所有的數據庫是完全有可能發生的。    您可以利用 Apache 的認證機制來防止這些的發生,或者也可以利用 LDAP 或 .htaccess 文件等來設計您自己的訪問模式,並將這些代碼包含為您 PHP 腳本的一部分。    通常,一旦安全機制建立並使得 PHP 的用於(在這種情況下,為 Apache 用戶)僅為此承擔很小的風險時,我們發現 PHP 此時被禁止往用戶目錄寫入任何文件,或者還有可能被禁止訪問和更改數據庫。無論往防止的對象中寫入文件的好壞以及進入的數據庫事務的好壞,其安全性都是同等的。    在這個時候,一個頻繁出現的安全錯誤是給 Apache root 權限,或者用其它方法提升 Apache 的能力。    給 Apache 用戶賦予 root 權限是及其危險的,而且有可能會連累整個系統。因此,進行 sudo、chroot,或者以 root 賬號運行等操作不應該考慮讓那些非安全專家來執行。 還有一些更簡單的情況。您可以使用 open_basedir 來控制和限制 PHP 能夠使用的目錄。您還可以建立 Apache 的專用區域,以將所有基於 WEB 的活動都限制到非用戶、系統和文件。    3、把PHP解析器放在Web目錄外    一種安全性非常高的方法是把 PHP 解析程序放置到 WEB 文件目錄樹以外的某個地方,例如,放置到 /usr/local/bin。這種做法唯一的弊病就是您現在需要在所有含有 PHP 標記符文件的第一行添加類似於以下的內容:    #!/usr/local/bin/php    您需要使得這些文件成為可執行文件。也就是說,像對待任何其它 CGI 腳本一樣來對待它們。這些 CGI 腳本可能是用 Perl、sh 或者任何其它使用的 #! shell-escape 機制來啟動它們自身的腳本語言來編寫的。要使這個方法中 PHP 能夠正確處理 PATH_INFO 和 PATH_TRANSLATED 信息,在編譯 PHP 解析器時必須使用配置參數--enable-discard-path。下面是一個能作為CGI程序運行的PHP腳的例子。    #!/usr/local/bin/phpecho  "This is a my small program"    4、最後將PHP請升級為最新穩定版本:4.3.8。    在PHP 4.1中,添加了一組特殊數據以訪問外部數據。這些數組可以在任何范圍內調用,這使得外部數據的訪問更方便。在PHP 4.3.8中,register_globals被默認關閉以鼓勵使用這些數組以避免無經驗的開發者編寫出不安全的PHP代碼。作出這樣的變化是出於安全性的考慮的。鏈接:http://www.php.net/downloads.php    二、 安全使用PHP    1、安裝安全模塊    PHP 的安全模式是為了試圖解決共享服務器(shared-server)安全問題而設立的。在結構上,試圖在 PHP 層上解決這個問題是不合理的,但修改 WEB 服務器層和操作系統層顯得非常不現實。因此許多人,特別是 ISP,目前使用安全模式。    表-1.安全模式配置指令     以下是該配置選項的簡要解釋。    (1)safe_mode boolean    是否啟用 PHP 的安全模式。    (2)safe_mode_gid    默認情況下,安全模式在打開文件時會做 UID 比較檢查。如果你想將其放寬到 GID 比較,則打開 safe_mode_gid。是否在文件訪問時使用 UID(FALSE)或者 GID(TRUE)來做檢查。    (3)safe_mode_include_dir    當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。    從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。    (4)safe_mode_exec_dir    如果 PHP 使用了安全模式,system() 和其它執行系統程序的函數將拒絕啟動不在此目錄中的程序。    (5)safe_mode_allowed_env_vars    設置某些環境變量可能是潛在的安全缺口。本指令包含有一個逗號分隔的前綴列表。在安全模式下,用戶只能改變那些名字具有在這裡提供的前綴的環境變量。默認情況下,用戶只能設置以 PHP_ 開頭的環境變量(例如 PHP_FOO = BAR)。    (6)safe_mode_protected_env_vars    本指令包含有一個逗號分隔的環境變量的列表,最終用戶不能用 putenv() 來改變這些環境變量。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變量。    (7)disable_functions    本指令允許你基於安全原因禁止某些函數。接受逗號分隔的函數名列表作為參數。 disable_functions 不受安全模式的影響。 本指令只能設置在 php.ini 中。例如你不能將其設置在 httpd.conf。    (8)disable_classes    本指令可以使你出於安全的理由禁用某些類。用逗號分隔類名。disable_classes 不受安全模式的影響。 本指令只能設置在 php.ini 中。例如你不能將其設置在 httpd.conf。該指令自 PHP 4.3.2 起可用。    (9)open_basedir    將 PHP 所能打開的文件限制在指定的目錄樹,包括文件本身。本指令不受安全模式打開或者關閉的影響。    2、以安全模式運行PHP  



Copyright © Linux教程網 All Rights Reserved