|
從代碼級(jí)別上,也就是應(yīng)用層次上考慮代碼安全的話(也就是不考慮底層的語(yǔ)言本身等問(wèn)題的漏洞),腳本安全問(wèn)題就是函數(shù)和變量的問(wèn)題。變量直接或者間接的接收用戶不安全的的輸入,由于php本身的特性,在php中更容易發(fā)現(xiàn)這種變量的混亂(很多php程序都用來(lái)定義以及初始化以及接收變量,可以直接在程序中使用$id這樣的變量,初始化完全由php的設(shè)置來(lái)完成,如果稍不注意,就可能導(dǎo)致變量的混亂從而導(dǎo)致攻擊)。
變量接收不安全的輸入之后,沒(méi)有做恰當(dāng)?shù)倪^(guò)濾又用在不同的地方,就可能造成不同的危害。如果直接進(jìn)入數(shù)據(jù)庫(kù)然后顯示給用戶就會(huì)導(dǎo)致跨站腳本攻擊,如果用在 sql語(yǔ)句中就可能導(dǎo)致 Sql注射攻擊,這幾種攻擊都是是與具體的腳本語(yǔ)言無(wú)關(guān)的,在各種腳本語(yǔ)言里都可能存在。由于php的變量很靈活,這些有害的變量如果用在一些邏輯語(yǔ)句中,就會(huì)導(dǎo)致關(guān)鍵代碼的跳過(guò)如身份驗(yàn)證失敗和跳過(guò)一些變量的初始化從而導(dǎo)致程序邏輯混亂而產(chǎn)生其他漏洞。如果這個(gè)變量用在了危險(xiǎn)的函數(shù)如include等等當(dāng)中,當(dāng)然就會(huì)出現(xiàn)文件包含漏洞,出現(xiàn)在fopen函數(shù)里就會(huì)可能產(chǎn)生寫文件的漏洞,出現(xiàn)在mysql_query函數(shù)中就是 Sql注射漏洞,eval以及preg_replace中可能導(dǎo)致代碼的執(zhí)行,出現(xiàn)在htmlspecia函數(shù)中可能導(dǎo)致出錯(cuò)而絕對(duì)路徑泄露 變量出現(xiàn)的環(huán)境決定了它可能的危害。
思考了問(wèn)題的存在,那么如何從代碼級(jí)別上檢查這種漏洞呢?當(dāng)然熟悉熟悉php語(yǔ)言是最基本的,也應(yīng)該是抓住函數(shù)和變量,危險(xiǎn)的函數(shù)里如果有變量那么請(qǐng)確定這個(gè)變量的來(lái)源,是否正確的初始化,初始化之后是否能被用戶注入敏感字符,在進(jìn)入函數(shù)前這些敏感的字符是否得到了徹底的清除。對(duì)于代碼審核工作的難點(diǎn)可能就在于對(duì)變量來(lái)源的確定,這需要對(duì)php特性以及你所審核的代碼的熟悉,但也并不是所有的變量的來(lái)源都清晰可見,可能一些初始化的代碼并沒(méi)有像想象中運(yùn)行,一些變量里的東西可能也來(lái)自于你并不想他來(lái)的地方,還有一些變量可能來(lái)自于數(shù)據(jù)庫(kù)或者系統(tǒng)的配置文件,但是很可能數(shù)據(jù)庫(kù)和配置文件在之前就已經(jīng)被修改,或者在后面不安全的操作了這些變量,這些變量也是不可相信的。下面我們就按照變量與函數(shù)的思路來(lái)思考腳本代碼的安全。
二 變量來(lái)自哪里?
1 顯示的輸入
叫變量來(lái)自哪里其實(shí)也就是說(shuō)威脅來(lái)自哪里,只是從web上考慮的話,什么樣的網(wǎng)站最安全?很明顯,那些只提供靜態(tài)Html頁(yè)面的網(wǎng)站是最安全的,因?yàn)檫@樣的網(wǎng)站不與瀏覽者進(jìn)行任何交互,就好比打劫一個(gè)密不透風(fēng)的銀行,很難實(shí)現(xiàn),但是對(duì)于一個(gè)大的論壇或者腳本程序就不一樣了,你登陸的時(shí)候需要傳遞用戶名和密碼這些變量給服務(wù)器,甚至包括你登陸的Ip與瀏覽器等等都是程序抓取的對(duì)象,抓取一次與服務(wù)器交互的過(guò)程如發(fā)表帖子等等你就發(fā)現(xiàn)瀏覽器與服務(wù)器之間進(jìn)行的數(shù)據(jù)傳輸,你可能看得見的包括提交的表單,地址欄參數(shù)等等,你看不見的包括Cookie,Http頭都是提交數(shù)據(jù)也就是變量的地方。這些地方也是服務(wù)器處理數(shù)據(jù)最原始的入口。那么php程序是如何接受變量的呢?所有提交的變量都被php保存在了一些數(shù)組里,包括
$_GET
$_POST
$_COOKIE
$_FILES
$_SERVER
為了最初的方便與靈活,在php的設(shè)置里有這么個(gè)選項(xiàng)
register_globals
當(dāng)這個(gè)選項(xiàng)為on的時(shí)候,上面出現(xiàn)的那些變量都會(huì)成為$GLOBALS中的一員,在腳本中都不需要再取得就可以直接使用,并且以
variables_order
的順序覆蓋。很多程序考慮到了register_globals為off的情況,于是在程序初始化的時(shí)候使用如下的代碼:
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
這些代碼起到了register_globals的作用,作用也是將POST和GET的內(nèi)容釋放出去做為全局變量,但是危險(xiǎn)可能更大,后面會(huì)提到。
php技術(shù):腳本安全的本質(zhì)_PHP+MYSQL第1/3頁(yè),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。