-
您當(dāng)前所在位置:首頁 → 數(shù)據(jù)庫 → MYSQL → MySQL二次漏洞的簡單防范
MySQL二次漏洞的簡單防范
時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
-
一、提出問題
眾所周知,數(shù)據(jù)庫操作中對于一些特殊字符(例如單引號"'"、反斜線"\"等元字符)有著嚴(yán)格的限制,如果向數(shù)據(jù)庫中寫入的數(shù)據(jù)含有這樣的特殊字符,操作將會帶來不安全因素。所以對于用戶輸入的數(shù)據(jù),我們完全認(rèn)為它是沒有安全性的,需要在程序中對其進(jìn)行適當(dāng)?shù)倪^濾處理后,方可寫入數(shù)據(jù)庫。
對于這點(diǎn),相信大多數(shù)php程序員都會注意到,一般采取的方法是使用AddSlashes()字符串函數(shù)對用戶輸入的數(shù)據(jù)進(jìn)行處理,把數(shù)據(jù)中的特殊字符加上反斜線進(jìn)行轉(zhuǎn)譯。這樣對于一般的數(shù)據(jù)庫寫入是正常的,并不會帶來什么問題,而問題來源于之后的取出操作。對于前面用AddSlashes()函數(shù)進(jìn)行轉(zhuǎn)譯后保存在數(shù)據(jù)庫中的數(shù)據(jù),經(jīng)過查看數(shù)據(jù)庫我們發(fā)現(xiàn)里面存儲的是原始的數(shù)據(jù),也就是說其中的特殊字符并沒有被加上反斜線。此時當(dāng)數(shù)據(jù)來源于這時的數(shù)據(jù)庫本身時,安全問題仍然存在,這就造成了二次漏洞。
流程描述 原始的數(shù)據(jù),如"'"=> 程序處理(安全的數(shù)據(jù)如"\'" )=> mysql里存
儲(原始的數(shù)據(jù)如"'") => 程序處理(處理的是"'")=> 產(chǎn)生危險
二、分析問題
因此在進(jìn)行數(shù)據(jù)過濾的時候,不要只是暫時地讓數(shù)據(jù)失去危害,可以考慮永久地讓數(shù)據(jù)失去危害,譬如在過濾的時候不是將"'"變成"\'"等,而是在條件允許的情況下將其直接轉(zhuǎn)換成HTML字符"'",這樣并不影響顯示但是數(shù)據(jù)卻不再會包含讓數(shù)據(jù)庫的元字符,所以不用擔(dān)心注入漏洞了,其他的字符可以一樣考慮處理。
三、解決問題
為解決此問題,我們可以用str_replace()函數(shù)依次對必要的特殊字符進(jìn)行替換。此時要注意替換后的字符串長度將會改變,每替換一個字符,字符串長度將會增加5。我們還需在寫入數(shù)據(jù)庫之前判斷它是否超過字段大小。
五、演示代碼
File:test.php
代碼:
<?php
/*
* 二次漏洞簡單檢測
* Author Linvo
* Build 2007-11-8
*/
/*
* 鏈接數(shù)據(jù)庫(根據(jù)情況自己修改)
*/
$Host = 'localhost';
$User = 'root';
$Pass = 'password';
$DB = 'test'; //測試庫名
$db = @mysql_connect($Host,$User,$Pass);
if(!$db) die("連接服務(wù)器MySQL出錯!");
else if(!mysql_select_db($DB,$db)) die("連接數(shù)據(jù)庫出錯!");
define(INPUT_MAX_LENGTH, 10); //前臺maxlength值(初步檢測)
define(INDB_MAX_LENGTH, 20); //數(shù)據(jù)庫中字段設(shè)置的大小值(用于寫入前的必要安全測試)
#p#副標(biāo)題#e#
/*
* 原始數(shù)據(jù)(如用戶輸入等)
*/
$string = "’\\"; //用戶輸入內(nèi)容
if(strlen($string) > INPUT_MAX_LENGTH) //初步檢測
die("輸入內(nèi)容超長");
echo "輸入的內(nèi)容:".$string;
/*
* 過濾方案
*/
//$string_in1 = AddSlashes($string); //方案一:臨時失去危險,但有二次漏洞
$string_in1 = str_slashes($string); //方案二:永久性失去危險!(自定義函數(shù))
/*
* 安全測試
*/
$string_in2 = test_db($string_in1, 1); //一次漏洞檢測
$string_in3 = test_db($string_in2, 2); //二次漏洞檢測
/*
* 數(shù)據(jù)庫操作(函數(shù))
*/
function test_db($str_in, $time)
{
echo "第 $time 次要寫入的內(nèi)容:".$str_in;
if(strlen($str_in) > INDB_MAX_LENGTH) die("第 $time 次寫入數(shù)據(jù)超長!");//必要安全測試!
$result = mysql_query("INSERT INTO str(str) VALUES('$str_in')"); //寫入
if(!$result)
{
die("<font color=red>第 $time 次寫入數(shù)據(jù)庫失敗</font>");
}
echo "第 $time 次寫入完畢";
$result = mysql_query("SELECT str FROM str ORDER BY id DESC LIMIT 1");//取出
if($item = mysql_fetch_array($result))
{
$str_out = $item['str'];
}
echo "第 $time 次輸出:".$str_out."";
return $str_out;
}
/*
* 永久性過濾危險字符
*/
function str_slashes($str)
{
$str = str_replace("'","'",$str); //轉(zhuǎn)譯 '
$str = str_replace("\\","\",$str); //轉(zhuǎn)譯 \
return $str;
}
?>
關(guān)鍵詞標(biāo)簽:MySQL,漏洞防范
相關(guān)閱讀
-
熱門文章
10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦MySQL常用維護(hù)管理工具Linux VPS/服務(wù)器上輕松導(dǎo)入、導(dǎo)出MySQL數(shù)據(jù)MySQL復(fù)制的概述、安裝、故障、技巧、工具
人氣排行
MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié)Mysql 1045錯誤解決辦法10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法MySQL導(dǎo)出導(dǎo)入命令的用例MySQL無法啟動、無法停止各種解決方法總結(jié)三種常用的MySQL建表語句Mysql清空表的實(shí)現(xiàn)方法