腳本安全的本質(zhì)_PHP+MYSQL第2/3頁
更新時間:2008年10月03日 20:21:00 作者:
從代碼級別上,也就是應(yīng)用層次上考慮代碼安全的話(也就是不考慮底層的語言本身等問題的漏洞),腳本安全問題就是函數(shù)和變量的問題。
2 隱式的輸入
上面這些是最原始的,沒有經(jīng)過程序轉(zhuǎn)換的數(shù)據(jù),程序很多地方用到的變量都來自這里,但也不表示其他的地方?jīng)]有變量傳遞過來,下面有一個數(shù)據(jù)傳遞的模式:
用戶傳遞的數(shù)據(jù)===========>數(shù)據(jù)庫===========>程序代碼處理=======>程序代碼
這個模式的意思是用戶的輸入可能先進(jìn)入了數(shù)據(jù)庫,然后程序從數(shù)據(jù)庫再取得這個輸入送入某些危險的函數(shù)執(zhí)行,一般的程序員都會有一個意識認(rèn)為從數(shù)據(jù)庫中取得的變量是安全的,但是事實并不如此,只要某些敏感字符最終送入到程序代碼中,不管他中間停留在什么地方,都是危險的。與存儲在數(shù)據(jù)庫中類似的情況是,一些程序把用戶的輸入放到文件中,如緩存文件,然后在必要的時候從里面取得,如果太過相信這些地方來的變量,這樣還是會導(dǎo)致問題的。
3 變量覆蓋
還有很多的時候,程序收到的變量很可能來自他不應(yīng)該來的地方,譬如Dz的代碼:
$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
$_FILES = daddslashes($_FILES);
}
這樣之后,你還覺得$_FILES是原來的$_FILES了么?如果我們建立一個_FILES的表單或者干脆在url里加上 php?_FILES[]=ddddd,這樣之后$_FILES已經(jīng)完全被覆蓋了,然后你代碼里引用的$_FILES就不是原來的了,在Dz以前的版本中曾經(jīng)出現(xiàn)過這個問題。這應(yīng)該屬于變量覆蓋的問題,把初始化的那個文件放大來看看吧:
復(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';
}
這樣貌似是沒有問題的,但是滿足一定的條件的話還是可能出問題,假設(shè)register_globals為on的話,我們進(jìn)入全局的變量不只是$_GET 和$_POST吧!包括$_COOKIE和$_FILES以及$_SERVER都是會在全局?jǐn)?shù)組中產(chǎn)生變量的,通過上面的語句,我們提交一個 php?_SERVER[PHP_SELF]就可以覆蓋掉_SERVER數(shù)組,那么整個程序中的$_SERVER數(shù)組都是不可以相信的了。我也見過這樣寫的代碼:
復(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)鍵變量初始化之后,那么我們完全可以提交一個?$host=xxx.xxx.xxx.xxx這樣的東西覆蓋掉系統(tǒng)自己的數(shù)據(jù)庫初始化文件里的數(shù)據(jù)庫地址變量,然后就可以
4 變量感染
這個很容易理解,當(dāng)一個變量不安全的時候,與之有關(guān)的賦值等操作都是不安全的,譬如:
$id = $_GET[id];
..
$articleid = $id;
實際過程中可能沒有這么明顯,但是結(jié)果是一樣的,只要某個變量把敏感字符帶入不該帶的地方,那么就會產(chǎn)生威脅,不只是變量,不安全的函數(shù)會讓使用這個函數(shù)的所有代碼都變的不安全。
相關(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時無效。所以,為使操作清楚,一般不使用BEGIN。2010-02-02PHP設(shè)置一邊執(zhí)行一邊輸出結(jié)果的代碼
這篇文章主要介紹了PHP中設(shè)置一邊執(zhí)行一邊輸出結(jié)果的實現(xiàn)代碼,需要的朋友可以參考下2013-09-09phpMyAdmin出現(xiàn)無法載入 mcrypt 擴(kuò)展,請檢查PHP配置的解決方法
出現(xiàn)以下幾種情況后可能會造成運(yùn)行phpmyadmin程序提示 無法載入 mcrypt 擴(kuò)展,請檢查 PHP 配置 的 錯誤提示2012-03-03PHP運(yùn)行SVN命令顯示某用戶的文件更新記錄的代碼
使用SVN開發(fā)者們平時開發(fā)或代碼上線過程中需要知道某個時間段內(nèi)修改或添加過那些文件,所以用PHP寫了個小程序,直接在瀏覽器中調(diào)用即可2014-01-01