安全|程式 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 標記符檔案的第一行添加類似於以下的內容:
您需要使得這些檔案成為可執行檔。也就是說,像對待任何其它 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.安全模式配置指令
名稱 |
預設值 |
類型 |
safe_mode |
"0" |
布爾型 |
safe_mode_gid |
"0" |
布爾型 |
safe_mode_include_dir |
NULL |
字串 |
safe_mode_exec_dir |
"" |
字串 |
safe_mode_allowed_env_vars |
PHP_ |
字串 |
safe_mode_protected_env_vars |
LD_LIBRARY_PATH |
字串 |
disable_functions |
"" |
字串 |
disable_classes |
"" |
字串 |
open_basedir |
NULL |
字串 |
以下是該配置選項的簡要解釋。
(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
以安全模式運行PHP是使PHP指令碼安全使用的好方法,特別是在允許使用者使用自己開發的PHP指令碼時。使用安全模式會使PHP在運行函數時檢查是否存在安全問題。include、readfile、fopen、file、unlink、rmdir等等:被包含的檔案或者該檔案所在目錄的所有者必須是正在啟動並執行指令碼的所有者; Exec、System、Passthm等:要執行的程式必須位於特定的目錄(預設為/usr/local/php/bin)。編譯PHP時可以用- -with-exe-dir選項設定這個值。
Mysql_Connect:這個函數用可選的使用者名稱串連MySQL資料庫。在安全模式下,使用者名稱必須是當前被執行的指令碼的所有者,或運行httpd的使用者名稱(通常是nobody)。
HTTP Authentication:包含HTTP驗證代碼指令碼所有者的使用者ID(數字型)會自動加到驗證域。這樣可以防止有人通過抓取密碼的程式來欺騙同一個伺服器上的HTTP驗證指令碼。 3、使用使用者識別和驗證
有時需要唯一地確認一個使用者。使用者通常由請求和響應系統確認。使用者名稱/口令組合就是這種系統的一個很好的例子,比如系統要求給出A1i的口令,響應的是Ali的口令。這樣驗證是因為只有Ali才知道這個口令。
(1)伺服器端使用者驗征
這是用於服務端上對PHP程式要求最小的驗證方法。只要讓Apache來管理對使用者的驗證就行了。
AuthName "Secret page" AuthType Basic# The password file has been placed outside the web treeAuthUserFile/home/car2002/website.pw<LIMIT GET POST>requirevalid-user</LIMIT> |
你需要把上述檔案(檔案名稱為.htaccess)放在需要保護的地方。用Apache的htpasswd程式,可以建立包含使用者名稱和口令組合的檔案。把這個檔案放在Web分類樹之外,只讓該檔案的擁有者查看和修改這個檔案。當然,Web伺服器必須能夠讀取這個檔案。
如果想讀取被保護的目錄,Web伺服器要求瀏覽器提供使用者名稱和密碼。瀏覽器彈出對話方塊,使用者可以輸入他們的使用者名稱和密碼。如果使用者名稱和密碼與口令檔案中相符合,就允許使用者讀取被保護的頁面;反之,將得到錯誤頁面,告訴使用者沒有通過驗證。被保護的域會顯示出來以便使用者知道輸入那個使用者名稱和密碼。
(2)在PHP中進行使用者識別和驗證
和在Apache伺服器端進行使用者識別和驗證相比,在PHP進行使用者識別和驗證有以下優點:
A、 可登出。使用者可以登出身分識別驗證,這在Apache無法實現。
B、 可失效。你可以在一定設計後讓登陸失效。如使用者登入後60分鐘沒有瀏覽你的網站,你可強制他們重新通過驗證。
C、 可定製。例如可以用小的JavaApplet加密要傳送的口令,而在伺服器上用mcryet庫解密,這個工作可以在任何支援Java的瀏覽器上進行。
D、 可基於資料庫。你可以用儲存在各種各樣的資料庫裡的資料來驗證使用者,並且記錄訪問者訪問網站的詳細日誌。
E、 可用於每個頁面。你可在每個頁面上決定是否需要驗證,當然在Apache伺服器通過改變域也可以做到這一點。
F、 你也可以使瀏覽器彈出對話方塊。下面的例子顯示了怎樣從,MySQL資料庫中檢索用名和口令:讓使用者填人使用者名稱和口令。
<?if(!isset($PHP_AUTH_USER)){Header("WWW-authenticate: basic realm=\"restricted area\"");Header( "HTTP/1.0 401 Unauthorized");echo "You failed to provide the correct password...\n";exit;}else{mysql_select_db("users") ;$user_id = strtolower($PHP_AUTH_USER);$result = mysql_query("SELECT passwordFROM users " ."WHERE username = '$username'") ;$row = mysql_fetch_array($result) ;if ($PHP_AUTH_PW != $row["password"]){Header( "WWW-authenticate:basic realm=\"restricted area\"Header("HTTP/1.0 401 Unauthorized");echo "You failed to provide the correct password...\n" ;exit;} }?>Only users with a working username/password combination can see this |
例子:用 PHP 進行 HTTP 認證
PHP 的 HTTP 認證機制僅在 PHP 以 Apache 模組方式運行時才有效,因此該功能不適用於 CGI 版本。在 Apache 模組的 PHP 指令碼中,可以用 header() 函數來向用戶端瀏覽器發送"Authentication Required"資訊,使其彈出一個使用者名稱/密碼輸入視窗。
當使用者輸入使用者名稱和密碼後,包含有 URL 的 PHP 指令碼將會再次和預定義變數 PHP_AUTH_USER、PHP_AUTH_PW 和 AUTH_TYPE 一起被調用,這三個變數分別被設定為使用者名稱,密碼和認證類型。預定義變數儲存在 $_SERVER 或者 $HTTP_SERVER_VARS 數組中。系統僅支援"基本的"認證。以下是在頁面上強迫用戶端認證的指令碼範例:
<?phpif (!isset($_SERVER['PHP_AUTH_USER'])){ header('WWW-Authenticate: Basic realm="My Realm"');header('HTTP/1.0 401 Unauthorized');echo 'Text to send if user hits Cancel button';exit;}else{ echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";}?> |
(3) 檢測IP地址
一般人們普遍認為一個IP地址唯一地確定一個訪問者。但實際上並不是這樣的。Proxy 伺服器可用相同的IP地址發送不同使用者的請求。另外IP地址的盜用也普遍存在。檢測 IP地址有它們的用處,但相當有限。例如你是一個論壇版主,你發現某個使用者粘貼一些不健康的、違法的內容。你可以找到他的IP地址,把從這個IP連進來的使用者逐出論壇。使用下面一行命令將會得到某個特定請求的源IP地址:
4、使用PHP加密技術
在PHP中,加密技術主要用來加密資訊、產生校正和和摘要。使用加密技術可大大地增強安全效能。 這裡只講述使用加密技術的一些概念。如果你想進一步瞭解,應參考一些好的加密技術資料。加密技術的標準是Bmce Schneier的應用加密技術,非常值得一讀。他的網站(www.counterpane.com/labs.html )是在互連網上尋找加密技術資料的好起點。資料加密是一個非常複雜的話題,這裡只簡單介紹一下。
現在關於加密php程式的,除了zend公司的產品產品,其他的都不盡人意。這裡我給大家介紹一個開源的產品,一個很多好的php加密軟體--php_screw. 他的好處是用了php的zend引擎,而且是對代碼加密,和系統平台沒有任何關係,解決了產品放在其他地方的保密問題。
(1)安裝php_screw
#wget http://belnet.dl.sourceforge.net/sourceforge/php-screw/php_screw-1.3.tgz#tar zxvfphp_screw.1.3.tar.gz # cd php_screw.1.3# /opt/php/bin/phpize # ./configure --with-php-config=/opt/php/bin/php-config # vi my_screw.h#這個是密碼檔案,使用者可以自己設定加密的密碼 # make# cp ./modules/php_screw.so/usr/local/php/lib/php #cd tools # make #make產生screw 這個可執行檔,它用來加密php檔案,產生加密後的.php檔案。 |
(2)加密檔案:
加密檔案,就是用上一步的make命令產生的screw檔案來產生新的加密檔案。
舉例:加密/opt/php/htdocs/index.htm檔案
# ./screw /opt/php/htdocs/index.htm |
加密程式會產生加密後的檔案叫index.php,而原來加密前的檔案自動備份成index.php.screw。 加密產品所要加密的檔案後,可以刪除備份檔案。備份php_screw.so和screw檔案,以後還可以繼續使用他們來加密和解釋。最後刪除php_screw的目錄。 5、使用具有SSL技術
SSL是英文Server Side Includes的縮寫。使用具有SSL(安全通訊端協議層)功能的web伺服器,可以不用改變一行代碼而提高網站的安全效能。SSL使用加密方法來保護web伺服器和瀏覽器之間的資訊流。SSL不僅用於加密在互連網上傳遞的資料流,而且還提供雙方身分識別驗證。
這樣,你就可以安全地線上購物而不必擔心別人矢隨你的信用卡的資訊。這種特性使得SSL適用於那些交換重要訊息的地方,像電子商務和基於Web的郵件。
SSL使用公用祕密金鑰加密技術,伺服器在串連結束時給用戶端發送公用密鑰用來加密資訊,而加密的資訊只有伺服器用它自己持有的專用密鑰才能解開。用戶端用公用祕密金鑰加密資料,並且發送給服務端自己的密鑰,以唯一確定自己,防止在系統兩端之間有人冒充服務端或用戶端進行欺騙。
加密的HTTP串連用443連接埠號碼代替80連接埠號碼,以區別於普通的不加密的HTTP。用戶端使用加密HTTP串連時會自動使用443連接埠而不是80連接埠。這使得服務端更容易作出相應的響應。
在Apache伺服器下,可以通過直接編輯伺服器設定檔或者在需要使用SSI的目錄中建立.htaccess檔案來啟動SSL。登入到伺服器,找到設定檔的存放目錄,使用文字編輯器開啟檔案srm.conf,找到以下幾行:
# If you want to use server side includes, or CGI outside#ScriptAliased directories,uncomment the following lines.#AddType text/x-server-parsed-html .shtml#AddType application/x-httpd-CGI.CGI |
將以AddType開頭的兩行並且去掉每一行最前面的"#"符號即可。儲存所做的修改,然後再開啟檔案access.conf。
<Directory /usr/local/etc/httpd/htdocs> # This may also be "None", "All", or any combination of "Indexes",# "Includes", or "FollowSymLinks"Options Indexes FollowSymLinks</Directory> |
將其中的Options Indexes FollowSymLinks改為:Options Indexes FollowSymLinks Includes 即可。
例子:如何建立一個僅接受強加密請求的SSL伺服器,而又允許對外瀏覽器使用更強的加密?
這個功能被稱為以伺服器為網關的加密(Server Gated Cryptography [SGC]), 在README.GlobalID文檔中有詳細說明。簡單地說就是:伺服器擁有一個由來自Verisign的一個特殊的CA認證簽發的伺服器身份證, 從而在對外瀏覽器上實現強加密。
其過程如下:
瀏覽器使用對外密碼進行串連,伺服器返回其全域ID身份證,瀏覽器校正後在後繼HTTP通訊產生之前提升其密碼組。
現在的問題是:如何允許這樣的提升,而又強制性地使用強加密。換句話說就是:瀏覽器必須在開始串連時就使用強加密,或者提升倒強加密,但是維持對外密碼是不允許的。以下巧妙地解決了這個問題:
httpd.conf:# 允許在初始握手階段使用所有的密碼,# 以允許對外伺服器通過SGC功能提升密碼組SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<Directory /usr/local/apache2/htdocs>#但是最終會拒絕所有沒有提升密碼組的瀏覽器SSLRequire %{SSL_CIPHER_USEKEYSIZE}>= 128</Directory> |
6、建立安全的PHP指令碼
有很多編程技巧使PHP指令碼更安全地運行。其中最重要的一條是使用一些安全常識。運行PHP比運行CGI指令碼更安全,但它仍然有許多出現錯誤的地方。轉換到安全運行模式能夠限制出錯所產生的結果。如果你的PHP指令碼中有錯誤,可能會被人找到並且利用它來破壞網站甚至資料庫。所以經常備份也是必要的。
(1)安全設定軟體
基於Web的應用程式,如線上目錄,通常都在無人密切監視的情況下運行。如果發生錯誤時,你不可能立即採取行動。通常訪問者最先注意到所發生的問題,你應該使他們很容易地報告所發生的問題。更進一步,可以由構成這個網站的指令碼來跟蹤這些問題。例如,你的訪問者可能做一些你想不到的事情。也可能你對於重要函數所傳回值沒有檢查,指令碼可能會以不可預料的方式運行。
寫出更加安全的程式,就可以避免這些問題。例如你應該檢查資料庫函數的傳回值,如果資料庫崩潰,顯示給使用者的應該是出錯的資訊頁面而不是滿螢幕的錯誤。你甚至可以讓指令碼在發生嚴重問題,如資料庫崩潰、硬碟空間已滿的時候自動通知你。你也應該檢查從使用者傳來的所有資料。顯然後者更重要。 如果你的程式能夠應付各種錯誤,那麼你的程式不僅更加可靠,而且可以花更少的時間來維護。這些時間可大大彌補你開發程式時所花的額外時間。
(2)合理儲存和交換敏感資訊
顯然,你應盡量避免在互連網上以GET、POST、cookie或URL編碼的形式傳遞敏感資訊,這樣使資訊很容易被竊取。使用支援SSL的web伺服器能夠做到這一點,因為它加密網站和訪問者瀏覽器之間所有的資訊流。
如果你沒有支援SSL的Web伺服器,那麼你需要其他的辦法。比如沒有必要總是發送資料到瀏覽器;把資料儲存在資料庫中,只向瀏覽器發送關鍵字,這樣也很容易尋找到所需要的資料;並以加密的形式發送所有的資料等等。實現這種功能的最簡單的辦法是使用Session。PHP4支援本地化的Session功能,PHP3則要使用PHPMB庫。
HTTP 協議是一種無狀態協議,它不負責為好串連的狀態資訊,因此無法跟蹤用戶端的各種資訊,Session的出現改變這一狀況。當使用者瀏覽一個支援Session功能的CGI指令碼時,在他離開這個網頁前可以將使用者資訊儲存在同意Session ID之下,也就是可以在不同的網頁之間偕同存取使用者資訊。
如果不使用PHP的安全模式或在suEXEC下以CGI方式運行PHP,那麼監視你的檔案的內容就不可能實現。此時唯一防止別人讀取資料的方法是儘快把資料儲存到資料庫中。
(3)檢查使用者輸入
Per1語言有個特性叫汙點檢測(taint checking)。當汙點檢測生效時,即使沒有發生重大錯誤,你也不能運行含有可疑變數的函數。一個變數,當它的值是使用者提供資料的一部分或全部時就變成可疑的了,因為這些資料被認為是不安全的。這樣可提高系統安性。
PHP沒有這個特性,但PHP有escapeshellcmd函數,可以達到同樣的效果。另一個不讓使用者濫用指令碼的方法是只允許使用經過嚴格檢查的輸入。例如如果需要輸入IP地址時,應當檢查這個IP地址十分有效。使用Regex可以做到這一點。下面這個函數例子將驗證一個字串這是否包含有效IP地址。
function validate_ip($ip) {if (is_string($ip) && ereg(,^([0-9]{1,3})\.( [0-9]{l,3})\. ''([0-9]{1,3})\.([0-9]{1,3})$',$ip, $part)) {if ($part[l] <= 255 && $part[2]<= 255 &&$part[3] <= 255&& $part[4] <= 255)return TRUE;# Valid IP }return FALSE;# Invalid IP} |
許多PHP程式的安全缺陷不是程式語言本身,而是沒有在編碼中考慮到使用者提交資料的安全。所以對於使用者提交資料,應當小心檢查代碼以確保任何由web瀏覽器提交的變數經過了相應的檢查。下面是一個危險的變數使用:
<?php//從某個使用者目錄下刪除檔案... 可能是其他使用者的檔案?unlink ($evil_var);// 記下訪問日誌... 也許沒有必要?fputs ($fp, $evil_var);?> |
三、 作業系統自身的補丁
給系統打已知漏洞的補丁是系統管理員最基本的職責,這也是最後一道防線。經過以上的配置,雖然說不上固若金湯,但是也在相當程度上給攻擊者的測試造成很多麻煩,即使php指令碼程式出現比較嚴重的漏洞,攻擊者也無法造成實際性的破壞。
四、 總結
以上介紹了PHP的安全性原則、加密和SSL的應用,以及任何用PHP進行身分識別驗證識別。徹底安全的系統從理論上講不可能,因此我們所指安全性只是在代價與可用性間作平衡。若是使用者提交的每一個變數都要求有生物學驗證(如指紋評鑑),則將獲得極高水平的可靠性。
但是也會造成使用者填寫一個表格就要幾十分鐘。這時使用者就會採取繞過安全驗證的方法。一個系統的可靠性只能由整個鏈條中最薄弱的環節來決定。在任何安全系統裡面,人是最脆弱的串連,單單技術本身不能讓系統安全。
最好的安全性原則通常能夠不那麼明顯地適應環境的需求,它不會妨礙使用者完成他們的工作,也不會使代碼編寫員面過分負擔複雜的情形。
PHP作為開放原始碼軟體,開放的模式是雙刃劍。從機制上講,全世界的開發人員都能獲得原始碼,從而找出其中的紕漏,似乎安全性應該更好;但是同時,如果網路管理員不能及時更新版本,也會留下安全隱患。
而且,影響安全的因素有很多。從編程水平到使用者的使用水平等等,都將影響到系統的安全。僅僅通過開放或者封閉原始碼,都不能從根本上解決安全問題。如果你是一個PHP程式員,你經常需要上相應的網站看,是否有補丁,是否有了bug fix,是否需要升級。千萬不要報僥倖心理,否則一個Shell指令碼就可能拿下你的網站。套用一句名言:你的伺服器永遠可能在第二天被駭客接管。
PHP伺服器啟動並執行軟體主要包括:Samba,Ftp,Telnet,Ssh,Mysql,Apache,Mozilla等,這些軟體,大都是開源軟體,而且都在不停升級,穩定版和測試版交替出現。在www.samba.org和 www.apache.org 上,最新的ChangeLog中都寫著:bug fix, security bug fix的字樣。所以PHP網管員要經常的關注相關網站的bug fix和升級,及時升級或添加補丁。本文希望PHP能夠為您找到您真正需要的自由與安全的結合點。