天天看點

php CI架構中URL特殊字元處理與SQL注入隐患

 php CI架構中URL特殊字元處理與SQL注入隐患

 php CI架構中URL特殊字元有很多是不支援的,導緻像c++,括号這些常用的分類,字元都無法正常顯示很頭痛,而在配置裡增加單引号' 反斜杠\ 這種特殊字元又很容易給sql注入

在預設的config配置基礎上加上:+=()特殊字元      
#$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
$config['permitted_uri_chars'] ='a-z 0-9~%.:_\-\+=()';      

在CI架構中,盡量使用AR類進行資料庫查詢是比較靠譜的,因為在底層會幫助使用者進行一次有效的轉義,但也僅僅是轉義而已。

過濾的方法是escape_str() :

function escape_str($str, $like = FALSE)
{
    var_dump($str);
    echo "\n" ;
    if (is_array($str))
    {
        foreach ($str as $key => $val)
        {
            $str[$key] = escape_str($val, $like);
        }

        return $str;
    }

    if (function_exists('mysql_real_escape_string'))
    {
        $str = addslashes($str);
    }
    elseif (function_exists('mysql_escape_string'))
    {
        $str = mysql_escape_string($str);
    }
    else
    {
        $str = addslashes($str);
    }

    // escape LIKE condition wildcards
    if ($like === TRUE)
    {
        $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    }

    return $str;
}      

該方法僅僅是調用了一些轉義函數,并對like參數進行過濾。

如果查詢的變量沒有被單引号包裹,那麼就無法進行保護

-------------

ci 架構預設的過濾函數是escape :

xx". $this->db->escape ( $xxx )."xx      

由于數組的$key過濾不嚴直接帶入SQL查詢的漏洞屢見不鮮:

$arr = array(
    'name'=>"2' and 1=2",
    "hello'"=>"2");
);
輸出結果:
Array(
    [name] => 2\' and 1=2
    [hello' union select ] => 2
)

如果真實sql語句傳入上面兩個參數合并起來就可以查詢出所有資訊了,屬于sql注入了      

轉載于:https://www.cnblogs.com/zdz8207/p/php-ci-uri-char.html