PHP防SQL注入類,可以過濾敏感參數

來源:互聯網
上載者:User

確定XP_CMDSHELL可執行情況

發現WEB虛擬目錄

上傳ASP,php,jsp木馬;

得到管理員權限;

//PHP整站防注入程式,需要在公用檔案中require_once本檔案   
//判斷magic_quotes_gpc狀態  
if (@get_magic_quotes_gpc ()) {   
    $_GET = sec ( $_GET );   
    $_POST = sec ( $_POST );   
    $_COOKIE = sec ( $_COOKIE );   
    $_FILES = sec ( $_FILES );   
}   
$_SERVER = sec ( $_SERVER );   
function sec(&$array) {   
    //如果是數組,遍曆數組,遞迴調用   
    if (is_array ( $array )) {   
        foreach ( $array as $k => $v ) {   
            $array [$k] = sec ( $v );   
        }   
    } else if (is_string ( $array )) {   
        //使用addslashes函數來處理   
        $array = addslashes ( $array );   
    } else if (is_numeric ( $array )) {   
        $array = intval ( $array );   
    }   
    return $array;   
}

1、整型參數的判斷

當輸入的參數YY為整型時,通常abc.asp中SQL語句原貌大致如下:

select * from 表名 where 欄位=YY,所以可以用以下步驟測試SQL注入是否存在。

①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了

select * from 表名 where 欄位=YY’,abc.asp運行異常;

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;

③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp運行異常;

如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。

function num_check($id) {  
    if (! $id) {  
        die ( '參數不可為空!' );  
    } //是否為空白的判斷  
    else if (inject_check ( $id )) {  
        die ( '非法參數' );  
    } //注入判斷  
    else if (! is_numetic ( $id )) {  
        die ( '非法參數' );  
    }  
    //數字判斷  
    $id = intval ( $id );  
    //整型化  
    return $id;  

        
//字元過濾函數  
function str_check($str) {  
    if (inject_check ( $str )) {  
        die ( '非法參數' );  
    }  
    //注入判斷  
    $str = htmlspecialchars ( $str );  
    //轉換html  
    return $str;  
}  
function search_check($str) {  
    $str = str_replace ( "_", "_", $str );  
    //把"_"過濾掉  
    $str = str_replace ( "%", "%", $str );  
    //把"%"過濾掉  
    $str = htmlspecialchars ( $str );  
    //轉換html  
    return $str;  
}  
//表單過濾函數  
function post_check($str, $min, $max) {  
    if (isset ( $min ) && strlen ( $str ) < $min) {  
        die ( '最少$min位元組' );  
    } else if (isset ( $max ) && strlen ( $str ) > $max) {  
        die ( '最多$max位元組' );  
    }  
    return stripslashes_array ( $str );  
}

輸入的參數YY為字串時,通常abc.php中SQL語句原貌大致如下:

select * from 表名 where 欄位='YY',所以可以用以下步驟測試SQL注入是否存在。

①HTTP://xxx.xxx.xxx/abc.php?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了

select * from 表名 where 欄位=YY’,abc.asp運行異常;

②HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='1', abc.php運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;

③HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='2', abc.php運行異常;

如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。


//防注入函數  
function inject_check($sql_str) {  
    return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );  
    // 進行過濾,防注入 

function stripslashes_array(&$array) {  
    if (is_array ( $array )) {  
        foreach ( $array as $k => $v ) {  
            $array [$k] = stripslashes_array ( $v );  
        }  
    } else if (is_string ( $array )) {  
        $array = stripslashes ( $array );  
    }  
    return $array;  
}


//php 批量過濾post,get敏感性資料
if (get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
}

function stripslashes_array(&$array) {
while(list($key,$var) = each($array)) {
if ($key != 'argc' && $key != 'argv' && (strtoupper($key) != $key || ''.intval($key) == "$key")) {
if (is_string($var)) {
$array[$key] = stripslashes($var);
}
if (is_array($var))  {
$array[$key] = stripslashes_array($var);
}
}
}
return $array;
}
//過濾
function htmlencode($str){
if(empty($str)) return;
if($str=="") return $str;
$str=trim($str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(chr(32)," ",$str);
$str=str_replace(chr(9)," ",$str);
$str=str_replace(chr(9),"    ",$str);
$str=str_replace(chr(34),"&",$str);
$str=str_replace(chr(39),"'",$str);
$str=str_replace(chr(13),"<br />",$str);
$str=str_replace("'","''",$str);
$str=str_replace("select","select",$str);
$str=str_replace("SCRIPT","SCRIPT",$str);
$str=str_replace("script","script",$str);
$str=str_replace("join","join",$str);
$str=str_replace("union","union",$str);
$str=str_replace("where","where",$str);
$str=str_replace("insert","insert",$str);
$str=str_replace("delete","delete",$str);
$str=str_replace("update","update",$str);
$str=str_replace("like","like",$str);
$str=str_replace("drop","drop",$str);
$str=str_replace("create","create",$str);
$str=str_replace("modify","modify",$str);
$str=str_replace("rename","rename",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cast","cas",$str);
return $str;
}

//解碼
function htmldecode($str){
if(empty($str)) return;
if($str=="") return $str;
$str=str_replace("select","select",$str);
$str=str_replace("join","join",$str);
$str=str_replace("union","union",$str);
$str=str_replace("where","where",$str);
$str=str_replace("insert","insert",$str);
$str=str_replace("delete","delete",$str);
$str=str_replace("update","update",$str);
$str=str_replace("like","like",$str);
$str=str_replace("drop","drop",$str);
$str=str_replace("create","create",$str);
$str=str_replace("modify","modify",$str);
$str=str_replace("rename","rename",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(" ",chr(32),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace("    ",chr(9),$str);
$str=str_replace("&",chr(34),$str);
$str=str_replace("'",chr(39),$str);
$str=str_replace("<br />",chr(13),$str);
$str=str_replace("''","'",$str);
return $str;
}

// 函數:string_filter($string, $match_type=1)
// 功能:過濾非法內容
// 參數:
// $string 需要檢查的字串
// $match_type 匹配類型,1為精確匹配, 2為模糊比對,預設為1
//
// 返回:有非法內容返回True,無非法內容返回False
// 其他:非法關鍵字列表儲存在txt檔案裡, 分為普通非法關鍵字和嚴重非法關鍵字兩個列表
// 作者:heiyeluren
// 時間:2006-1-18
//
//======================================================================
function lib_lawless_string_filter($string, $match_type=1)
{
//字串空直接返回為非法
$string = trim($string);
if (empty($string))
{
return false;
}
//擷取重要關鍵字列表和普通關鍵字列表
$common_file = "common_list.txt"; //通用過濾關鍵字列表
$signify_file = "signify_list.txt"; //重要過濾關鍵字列表
//如果任何列表檔案不存在直接返回false,否則把兩個檔案清單讀取到兩個數組裡
if (!file_exists($common_file) || !file_exists($signify_file))
{
return false;
}
$common_list = file($common_file);
$signify_list = file($signify_file);

//精確匹配
if ($match_type == 1)
{
$is_lawless = exact_match($string, $common_list);
}

//模糊比對
if ($match_type == 2)
{
$is_lawless = blur_match($string, $common_list, $signify_list);
}

//判斷檢索結果數組中是否有資料,如果有,證明是非法的
if (is_array($is_lawless) && !empty($is_lawless))
{
return true;
}
else
{
return false;
}
}

//---------------------
// 精確匹配,為過濾服務
//---------------------
function exact_match($string, $common_list)
{
$string = trim($string);
$string = lib_replace_end_tag($string);

//檢索普通過濾關鍵字列表
foreach($common_list as $block)
{
$block = trim($block);
if (preg_match("/^$string$/i", $block))
{
$blist[] = $block;
}
}
//判斷有沒有過濾內容在數組裡
if (!empty($blist))
{
return array_unique($blist);
}

return false;
}

//----------------------
// 模糊比對,為過濾服務
//----------------------
function blur_match($string, $common_list, $signify_list)
{
$string = trim($string);
$s_len = strlen($string);
$string = lib_replace_end_tag($string);

//檢索普通過濾關鍵字列表
foreach($common_list as $block)
{
$block = trim($block);
if (preg_match("/^$string$/i", $block))
{
$blist[] = $block;
}
}
//檢索嚴重過濾關鍵字列表
foreach($signify_list as $block)
{
$block = trim($block);
if ($s_len>=strlen($block) && preg_match("/$block/i", $string))
{
$blist[] = $block;
}
}
//判斷有沒有過濾內容在數組裡
if (!empty($blist))
{
return array_unique($blist);
}

return false;
}

//--------------------------
// 替換HTML尾標籤,為過濾服務
//--------------------------
function lib_replace_end_tag($str)
{
if (empty($str)) return false;
$str = htmlspecialchars($str);
$str = str_replace( '/', "", $str);
$str = str_replace("", "", $str);
$str = str_replace("&gt", "", $str);
$str = str_replace("&lt", "", $str);
$str = str_replace("<SCRIPT>", "", $str);
$str = str_replace("</SCRIPT>", "", $str);
$str = str_replace("<script>", "", $str);
$str = str_replace("</script>", "", $str);
$str=str_replace("select","select",$str);
$str=str_replace("join","join",$str);
$str=str_replace("union","union",$str);
$str=str_replace("where","where",$str);
$str=str_replace("insert","insert",$str);
$str=str_replace("delete","delete",$str);
$str=str_replace("update","update",$str);
$str=str_replace("like","like",$str);
$str=str_replace("drop","drop",$str);
$str=str_replace("create","create",$str);
$str=str_replace("modify","modify",$str);
$str=str_replace("rename","rename",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("<","<",$str);
$str=str_replace(" ",chr(32),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace("    ",chr(9),$str);
$str=str_replace("&",chr(34),$str);
$str=str_replace("'",chr(39),$str);
$str=str_replace("<br />",chr(13),$str);
$str=str_replace("''","'",$str);
$str=str_replace("css","'",$str);
$str=str_replace("CSS","'",$str);

return $str;

//HTML標籤,可以作為擴充過濾
/*
$tags = array("/html", "/head", "/body", "/div", "/span", "/DOCTYPE", "/title", "/link", "/meta", "/style", "/p", "/h1,", "/h2,", "/h3,", "/h4,", "/h5,", "/h6", "/strong", "/em", "/abbr", "/acronym", "/address", "/bdo", "/blockquote", "/cite", "/q", "/code", "/ins", "/del", "/dfn", "/kbd", "/pre", "/samp", "/var", "/br", "/a", "/img", "/area", "/map", "/object", "/param", "/ul", "/ol", "/li", "/dl", "/dt", "/dd", "/table", "/tr", "/td", "/th", "/tbody", "/thead", "/tfoot", "/col", "/colgroup", "/caption", "/form", "/input", "/textarea", "/select", "/option", "/optgroup", "/button", "/label", "/fieldset", "/legend", "/script", "/noscript", "/b", "/i", "/tt", "/sub", "/sup", "/big", "/small", "/hr" );
*/

}
引用是直接這樣:
$xxx = htmlspecialchars($_POST['xxx']);
或者
$xxx = htmlspecialchars($_GET['xxx']);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.