|
PHP網(wǎng)站設(shè)計平臺在最近幾年變得非常流行。PHP的簡單,易學(xué),易用讓很多新手都愿意接受它。然而,PHP也有一些嚴重的缺陷,到底哪些是會導(dǎo)致PHP被改寫的缺陷呢?這篇文章是針對PHP缺陷可能引起的一些潛在的問題,和一些已經(jīng)發(fā)生的問題而寫的。同時,也將提出一些促進這個平臺改進的觀點。 簡介 PHP始于拉斯姆斯·樂道夫1994年創(chuàng)建的一套小的通用網(wǎng)關(guān)接口,在經(jīng)過幾代改動之后,如今的PHP成為了最流行的網(wǎng)站設(shè)計平臺。有許多客觀的原因使它如此受歡迎。PHP是非常簡單的,易學(xué)易用的,開源發(fā)布的獨立平臺。PHP能夠很容易的支持當下任何種類的Web服務(wù)器。 PHP腳本能被非??焖俚貓?zhí)行,并且PHP資源在Web上有很大的自由空間。 同時,PHP平臺也有許多嚴重的缺陷,其中的一些并沒有被廣泛的關(guān)注過。忽視這些缺陷將導(dǎo)致低劣的程序設(shè)計。另一個嚴重的問題是基于PHP的Web應(yīng)用是有安全風(fēng)險的,主要是由于很糟糕的程序設(shè)計和PHP典型程序設(shè)計技術(shù)的不恰當運用。 正文 大部分缺陷的產(chǎn)生,是因為PHP缺少可靠和一致的初始設(shè)計。為了克服這個問題,PHP的開發(fā)團隊幾乎都會為每個新的發(fā)行版本更改說明書。因此,PHP平臺被不斷地改進,但是,一些向后兼容的問題也顯現(xiàn)了出來。當PHP被當做LAMP(Linux-Apache-MySQL-PHP)中的一部分運行時,一些問題就體現(xiàn)出來了,我們根據(jù)缺陷的來源和范圍,將它分成了幾類:典型的問題和缺陷,異常的PHP環(huán)境。 1. 來自于語言初始設(shè)計和概念的問題。PHP語言的初始設(shè)計目的是為Web服務(wù)器腳本提供一個非常簡單易用的環(huán)境。一些腳本語言的典型特征肯定會使PHP面臨更嚴峻的挑戰(zhàn)。 1.1.PHP沒有嚴格的變量類型。在PHP語言中,沒有嚴格的數(shù)據(jù)類型,變量必須在使用之前被申明。這樣一來,變量的使用和管理就變得很復(fù)雜了。這是對那些經(jīng)驗不足的程序員來說是一件糟糕的事情,這很可能導(dǎo)致一些漏洞的產(chǎn)生,而且還很難發(fā)現(xiàn)他們。遺憾的是,這個問題不大可能在PHP中解決,因為這要改變PHP語言最基本的設(shè)計思想。 1.2.注冊全局變量。PHP這種程序設(shè)計技術(shù)使參數(shù)的請求操作變得簡單,給程序員帶來了方便。然而,當"register_globals"操作隨著HTTP請求變量注入到腳本時,這種特征的益處并不比它的缺陷造成的風(fēng)險更大。另外一個事實是PHP不能要求變量初始化,這種特性給了黑客理想的機會,將惡意代碼用像cross-site腳本文件注入這樣的技術(shù)滲入腳本中。這種來自于全局變量自動注冊的威脅是眾所周知的。很令人遺憾,即使最近的發(fā)行版本-PHP5也包含有這種特性。直到PHP6發(fā)行,全局變量自動注冊的功能才被取消。 但是這本是很久以前就應(yīng)做出的改變?,F(xiàn)在很多的應(yīng)用都依賴于這種特性,在PHP6.0平臺上也將要遇到同樣的問題。也許有一個好的方法,那就是限制include()和require()的功能,只允許使用本地文件,并以此來避免遠端文件的注入。需要進一步說明的是,要建立一種方法來強迫用戶無論何時都要過濾輸入和輸出,這將有助于避免SQL注入和其他各種常見的問題,這也將是一個非常受歡迎的改變。 1.3外設(shè)的可靠性為了執(zhí)行一些重要的任務(wù),PHP需要依賴外部設(shè)備,這將削弱平臺的獨立性和可移植性。一個很好的例子就是,當一個實時的工作需要被基于PHP平臺的Web應(yīng)用程序執(zhí)行: 例如,一個通高郵件必須在每晚的20:00被準時的發(fā)送給系統(tǒng)管理員,或者每三個小時都必須執(zhí)行系統(tǒng)狀態(tài)檢測。這些工作僅僅使用外部工具就能夠執(zhí)行,這是以LAMP為代表的Linux克隆服務(wù)器典型應(yīng)用。這個克隆服務(wù)器提供了很好的接口和足夠的功能。 它的缺陷是,如果很多的Web應(yīng)用程序都在同一個服務(wù)器上使用克隆服務(wù)器,這必然將互相干擾。轉(zhuǎn)移Web應(yīng)用程序到另一個服務(wù)器上則必將帶來兼容性問題。 1.4導(dǎo)致低劣的程序設(shè)計PHP腳本并不是最優(yōu)化的預(yù)編譯程序。每個PHP對象都有一個字節(jié)的頭部,程序每次運行的時候都不得不從語法上從頭進行分析,除非Zend最優(yōu)化或者開銷被用了。這就是為什么PHP沒有鼓勵使用模塊化程序設(shè)計法的原因。 它的對象向?qū)K也不是非常的可靠。PHP平臺的主要開發(fā)者認識到PHP類的列示要比Java花費了更多的時間。 PHP最大的一個優(yōu)點就是速度,但是程序員不能快速有效的使用對象向?qū)А?/p> 因此老式的程序扥設(shè)計風(fēng)格就被重新使用了,這對小的簡單的項目也許是一個好的解決方法,但是用在高級別的項目上則完全不能令人滿意。事實上,PHP并不是公司級應(yīng)用程序的最合適選擇,因為它只是關(guān)注Web的發(fā)展。 PHP是一個很容易抄襲的語言。許多的初學(xué)者能立即使用數(shù)據(jù)庫功能創(chuàng)作一個簡單Web應(yīng)用程序,而不用花時間去學(xué)習(xí)那些像HTML,HTTP,SQL,關(guān)系數(shù)據(jù)庫和對象向?qū)У鹊冗@樣基礎(chǔ)的必需的規(guī)范。這樣無知的做法將導(dǎo)致你只有很糟糕的技術(shù),這也將會導(dǎo)致你很難戰(zhàn)勝后來的那些問題和失敗所帶給你的痛苦。 從C語言這樣如此變通的語言遺傳來的一些東西,使PHP能產(chǎn)生不同的編程風(fēng)格,于此不同的是一些像Python這樣死板的語言。 事實上的問題是,開發(fā)者想方設(shè)法使用來自不同源的,并且與自己最初的代碼相比是組織好了的完整的代碼。 系統(tǒng)管理員可以使用系統(tǒng)中的很多參數(shù)對PHP配置進行管理,可以通過在php.ini中設(shè)置適當?shù)膮?shù)來改變解析器的行為。一些管理員可以熟練的操作項目,但是有一些管理員不行,這就是為什么成型的配置會損害可移植性。讓我們把"short_open_tag"參數(shù)作為例子來考慮一下。如果它是開啟的,那么PHP腳本的開始標簽就不僅能使用"<?php"作為主要的標準符號,而且也能使用像在XML里一樣的"<?"。當應(yīng)用程序中既使用XML又使用了PHP時,這可不是個好主意,因此大部分服務(wù)器上都將這個功能設(shè)置為禁用了。在這樣的服務(wù)器上還有一些使用了短標簽的應(yīng)用程序不能正確的定位到運行。甚至在PHP官方的文件中,包括在每個發(fā)行版中,都標注著:"為了便于移植,重新分配代碼,請確定沒有使用短標簽。"那么,主要做是為什么呢? 2. 命名規(guī)則和函數(shù)庫兼容性。PHP的命名規(guī)則看起來和Java有些相似,直到了解了令人厭煩的小寫和大寫字母的用法才知道這是不一樣的。PHP的變量和函數(shù)名必須使用小寫字母開頭,類名必須使用大寫字母開頭,常數(shù)名必須由完整的大寫字母組成。在PHP中是很愚蠢的一條就是:變量名是區(qū)分大小寫的,但是函數(shù)名是對大小寫不敏感的。沒有合理的理由可以解釋這是為什么。這會很容易的出現(xiàn)一些很嚴重的漏洞,例子如下所示: <?php FoR( $count = 0 ; $count < 5 ; $Count++ ) { EcHo('Hello <br />'); } ?> 關(guān)鍵詞"for"和函數(shù)名echo是不區(qū)分大小寫的,因此循環(huán)應(yīng)到一直工作直到結(jié)束,而不管其它情況是否發(fā)生。變量$count和$Count在解析器看來是完全不同的,因此將會產(chǎn)生死循環(huán),這將會導(dǎo)致客戶的瀏覽器暫停響應(yīng)。 PHP庫的結(jié)構(gòu)還沒有充分的發(fā)展,并且缺乏兼容性。首先,所有的函數(shù)的命名規(guī)則都不總是一致的。情況是,不友好的函數(shù)在他們的名字中的不同位置有"i"或者"case",例如"strripos()"和"strnatcasecmp()"。在系統(tǒng)中沒有明顯的強調(diào)對不強調(diào),例如:base64_encode( ) vs urlencode( ), 或者strip_tags( ) vs stripslashes( )。 更多關(guān)于矛盾的例子可以在變函數(shù)的前綴和有序參數(shù)中找到。 PHP差不多有4000個函數(shù)。 其中的一些函數(shù)有著很少見的作用,例如phpinfo( ),而且有一些函數(shù)還和其他一個或幾個函數(shù)都有著相同的功能。換句話說,有很多函數(shù)執(zhí)行者相同的功能,因此程序員必須為實際要求選擇更合適的函數(shù)。列表1描述了PHP和Perl之間一些有相同功能函數(shù)數(shù)量的對比,數(shù)據(jù)來源。事實上是,一個好的觀點是PHP提供了非常多的有相似功能的函數(shù),而另一個觀點則是程序員對此稍微有些難以理解。 很多的的數(shù)據(jù)庫訪問函數(shù)(例如:mysql_*type 函數(shù))對于數(shù)據(jù)庫來說不是標準化的。PESR(PHP擴展和應(yīng)用庫)提供了一種DB模式,這是種給出了唯一接口的數(shù)據(jù)庫訪問模式,但是這種模式有它自己缺陷,這是一種代碼的附加層,會減慢運行速度,產(chǎn)生錯誤的可能性也會增加。 最后,PHP不能使用空名字,因此函數(shù)必須有前綴來指出他們的源,這可不是一個好的解決方式。此外,更嚴重的是命名沖突的概率必然會大大增加。 3.差錯處理。PHP為程序的文本錯誤處理提供了"set_error_handler( )"函數(shù),這個函數(shù)運行時可以用來定義一個處理錯誤的方法。處理錯誤的關(guān)鍵之處是找對方向,而且需要異常操作的支持。除此之外,用一個安全的方法處理錯誤,在某種特定的情況下執(zhí)行相應(yīng)的代碼段,這都是很重要的。 直到PHP5發(fā)行,異常處理才被引用,因此是不可能和早期版本相兼容的,但是這不是個大問題,因為早期版本缺少對對象向?qū)еС帧?/p> PHP中的用戶異??梢院苋菀淄ㄟ^內(nèi)置的例外類確定,此外異常處理用一種典型的方式被執(zhí)行,就像在所有會產(chǎn)生異常的語言中做的那樣。PHP中異常處理的缺陷是每當代碼出現(xiàn)問題時,解析器不能自動的丟棄異常事件。這有兩個例子,都是默認為丟棄異常的,例如: ● 用對象構(gòu)造的代碼: ● 使用這種代碼所產(chǎn)生的問題,例如L:使用MySQLi類連接MySQL數(shù)據(jù)庫時會產(chǎn)生嚴重的問題。 在這些事之后,大量的論述被人們拋出,但是直到PHP6發(fā)行,情況也沒有任何改變。PHP中存在大量的缺陷的確是個事實,例如:和老版本不相容,代碼的可讀性很差,但是畢竟它的優(yōu)點要大于它的缺陷,因此它依然是做Web程序設(shè)計的首選。 4.PHP中缺少函數(shù)。PHP提供了各種功能的函數(shù)用來在現(xiàn)代化的平臺上來建立Web應(yīng)用程序。但是,PHP中仍然缺少一些基本的函數(shù),而且大多是缺少像事件和多線程函數(shù)這樣重要的函數(shù)。 4.1.事件。PHP一個很嚴重的缺陷是缺少事件。事件允許程序員給對象附上新的行為。 當遇到某些條件時,事件允許程序員靈活的給對象附上新的行為。這些條件是作為一個事件向外部聲明的。對象向?qū)дZ言支持的事件稍微有一些不同。他們其中的一些使用簡單的方法,像Javascript或者VB.net,其他的則是定位到高級層次的??傊?,建立一個構(gòu)架來模仿事件也是可行的。 事件的本義包含了對象的實例化以及附加上的事件處理器。當事件聯(lián)系被提升時,事件處理器將被執(zhí)行。因此在PHP中支持事件的基本結(jié)構(gòu)需要被建立,這個當前事件必須包含一個類,一個事件的集合,一個事件的處理,一個事件處理的集合,一個允許的事件的類,有意的使用事件。 如果在PHP中能找到支持用戶自定義的事件是多么好的一件事情。 4.2.多線程操作。大部分有代表性的Web服務(wù)器都使用的多線程的多核CPU。合理的配件價格使得小公司趨向于使用多核的Web服務(wù)器。多線程是一種允許應(yīng)用程序更有效的利用他們新特性的方法。這在復(fù)雜的邏輯項目開發(fā)工作中也是一個必須的工具。 PHP不支持多線程,這將在不久的將來成為PHP平臺主要的缺陷。事實上,在PHP的功能函數(shù)中也有幾種多線程操作,但是這是很有限的,而且都是很孤立的。當然,多線程操作是困難的,必須為它提供好的了解死鎖的抽象方法,競態(tài)條件和數(shù)據(jù)鎖。 PHP-Java橋給我們了一個解決方法,就是使用并行的方法多重檢索網(wǎng)頁數(shù)據(jù),以此來代替使用正常的PHP代碼按順序檢索網(wǎng)頁。 5.PHP5發(fā)行之后的平臺開發(fā)。PHP6的開發(fā)應(yīng)該可以回溯到2005年。大家都知道,開發(fā)人員已經(jīng)做了很多的工作,一些基本的缺陷也被克服了。盡管這樣,但是依然還沒有官方發(fā)布的PHP6,這的確花了太長的時間。 一個主要的原因是在PHP開發(fā)團隊內(nèi)部有很多不同的觀點。就問題而言,像安全,異常處理和多線程操作都是很麻煩的一些事情。不管怎樣,PHP6遲早都是要發(fā)行的,但是一些問題仍然沒有得到解決。同時,市場情況也變化的非???,PHP以往普遍的增長已經(jīng)停止了。SourceForge.net門戶主辦了上千的項目,快速搜索它的數(shù)據(jù)庫可以顯示注冊項目之間的比例 這是顯而易見的,Java和PHP各自保持著自己的位置,差距稍微有一點縮小,發(fā)展最快的平臺是.NET平臺。當然,大量的項目并不是決定性的條件,但是這些數(shù)據(jù)依然是很有象征性的。 助了國家脆弱性數(shù)據(jù)庫。這是美國政府基于脆弱性管理的標準數(shù)據(jù)庫。對脆弱性問題進行檢索,將展示出與之相匹配的記錄:PHP-8167,Java-1196,ASP-1196.這并不令人驚訝,大量的與Java有關(guān)的問題絕對不會少于其他的語言,但是PHP與其他語言相比有著巨大的領(lǐng)先優(yōu)勢。 意見和今后需要做的工作 如今,PHP也許是Web開發(fā)中最流行的平臺。它在初學(xué)者之間很流行,然而,這將會是一件很讓人焦慮的事情。如果主要的脆弱部件--PHP腳本不被調(diào)查,損害典型的LAMP服務(wù)器就將變得非常容易。事實就是,在PHP應(yīng)用程序中找出了大量的脆弱性因數(shù),這不僅僅是語言本身的,這也將導(dǎo)致很糟糕的程序設(shè)計。這其中的一些示例已經(jīng)被寫出來了,而網(wǎng)絡(luò)新手來是很容易獲得的這些代碼的。也許現(xiàn)在是時候使著個語言變得更好了,它已經(jīng)生了很多有安全隱患和錯誤的實例了。 PHP在其他方面也是缺乏支持的,這主要是指在Web開發(fā)平臺的競爭中很必要的一些特性。在這些問題被找出之后,必然會有一場廣泛的討論將繼續(xù)下去,直到有明確的結(jié)果為止。 一些PHP中主要的缺陷已經(jīng)經(jīng)過商討,并被克服了。但是在短時間內(nèi),大部分的缺陷會存在著,因為,如果用其他方法,PHP的受歡迎程度必然會受到很大的影響。唯一的方法就是,PHP不僅要擺正自己的位置,而且還要面對即將來臨的挑戰(zhàn)。
信息發(fā)布:廣州名易軟件有限公司 http://m.jetlc.com
|