針對SQL注入攻擊的過濾

  1. MYSQL
    當MySQL成功連線後,我們就可以使用mysql_real_escape_string()進行過濾,而為什麼需要在連線後才使用,原因是他需要取得資料庫中的編碼資料。

    在手冊中有一個簡單的例子:
    if(get_magic_quotes_gpc()) $product_name=stripslashes($_POST['product_name']);

    如果魔術引號有開啟的話,那麼就先把他取消。

    然後換成使用mysql_real_escape_string()進行過濾:
    $sql=sprintf("INSERT INTO products (`name`, `user_id`) VALUES ('%s', %d)",mysql_real_escape_string($product_name, $link),$_POST['user_id']);


    也可以使用以下function進行過濾:
    function dataFilter($value)
    {
    if (is_int($value) || is_float($value)) return $value;
    if (is_bool($value)){ return $value ? true : false; }
    if (is_null($value)) return null;
    return "'" . mysql_real_escape_string($value,$link) . "'";
    }


  2. MSSQL
    而MsSQL中,和MySQL不相同的是並非使用反斜,而是將單引轉成雙引:
    function mssql_real_escape_string($value)
    {
    if (get_magic_quotes_gpc())
    {
    $value=stripslashes($value);
    }
    $value = str_replace("'", "''", $value);
    return $value;
    }

沒有留言: