資料驗證之特殊字元處理

來源:互聯網
上載者:User
資料  一定要對使用者可能輸入的諸如引號,角括弧等特殊字元給予足夠重視,它們可能引發嚴重的安全問題。SQL注入的基本手法之一,就是利用對單引號未加過濾的安全性漏洞。
    使用者的輸入無非兩個用途:對資料庫操作或顯示在頁面上,下面分別對這兩種情況下特殊字元的處理加以說明。
    1. 對資料庫操作
    使用者輸入的資料用於對資料庫進行操作時,又分為兩種情況,一是進行寫庫操作,二是作為查詢條件。
    1.1 寫庫操作
    (insert及update都視為寫庫操作,這果以insert為例說明,update的處理相同)
    一般採用insert語句或AddNew方法兩種方式進行寫庫操作,我們先來看insert語句:
   
    DIM username,sqlstr
    username = trim(Request.Form("uname"))
    sqlstr = "insert into [userinfo] (username) values ('"& username &"')"

    以SQL Server為例,使用這種方式寫庫,如果username中含用單引號('),會出錯。使用下面的自訂函數,可以將單引號進行轉換:

    Rem 轉換SQL非法字元
    function SQLEncode(fString)
        if isnull(fString) then
            SQLEncode = ""
            exit function
        end if
        SQLEncode=replace(fString,"'","''")
    end function

    以上函數將一個單引號轉換為兩個連續的單引號,資料庫能夠接受,並以一個單引號寫入。SQL語句改為:

    sqlstr = "insert into [userinfo] (username) values ('"& SQLEncode(username) &"')"

    再來看AddNew方法:

    DIM username
    username = trim(Request.Form("uname"))
    'MyRst為Recordset對象,MyConn為Connection對象
    MyRst.open "[userinfo]",MyConn,0,3
    MyRst.AddNew
    MyRst("username").Value = username
    MyRst.Update
    MyRst.Close
 
    使用這種方式寫庫時,不必調用SQLEncode()對單引號進行轉換,資料庫會自行處理。
    對於預存程序的的參數,同樣不必進行單引號的轉換。
    建議大家利用預存程序進行操作,好處嘛,我在《ASP與預存程序》一文中已做了闡述。否則,建議使用AddNew方法寫庫,好處不僅僅在於避免對單引號進行處理,本文對此不作深入探討。
   
    1.2 使用者輸入做為查詢條件
    如果使用者輸入的資料作為查詢條件出現在where子句中,不論該where子句屬於update語句、delete語句還是select語句,都要對單引號進行轉換。

    2. 使用者輸入的資料作為輸出,顯示在頁面上
    我們這裡只討論不允許使用者使用HTML代碼的情況,也就是說,即使使用者輸入了HTML代碼,這些資料也不會以HTML代碼的形式顯示。至於允許使用者使用HTML代碼的情況,比較複雜,以後專文探討。
    使用者輸入的資料是絕對不可以不加處理,原樣顯示的。如果其中包含HTML或js代碼,使你的頁面混亂不堪倒是小事,甚至可以格掉你的硬碟。
    輸出顯示在頁面上的資料,有可能是使用者的直接輸入,或是取自資料庫。可以看到以上在入庫時的處理只是轉換了單引號,對角括弧,雙引號等特殊字元並未處理,我們放在輸出的時候再進行處理。
    ASP中的server.HTMLEncode()方法可以將許多字元轉換為“HTML字元”,如將<轉換為<,將>轉換為>等等。
    在資料顯示在頁面上之前,可以用server.HTMLEncode()對其進行轉換。但是該方法不會對斷行符號,空格進行轉換,這樣就造成以下問題:如果使用者是通過textarea控制項輸入的資料,輸出時將不會保留原有格式,不僅沒有斷行符號換行,多個空格也只會顯示為一個。為瞭解決這個問題,我們使用以下自訂函數:

    Rem 轉換HTML非法字元,用於輸出顯示時
    function HTMLEncode(fString)
       if not isnull(fString) then
          fString = Replace(fString, ">", ">")
          fString = Replace(fString, "<", "<")
          fString = Replace(fString, CHR(34), """)             '雙引號
          fString = Replace(fString, CHR(39), "'")              '單引號    
          fString = Replace(fString, CHR(32)&CHR(32), "  ")    '空格
          fString = Replace(fString, CHR(9), " ")              'tab索引值
          fString = Replace(fString, CHR(10), "<br>")               '換行
          fString = Replace(fString, CHR(13), "")                   '斷行符號
          HTMLEncode = fString
       end if
    end function
   
    調用以上函數,輸出通過textarea控制項輸入的資料,會得到滿意的結果。
    如果資料輸出在表單控制項中,不論是何種控制項,都可利用server.HTMLEncode()方法轉換字元,即使是對於textarea控制項,也不會產生問題。雖然斷行符號空格沒有被轉換,但在該控制項中可以被識別。但是,server.HTMLEncode()方法不轉換單引號。所以,控制項的值一定要使用雙引號:

    <input type=text name=uname value=""" & server.HTMLEncode(user



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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