- 相關(guān)推薦
重新認(rèn)識(shí)PHP框架
有很多我們已經(jīng)認(rèn)識(shí)和了解的東西,有時(shí)候又會(huì)帶給我們不一樣的感覺(jué),以下是百分網(wǎng)小編精心為大家整理的PHP框架的重新認(rèn)識(shí),從一個(gè)全新的角度來(lái)詮釋PHP框架。更多內(nèi)容請(qǐng)關(guān)注應(yīng)屆畢業(yè)生網(wǎng)!
有人認(rèn)為,PHP是每次請(qǐng)求都要初始化資源,這個(gè)開(kāi)銷(xiāo)非常大。由此,PHP不適合使用開(kāi)發(fā)框架。對(duì)于PHP,確實(shí)沒(méi)有類(lèi)的持久化,使得每次請(qǐng)求都要初始化資源,但是,這并不是開(kāi)銷(xiāo)的主要問(wèn)題所在。最主要的問(wèn)題,是在于開(kāi)發(fā)PHP框架的人,對(duì)PHP本身的特性了解多少。最簡(jiǎn)單的,MVC需要檢測(cè)UA,如果使用PHP自帶的get_browser函數(shù),那肯定是死定了。因?yàn),使用上的方便與簡(jiǎn)單,導(dǎo)致的是性能的開(kāi)銷(xiāo)。 認(rèn)為不可使用PHP開(kāi)發(fā)框架的,還有的觀點(diǎn)是:由于需要每次請(qǐng)求的時(shí)候初始化整個(gè)框架。其實(shí),這也是一種誤解。如果好好看看PHP源碼,就會(huì)了解,PHP是按請(qǐng)求加載需要運(yùn)行的文件,并不是整個(gè)框架。所以,對(duì)于框架本身,哪一種框架內(nèi)核代碼時(shí)越小,性能越好。
還有觀點(diǎn):由于PHP這種每請(qǐng)求初始化資源的機(jī)制,也造成了PHP添加跨請(qǐng)求的高級(jí)特性相當(dāng)困難。其實(shí),跨請(qǐng)求本身,要看在哪一個(gè)層面。PHP提供了各類(lèi)加速的緩存機(jī)制。雖然PHP的類(lèi)是由于目前序列化函數(shù)仍有限制,不能持久化,但數(shù)據(jù)緩存對(duì)PHP的加速是相當(dāng)快的。所以,認(rèn)為由于這一限制,就使得PHP 只能是一個(gè)保持在一個(gè)比較簡(jiǎn)單的web語(yǔ)言上面,這無(wú)疑更是錯(cuò)誤的。PHP不乏大型的高速與高效的網(wǎng)站。并不是這些網(wǎng)站底層就沒(méi)有框架。
另外,還有輕信什么測(cè)試的結(jié)果。對(duì)于測(cè)試結(jié)果,我覺(jué)得,沒(méi)有一絲一毫的可信度。我們無(wú)法相信這些測(cè)試結(jié)果,主要原因有這么幾個(gè)方面。其一,PHP環(huán)境配置,是不是最優(yōu)化配置?第二,測(cè)試結(jié)果中所選框架,是不是最優(yōu)框架?僅拿CI與CAKE兩者來(lái)說(shuō),CI的日志,沒(méi)有多種輸出,只有文件輸出。這對(duì)于大型網(wǎng)站的管理是極不方便的。但是,如果將其改用LOG4PHP,那性能上的損失將會(huì)是多少,是不可想象的。原因在于,LOG4PHP是完全照抄的Java。至于CAKE,更是完全照抄RAILS。完全不顧及PHP的性能與語(yǔ)言本身的特性。比如最簡(jiǎn)單的,大量靜態(tài)方法的使用。勢(shì)必造成以空間換時(shí)間。CAKE中無(wú)處不在的靜態(tài)方法,導(dǎo)致了內(nèi)存中堆積大量的類(lèi)。這種以空間換時(shí)間,是速度加快了,還是性能損失了,有多少人真正系統(tǒng)測(cè)試過(guò)?CAKE讓RUBY的人了解PHP是對(duì)PHP的一個(gè)促進(jìn),同時(shí),RAILS框架,也使得PHP框架得以注入新的血液,增加了新的開(kāi)發(fā)思路。但,完全照抄是 PHP目前最大的悲劇。這個(gè)當(dāng)中的經(jīng)典之作:CAKE:RUBY ON RAILS, SMARTY: Java STRRUTS LOG4PHP:JAVA LOG4J,可悲的是,寫(xiě)這些抄襲之作的作者,都是對(duì)PHP不太了解,大量照搬RUBY,JAVA中的算法與函數(shù),有些可以算是翻譯,比如, LOG4PHP中的PROPERTIIES文件的處理就是這樣,不必再舉更多的實(shí)例了。為什么不能把JSF,或TYPESTRY也抄到PHP中,這是因?yàn),如果沒(méi)有很好的PHP功底,這幾乎是不可能的。因?yàn),這兩個(gè)東西,如果也是照抄過(guò)來(lái),勢(shì)必慢如蝸牛。
再有,夢(mèng)想不用PHP框架開(kāi)發(fā)大型網(wǎng)站,肯定是錯(cuò)上加錯(cuò)。WORDPRESS,DISCUZ這類(lèi)無(wú)框架,無(wú)架構(gòu)的極端糟糕的代碼,網(wǎng)上已屢見(jiàn)不鮮。
要訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),最小的需求,也要把數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)封裝成一個(gè)類(lèi)吧?要進(jìn)行錯(cuò)誤與異常管理,也需要一個(gè)類(lèi)吧?如果是大型的網(wǎng)站,總要有錯(cuò)誤日志輸出,以方便調(diào)視與運(yùn)行監(jiān)視吧。所以這些,拼一下,也算是PHP開(kāi)發(fā)框架呀。
看樣子,否認(rèn)PHP應(yīng)當(dāng)有框架的人,肯定也就認(rèn)定,PHP做不了大網(wǎng)站;蛘哒f(shuō),認(rèn)定,PHP做大網(wǎng)站,也是垃圾架構(gòu)。這可能是太武斷了。
凡認(rèn)為PHP是反框架的,實(shí)際上,是不了解PHP語(yǔ)言的一些瓶頸在何處,無(wú)法寫(xiě)出高效的框架,所以,才這樣認(rèn)為的。
【拓展閱讀】 PHP 安全編程建議
簡(jiǎn)介
要提供互聯(lián)網(wǎng)服務(wù),當(dāng)你在開(kāi)發(fā)代碼的時(shí)候必須時(shí)刻保持安全意識(shí)?赡艽蟛糠 PHP 腳本都對(duì)安全問(wèn)題都不在意,這很大程度上是因?yàn)橛写罅康臒o(wú)經(jīng)驗(yàn)程序員在使用這門(mén)語(yǔ)言。但是,沒(méi)有理由讓你因?yàn)閷?duì)你的代碼的不確定性而導(dǎo)致不一致的安全策略。當(dāng)你在服務(wù)器上放任何涉及到錢(qián)的東西時(shí),就有可能會(huì)有人嘗試破解它。創(chuàng)建一個(gè)論壇程序或者任何形式的購(gòu)物車(chē),被攻擊的可能性就上升到了無(wú)窮大。
背景
為了確保你的 web 內(nèi)容安全,這里有一些常規(guī)的安全準(zhǔn)則:
別相信表單
攻擊表單很簡(jiǎn)單。通過(guò)使用一個(gè)簡(jiǎn)單的 JavaScript 技巧,你可以限制你的表單只允許在評(píng)分域中填寫(xiě) 1 到 5 的數(shù)字。如果有人關(guān)閉了他們?yōu)g覽器的 JavaScript 功能或者提交自定義的表單數(shù)據(jù),你客戶(hù)端的驗(yàn)證就失敗了。
用戶(hù)主要通過(guò)表單參數(shù)和你的腳本交互,因此他們是最大的安全風(fēng)險(xiǎn)。你應(yīng)該學(xué)到什么呢?在 PHP 腳本中,總是要驗(yàn)證 傳遞給任何 PHP 腳本的數(shù)據(jù)。在本文中,我們向你演示了如何分析和防范跨站腳本(XSS)攻擊,它可能會(huì)劫持用戶(hù)憑據(jù)(甚至更嚴(yán)重)。你也會(huì)看到如何防止會(huì)玷污或毀壞你數(shù)據(jù)的 MySQL 注入攻擊。
別相信用戶(hù)
假定你網(wǎng)站獲取的每一份數(shù)據(jù)都充滿(mǎn)了有害的代碼。清理每一部分,即便你相信沒(méi)有人會(huì)嘗試攻擊你的站點(diǎn)。
關(guān)閉全局變量
你可能會(huì)有的最大安全漏洞是啟用了 register_globals 配置參數(shù)。幸運(yùn)的是,PHP 4.2 及以后版本默認(rèn)關(guān)閉了這個(gè)配置。如果打開(kāi)了 register_globals,你可以在你的 php.ini 文件中通過(guò)改變 register_globals 變量為 Off 關(guān)閉該功能:
register_globals = Off
新手程序員覺(jué)得注冊(cè)全局變量很方便,但他們不會(huì)意識(shí)到這個(gè)設(shè)置有多么危險(xiǎn)。一個(gè)啟用了全局變量的服務(wù)器會(huì)自動(dòng)為全局變量賦任何形式的參數(shù)。為了了解它如何工作以及為什么有危險(xiǎn),讓我們來(lái)看一個(gè)例子。
假設(shè)你有一個(gè)稱(chēng)為 process.php 的腳本,它會(huì)向你的數(shù)據(jù)庫(kù)插入表單數(shù)據(jù)。初始的表單像下面這樣:
運(yùn)行 process.php 的時(shí)候,啟用了注冊(cè)全局變量的 PHP 會(huì)將該參數(shù)賦值到 $username 變量。這會(huì)比通過(guò) $_POST['username'] 或 $_GET['username'] 訪(fǎng)問(wèn)它節(jié)省擊鍵次數(shù)。不幸的是,這也會(huì)給你留下安全問(wèn)題,因?yàn)?PHP 會(huì)設(shè)置該變量的值為通過(guò) GET 或 POST 的參數(shù)發(fā)送到腳本的任何值,如果你沒(méi)有顯示地初始化該變量并且你不希望任何人去操作它,這就會(huì)有一個(gè)大問(wèn)題。
看下面的腳本,假如 $authorized 變量的值為 true,它會(huì)給用戶(hù)顯示通過(guò)驗(yàn)證的數(shù)據(jù)。正常情況下,只有當(dāng)用戶(hù)正確通過(guò)了這個(gè)假想的 authenticated_user() 函數(shù)驗(yàn)證,$authorized 變量的值才會(huì)被設(shè)置為真。但是如果你啟用了 register_globals,任何人都可以發(fā)送一個(gè) GET 參數(shù),例如 authorized=1 去覆蓋它:
// Define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
?>
這個(gè)故事的寓意是,你應(yīng)該從預(yù)定義的服務(wù)器變量中獲取表單數(shù)據(jù)。所有通過(guò) post 表單傳遞到你 web 頁(yè)面的數(shù)據(jù)都會(huì)自動(dòng)保存到一個(gè)稱(chēng)為 $_POST 的大數(shù)組中,所有的 GET 數(shù)據(jù)都保存在 $_GET 大數(shù)組中。文件上傳信息保存在一個(gè)稱(chēng)為 $_FILES 的特殊數(shù)據(jù)中。另外,還有一個(gè)稱(chēng)為 $_REQUEST 的復(fù)合變量。
要從一個(gè) POST 方法表單中訪(fǎng)問(wèn) username 字段,可以使用 $_POST['username']。如果 username 在 URL 中就使用 $_GET['username']。如果你不確定值來(lái)自哪里,用 $_REQUEST['username']。
$post_value = $_POST['post_value'];
$get_value = $_GET['get_value'];
$some_variable = $_REQUEST['some_value'];
?>
$_REQUEST 是 $_GET、$_POST、和 $_COOKIE 數(shù)組的結(jié)合。如果你有兩個(gè)或多個(gè)值有相同的參數(shù)名稱(chēng),注意 PHP 會(huì)使用哪個(gè)。默認(rèn)的順序是 cookie、POST、然后是 GET。
推薦安全配置選項(xiàng)
這里有幾個(gè)會(huì)影響安全功能的 PHP 配置設(shè)置。下面是一些顯然應(yīng)該用于生產(chǎn)服務(wù)器的:
register_globals 設(shè)置為 off
safe_mode 設(shè)置為 off
error_reporting 設(shè)置為 off。如果出現(xiàn)錯(cuò)誤了,這會(huì)向用戶(hù)瀏覽器發(fā)送可見(jiàn)的錯(cuò)誤報(bào)告信息。對(duì)于生產(chǎn)服務(wù)器,使用錯(cuò)誤日志代替。開(kāi)發(fā)服務(wù)器如果在防火墻后面就可以啟用錯(cuò)誤日志。(LCTT 譯注:此處據(jù)原文邏輯和常識(shí),應(yīng)該是“開(kāi)發(fā)服務(wù)器如果在防火墻后面就可以啟用錯(cuò)誤報(bào)告,即 on。”)
停用這些函數(shù):system()、exec()、passthru()、shell_exec()、proc_open()、和 popen()。
open_basedir 為 /tmp(以便保存會(huì)話(huà)信息)目錄和 web 根目錄,以便腳本不能訪(fǎng)問(wèn)這些選定區(qū)域外的文件。
expose_php 設(shè)置為 off。該功能會(huì)向 Apache 頭添加包含版本號(hào)的 PHP 簽名。
allow_url_fopen 設(shè)置為 off。如果你能夠注意你代碼中訪(fǎng)問(wèn)文件的方式-也就是你驗(yàn)證所有輸入?yún)?shù),這并不嚴(yán)格需要。
allow_url_include 設(shè)置為 off。對(duì)于任何人來(lái)說(shuō),實(shí)在沒(méi)有明智的理由會(huì)想要訪(fǎng)問(wèn)通過(guò) HTTP 包含的文件。
一般來(lái)說(shuō),如果你發(fā)現(xiàn)想要使用這些功能的代碼,你就不應(yīng)該相信它。尤其要小心會(huì)使用類(lèi)似 system() 函數(shù)的代碼-它幾乎肯定有缺陷。
啟用了這些設(shè)置后,讓我們來(lái)看看一些特定的攻擊以及能幫助你保護(hù)你服務(wù)器的方法。
【重新認(rèn)識(shí)PHP框架】相關(guān)文章:
PHP框架的概念07-11
如何使用PHP框架09-12
php框架Phpbean說(shuō)明09-30
PHP框架是什么09-23
php常見(jiàn)的框架及優(yōu)缺點(diǎn)07-31
php語(yǔ)言能用框架嗎09-05
PHP框架:CodeIgniter框架備份數(shù)據(jù)庫(kù)11-03
php中的socket框架性能分析07-17