IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(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)閱讀

文章評論
發(fā)表評論

熱門文章 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦MySQL常用維護(hù)管理工具MySQL常用維護(hù)管理工具Linux VPS/服務(wù)器上輕松導(dǎo)入、導(dǎo)出MySQL數(shù)據(jù)Linux VPS/服務(wù)器上輕松導(dǎo)入、導(dǎo)出MySQL數(shù)據(jù)MySQL復(fù)制的概述、安裝、故障、技巧、工具MySQL復(fù)制的概述、安裝、故障、技巧、工具

相關(guān)下載

人氣排行 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)方法