腳本安全的本質(zhì)_PHP+MYSQL第2/3頁(yè)
更新時(shí)間:2008年10月03日 20:21:00 作者:
從代碼級(jí)別上,也就是應(yīng)用層次上考慮代碼安全的話(也就是不考慮底層的語(yǔ)言本身等問(wèn)題的漏洞),腳本安全問(wèn)題就是函數(shù)和變量的問(wèn)題。
2 隱式的輸入
上面這些是最原始的,沒(méi)有經(jīng)過(guò)程序轉(zhuǎn)換的數(shù)據(jù),程序很多地方用到的變量都來(lái)自這里,但也不表示其他的地方?jīng)]有變量傳遞過(guò)來(lái),下面有一個(gè)數(shù)據(jù)傳遞的模式:
用戶傳遞的數(shù)據(jù)===========>數(shù)據(jù)庫(kù)===========>程序代碼處理=======>程序代碼
這個(gè)模式的意思是用戶的輸入可能先進(jìn)入了數(shù)據(jù)庫(kù),然后程序從數(shù)據(jù)庫(kù)再取得這個(gè)輸入送入某些危險(xiǎn)的函數(shù)執(zhí)行,一般的程序員都會(huì)有一個(gè)意識(shí)認(rèn)為從數(shù)據(jù)庫(kù)中取得的變量是安全的,但是事實(shí)并不如此,只要某些敏感字符最終送入到程序代碼中,不管他中間停留在什么地方,都是危險(xiǎn)的。與存儲(chǔ)在數(shù)據(jù)庫(kù)中類(lèi)似的情況是,一些程序把用戶的輸入放到文件中,如緩存文件,然后在必要的時(shí)候從里面取得,如果太過(guò)相信這些地方來(lái)的變量,這樣還是會(huì)導(dǎo)致問(wèn)題的。
3 變量覆蓋
還有很多的時(shí)候,程序收到的變量很可能來(lái)自他不應(yīng)該來(lái)的地方,譬如Dz的代碼:
$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
$_FILES = daddslashes($_FILES);
}
這樣之后,你還覺(jué)得$_FILES是原來(lái)的$_FILES了么?如果我們建立一個(gè)_FILES的表單或者干脆在url里加上 php?_FILES[]=ddddd,這樣之后$_FILES已經(jīng)完全被覆蓋了,然后你代碼里引用的$_FILES就不是原來(lái)的了,在Dz以前的版本中曾經(jīng)出現(xiàn)過(guò)這個(gè)問(wèn)題。這應(yīng)該屬于變量覆蓋的問(wèn)題,把初始化的那個(gè)文件放大來(lái)看看吧:
復(fù)制代碼 代碼如下:
$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
$_FILES = daddslashes($_FILES);
}
$charset = $dbcharset = '';
$plugins = $hooks = array();
require_once DISCUZ_ROOT.'./config.inc.php';
require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';
if($attackevasive) {
require_once DISCUZ_ROOT.'./include/security.inc.php';
}
這樣貌似是沒(méi)有問(wèn)題的,但是滿足一定的條件的話還是可能出問(wèn)題,假設(shè)register_globals為on的話,我們進(jìn)入全局的變量不只是$_GET 和$_POST吧!包括$_COOKIE和$_FILES以及$_SERVER都是會(huì)在全局?jǐn)?shù)組中產(chǎn)生變量的,通過(guò)上面的語(yǔ)句,我們提交一個(gè) php?_SERVER[PHP_SELF]就可以覆蓋掉_SERVER數(shù)組,那么整個(gè)程序中的$_SERVER數(shù)組都是不可以相信的了。我也見(jiàn)過(guò)這樣寫(xiě)的代碼:
復(fù)制代碼 代碼如下:
require_once ROOT_PATH.'inc/database_config.php';
require_once
ROOT_PATH.'inc/dv_spacemain.php';
if(PHP_VERSION < '4.1.0') {
$_GET = &$HTTP_GET_VARS;
$_POST = &$HTTP_POST_VARS;
$_COOKIE = &$HTTP_COOKIE_VARS;
$_SERVER = &$HTTP_SERVER_VARS;
$_ENV = &$HTTP_ENV_VARS;
$_FILES = &$HTTP_POST_FILES;
$_SESSION =& $HTTP_SESSION_VARS;
}
$magic_quotes_gpc = get_magic_quotes_gpc();
$register_globals = @ini_get('register_globals');
if(!$register_globals || !$magic_quotes_gpc) {
@extract(i_addslashes($_POST));
@extract(i_addslashes($_GET));
@extract(i_addslashes($_COOKIE));
if(!$magic_quotes_gpc) {
$_FILES = i_addslashes($_FILES);
}
}
同樣是在系統(tǒng)初始化的地方,但是變量的釋放是在
require_once ROOT_PATH.'inc/general_funcs.php';
require_once ROOT_PATH.'inc/dv_spacemain.php';
這些關(guān)鍵變量初始化之后,那么我們完全可以提交一個(gè)?$host=xxx.xxx.xxx.xxx這樣的東西覆蓋掉系統(tǒng)自己的數(shù)據(jù)庫(kù)初始化文件里的數(shù)據(jù)庫(kù)地址變量,然后就可以
4 變量感染
這個(gè)很容易理解,當(dāng)一個(gè)變量不安全的時(shí)候,與之有關(guān)的賦值等操作都是不安全的,譬如:
$id = $_GET[id];
..
$articleid = $id;
實(shí)際過(guò)程中可能沒(méi)有這么明顯,但是結(jié)果是一樣的,只要某個(gè)變量把敏感字符帶入不該帶的地方,那么就會(huì)產(chǎn)生威脅,不只是變量,不安全的函數(shù)會(huì)讓使用這個(gè)函數(shù)的所有代碼都變的不安全。
您可能感興趣的文章:
- PHP安全的URL字符串base64編碼和解碼
- 解析php安全性問(wèn)題中的:Null 字符問(wèn)題
- php安全開(kāi)發(fā) 添加隨機(jī)字符串驗(yàn)證,防止偽造跨站請(qǐng)求
- php安全之直接用$獲取值而不$_GET 字符轉(zhuǎn)義
- PHP開(kāi)發(fā)中常見(jiàn)的安全問(wèn)題詳解和解決方法(如Sql注入、CSRF、Xss、CC等)
- PHP的SQL注入實(shí)現(xiàn)(測(cè)試代碼安全不錯(cuò))
- php sprintf()函數(shù)讓你的sql操作更安全
- PHP魔術(shù)引號(hào)所帶來(lái)的安全問(wè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í)無(wú)效。所以,為使操作清楚,一般不使用BEGIN。2010-02-02PHP設(shè)置一邊執(zhí)行一邊輸出結(jié)果的代碼
這篇文章主要介紹了PHP中設(shè)置一邊執(zhí)行一邊輸出結(jié)果的實(shí)現(xiàn)代碼,需要的朋友可以參考下2013-09-09phpMyAdmin出現(xiàn)無(wú)法載入 mcrypt 擴(kuò)展,請(qǐng)檢查PHP配置的解決方法
出現(xiàn)以下幾種情況后可能會(huì)造成運(yùn)行phpmyadmin程序提示 無(wú)法載入 mcrypt 擴(kuò)展,請(qǐng)檢查 PHP 配置 的 錯(cuò)誤提示2012-03-03PHP類(lèi)的自動(dòng)加載與命名空間用法實(shí)例分析
這篇文章主要介紹了PHP類(lèi)的自動(dòng)加載與命名空間,結(jié)合實(shí)例形式分析了PHP類(lèi)的自動(dòng)加載與命名空間相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-06-06PHP運(yùn)行SVN命令顯示某用戶的文件更新記錄的代碼
使用SVN開(kāi)發(fā)者們平時(shí)開(kāi)發(fā)或代碼上線過(guò)程中需要知道某個(gè)時(shí)間段內(nèi)修改或添加過(guò)那些文件,所以用PHP寫(xiě)了個(gè)小程序,直接在瀏覽器中調(diào)用即可2014-01-01