腳本安全的本質(zhì)_PHP+MYSQL第1/3頁
更新時(shí)間:2008年10月03日 20:21:00 作者:
從代碼級別上,也就是應(yīng)用層次上考慮代碼安全的話(也就是不考慮底層的語言本身等問題的漏洞),腳本安全問題就是函數(shù)和變量的問題。
一 前言 問題的存在
從代碼級別上,也就是應(yīng)用層次上考慮代碼安全的話(也就是不考慮底層的語言本身等問題的漏洞),腳本安全問題就是函數(shù)和變量的問題。變量直接或者間接的接收用戶不安全的的輸入,由于php本身的特性,在php中更容易發(fā)現(xiàn)這種變量的混亂(很多php程序都用來定義以及初始化以及接收變量,可以直接在程序中使用$id這樣的變量,初始化完全由php的設(shè)置來完成,如果稍不注意,就可能導(dǎo)致變量的混亂從而導(dǎo)致攻擊)。
變量接收不安全的輸入之后,沒有做恰當(dāng)?shù)倪^濾又用在不同的地方,就可能造成不同的危害。如果直接進(jìn)入數(shù)據(jù)庫然后顯示給用戶就會導(dǎo)致跨站腳本攻擊,如果用在 sql語句中就可能導(dǎo)致 Sql注射攻擊,這幾種攻擊都是是與具體的腳本語言無關(guān)的,在各種腳本語言里都可能存在。由于php的變量很靈活,這些有害的變量如果用在一些邏輯語句中,就會導(dǎo)致關(guān)鍵代碼的跳過如身份驗(yàn)證失敗和跳過一些變量的初始化從而導(dǎo)致程序邏輯混亂而產(chǎn)生其他漏洞。如果這個(gè)變量用在了危險(xiǎn)的函數(shù)如include等等當(dāng)中,當(dāng)然就會出現(xiàn)文件包含漏洞,出現(xiàn)在fopen函數(shù)里就會可能產(chǎn)生寫文件的漏洞,出現(xiàn)在mysql_query函數(shù)中就是 Sql注射漏洞,eval以及preg_replace中可能導(dǎo)致代碼的執(zhí)行,出現(xiàn)在htmlspecia函數(shù)中可能導(dǎo)致出錯(cuò)而絕對路徑泄露 變量出現(xiàn)的環(huán)境決定了它可能的危害。
思考了問題的存在,那么如何從代碼級別上檢查這種漏洞呢?當(dāng)然熟悉熟悉php語言是最基本的,也應(yīng)該是抓住函數(shù)和變量,危險(xiǎn)的函數(shù)里如果有變量那么請確定這個(gè)變量的來源,是否正確的初始化,初始化之后是否能被用戶注入敏感字符,在進(jìn)入函數(shù)前這些敏感的字符是否得到了徹底的清除。對于代碼審核工作的難點(diǎn)可能就在于對變量來源的確定,這需要對php特性以及你所審核的代碼的熟悉,但也并不是所有的變量的來源都清晰可見,可能一些初始化的代碼并沒有像想象中運(yùn)行,一些變量里的東西可能也來自于你并不想他來的地方,還有一些變量可能來自于數(shù)據(jù)庫或者系統(tǒng)的配置文件,但是很可能數(shù)據(jù)庫和配置文件在之前就已經(jīng)被修改,或者在后面不安全的操作了這些變量,這些變量也是不可相信的。下面我們就按照變量與函數(shù)的思路來思考腳本代碼的安全。
二 變量來自哪里?
1 顯示的輸入
叫變量來自哪里其實(shí)也就是說威脅來自哪里,只是從web上考慮的話,什么樣的網(wǎng)站最安全?很明顯,那些只提供靜態(tài)Html頁面的網(wǎng)站是最安全的,因?yàn)檫@樣的網(wǎng)站不與瀏覽者進(jìn)行任何交互,就好比打劫一個(gè)密不透風(fēng)的銀行,很難實(shí)現(xiàn),但是對于一個(gè)大的論壇或者腳本程序就不一樣了,你登陸的時(shí)候需要傳遞用戶名和密碼這些變量給服務(wù)器,甚至包括你登陸的Ip與瀏覽器等等都是程序抓取的對象,抓取一次與服務(wù)器交互的過程如發(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)的那些變量都會成為$GLOBALS中的一員,在腳本中都不需要再取得就可以直接使用,并且以
variables_order
的順序覆蓋。很多程序考慮到了register_globals為off的情況,于是在程序初始化的時(shí)候使用如下的代碼:
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
這些代碼起到了register_globals的作用,作用也是將POST和GET的內(nèi)容釋放出去做為全局變量,但是危險(xiǎn)可能更大,后面會提到。
從代碼級別上,也就是應(yīng)用層次上考慮代碼安全的話(也就是不考慮底層的語言本身等問題的漏洞),腳本安全問題就是函數(shù)和變量的問題。變量直接或者間接的接收用戶不安全的的輸入,由于php本身的特性,在php中更容易發(fā)現(xiàn)這種變量的混亂(很多php程序都用來定義以及初始化以及接收變量,可以直接在程序中使用$id這樣的變量,初始化完全由php的設(shè)置來完成,如果稍不注意,就可能導(dǎo)致變量的混亂從而導(dǎo)致攻擊)。
變量接收不安全的輸入之后,沒有做恰當(dāng)?shù)倪^濾又用在不同的地方,就可能造成不同的危害。如果直接進(jìn)入數(shù)據(jù)庫然后顯示給用戶就會導(dǎo)致跨站腳本攻擊,如果用在 sql語句中就可能導(dǎo)致 Sql注射攻擊,這幾種攻擊都是是與具體的腳本語言無關(guān)的,在各種腳本語言里都可能存在。由于php的變量很靈活,這些有害的變量如果用在一些邏輯語句中,就會導(dǎo)致關(guān)鍵代碼的跳過如身份驗(yàn)證失敗和跳過一些變量的初始化從而導(dǎo)致程序邏輯混亂而產(chǎn)生其他漏洞。如果這個(gè)變量用在了危險(xiǎn)的函數(shù)如include等等當(dāng)中,當(dāng)然就會出現(xiàn)文件包含漏洞,出現(xiàn)在fopen函數(shù)里就會可能產(chǎn)生寫文件的漏洞,出現(xiàn)在mysql_query函數(shù)中就是 Sql注射漏洞,eval以及preg_replace中可能導(dǎo)致代碼的執(zhí)行,出現(xiàn)在htmlspecia函數(shù)中可能導(dǎo)致出錯(cuò)而絕對路徑泄露 變量出現(xiàn)的環(huán)境決定了它可能的危害。
思考了問題的存在,那么如何從代碼級別上檢查這種漏洞呢?當(dāng)然熟悉熟悉php語言是最基本的,也應(yīng)該是抓住函數(shù)和變量,危險(xiǎn)的函數(shù)里如果有變量那么請確定這個(gè)變量的來源,是否正確的初始化,初始化之后是否能被用戶注入敏感字符,在進(jìn)入函數(shù)前這些敏感的字符是否得到了徹底的清除。對于代碼審核工作的難點(diǎn)可能就在于對變量來源的確定,這需要對php特性以及你所審核的代碼的熟悉,但也并不是所有的變量的來源都清晰可見,可能一些初始化的代碼并沒有像想象中運(yùn)行,一些變量里的東西可能也來自于你并不想他來的地方,還有一些變量可能來自于數(shù)據(jù)庫或者系統(tǒng)的配置文件,但是很可能數(shù)據(jù)庫和配置文件在之前就已經(jīng)被修改,或者在后面不安全的操作了這些變量,這些變量也是不可相信的。下面我們就按照變量與函數(shù)的思路來思考腳本代碼的安全。
二 變量來自哪里?
1 顯示的輸入
叫變量來自哪里其實(shí)也就是說威脅來自哪里,只是從web上考慮的話,什么樣的網(wǎng)站最安全?很明顯,那些只提供靜態(tài)Html頁面的網(wǎng)站是最安全的,因?yàn)檫@樣的網(wǎng)站不與瀏覽者進(jìn)行任何交互,就好比打劫一個(gè)密不透風(fēng)的銀行,很難實(shí)現(xiàn),但是對于一個(gè)大的論壇或者腳本程序就不一樣了,你登陸的時(shí)候需要傳遞用戶名和密碼這些變量給服務(wù)器,甚至包括你登陸的Ip與瀏覽器等等都是程序抓取的對象,抓取一次與服務(wù)器交互的過程如發(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)的那些變量都會成為$GLOBALS中的一員,在腳本中都不需要再取得就可以直接使用,并且以
variables_order
的順序覆蓋。很多程序考慮到了register_globals為off的情況,于是在程序初始化的時(shí)候使用如下的代碼:
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
這些代碼起到了register_globals的作用,作用也是將POST和GET的內(nèi)容釋放出去做為全局變量,但是危險(xiǎn)可能更大,后面會提到。
相關(guān)文章
php json轉(zhuǎn)換成數(shù)組形式代碼分享
這篇文章主要介紹了php json轉(zhuǎn)換成數(shù)組形式代碼分享,需要的朋友可以參考下2014-11-11php+mysql事務(wù)rollback&commit示例
執(zhí)行BEGIN之后,其作用同set autocommit=0,而且之后設(shè)置set autocommit=0或1時(shí)無效。所以,為使操作清楚,一般不使用BEGIN。2010-02-02PHP設(shè)置一邊執(zhí)行一邊輸出結(jié)果的代碼
這篇文章主要介紹了PHP中設(shè)置一邊執(zhí)行一邊輸出結(jié)果的實(shí)現(xiàn)代碼,需要的朋友可以參考下2013-09-09phpMyAdmin出現(xiàn)無法載入 mcrypt 擴(kuò)展,請檢查PHP配置的解決方法
出現(xiàn)以下幾種情況后可能會造成運(yùn)行phpmyadmin程序提示 無法載入 mcrypt 擴(kuò)展,請檢查 PHP 配置 的 錯(cuò)誤提示2012-03-03PHP運(yùn)行SVN命令顯示某用戶的文件更新記錄的代碼
使用SVN開發(fā)者們平時(shí)開發(fā)或代碼上線過程中需要知道某個(gè)時(shí)間段內(nèi)修改或添加過那些文件,所以用PHP寫了個(gè)小程序,直接在瀏覽器中調(diào)用即可2014-01-01