99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Go 確保輸入過(guò)濾

2022-05-13 17:40 更新

過(guò)濾用戶數(shù)據(jù)是Web應(yīng)用安全的基礎(chǔ)。它是驗(yàn)證數(shù)據(jù)合法性的過(guò)程。通過(guò)對(duì)所有的輸入數(shù)據(jù)進(jìn)行過(guò)濾,可以避免惡意數(shù)據(jù)在程序中被誤信或誤用。大多數(shù)Web應(yīng)用的漏洞都是因?yàn)闆](méi)有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行恰當(dāng)過(guò)濾所引起的。

我們介紹的過(guò)濾數(shù)據(jù)分成三個(gè)步驟:

  1. 識(shí)別數(shù)據(jù),搞清楚需要過(guò)濾的數(shù)據(jù)來(lái)自于哪里
  2. 過(guò)濾數(shù)據(jù),弄明白我們需要什么樣的數(shù)據(jù)
  3. 區(qū)分已過(guò)濾及被污染數(shù)據(jù),如果存在攻擊數(shù)據(jù)那么保證過(guò)濾之后可以讓我們使用更安全的數(shù)據(jù)

    識(shí)別數(shù)據(jù)

    “識(shí)別數(shù)據(jù)”作為第一步是因?yàn)樵谀悴恢馈皵?shù)據(jù)是什么,它來(lái)自于哪里”的前提下,你也就不能正確地過(guò)濾它。這里的數(shù)據(jù)是指所有源自非代碼內(nèi)部提供的數(shù)據(jù)。例如:所有來(lái)自客戶端的數(shù)據(jù),但客戶端并不是唯一的外部數(shù)據(jù)源,數(shù)據(jù)庫(kù)和第三方提供的接口數(shù)據(jù)等也可以是外部數(shù)據(jù)源。

    由用戶輸入的數(shù)據(jù)我們通過(guò)Go非常容易識(shí)別,Go通過(guò)r.ParseForm之后,把用戶POST和GET的數(shù)據(jù)全部放在了r.Form里面。其它的輸入要難識(shí)別得多,例如,r.Header中的很多元素是由客戶端所操縱的。常常很難確認(rèn)其中的哪些元素組成了輸入,所以,最好的方法是把里面所有的數(shù)據(jù)都看成是用戶輸入。(例如r.Header.Get("Accept-Charset")這樣的也看做是用戶輸入,雖然這些大多數(shù)是瀏覽器操縱的)

    過(guò)濾數(shù)據(jù)

    在知道數(shù)據(jù)來(lái)源之后,就可以過(guò)濾它了。過(guò)濾是一個(gè)有點(diǎn)正式的術(shù)語(yǔ),它在平時(shí)表述中有很多同義詞,如驗(yàn)證、清潔及凈化。盡管這些術(shù)語(yǔ)表面意義不同,但它們都是指的同一個(gè)處理:防止非法數(shù)據(jù)進(jìn)入你的應(yīng)用。

    過(guò)濾數(shù)據(jù)有很多種方法,其中有一些安全性較差。最好的方法是把過(guò)濾看成是一個(gè)檢查的過(guò)程,在你使用數(shù)據(jù)之前都檢查一下看它們是否是符合合法數(shù)據(jù)的要求。而且不要試圖好心地去糾正非法數(shù)據(jù),而要讓用戶按你制定的規(guī)則去輸入數(shù)據(jù)。歷史證明了試圖糾正非法數(shù)據(jù)往往會(huì)導(dǎo)致安全漏洞。這里舉個(gè)例子:“最近建設(shè)銀行系統(tǒng)升級(jí)之后,如果密碼后面兩位是0,只要輸入前面四位就能登錄系統(tǒng)”,這是一個(gè)非常嚴(yán)重的漏洞。

    過(guò)濾數(shù)據(jù)主要采用如下一些庫(kù)來(lái)操作:

    • strconv包下面的字符串轉(zhuǎn)化相關(guān)函數(shù),因?yàn)閺腞equest中的r.Form返回的是字符串,而有些時(shí)候我們需要將之轉(zhuǎn)化成整/浮點(diǎn)數(shù),Atoi、ParseBoolParseFloat、ParseInt等函數(shù)就可以派上用場(chǎng)了。
    • string包下面的一些過(guò)濾函數(shù)TrimToLower、ToTitle等函數(shù),能夠幫助我們按照指定的格式獲取信息。
    • regexp包用來(lái)處理一些復(fù)雜的需求,例如判定輸入是否是Email、生日之類。

    過(guò)濾數(shù)據(jù)除了檢查驗(yàn)證之外,在特殊時(shí)候,還可以采用白名單。即假定你正在檢查的數(shù)據(jù)都是非法的,除非能證明它是合法的。使用這個(gè)方法,如果出現(xiàn)錯(cuò)誤,只會(huì)導(dǎo)致把合法的數(shù)據(jù)當(dāng)成是非法的,而不會(huì)是相反,盡管我們不想犯任何錯(cuò)誤,但這樣總比把非法數(shù)據(jù)當(dāng)成合法數(shù)據(jù)要安全得多。

    區(qū)分過(guò)濾數(shù)據(jù)

    如果完成了上面的兩步,數(shù)據(jù)過(guò)濾的工作就基本完成了,但是在編寫(xiě)Web應(yīng)用的時(shí)候我們還需要區(qū)分已過(guò)濾和被污染數(shù)據(jù),因?yàn)檫@樣可以保證過(guò)濾數(shù)據(jù)的完整性,而不影響輸入的數(shù)據(jù)。我們約定把所有經(jīng)過(guò)過(guò)濾的數(shù)據(jù)放入一個(gè)叫全局的Map變量中(CleanMap)。這時(shí)需要用兩個(gè)重要的步驟來(lái)防止被污染數(shù)據(jù)的注入:

    • 每個(gè)請(qǐng)求都要初始化CleanMap為一個(gè)空Map。
    • 加入檢查及阻止來(lái)自外部數(shù)據(jù)源的變量命名為CleanMap。

    接下來(lái),讓我們通過(guò)一個(gè)例子來(lái)鞏固這些概念,請(qǐng)看下面這個(gè)表單

    <form action="/whoami" method="POST">
        我是誰(shuí):
        <select name="name">
            <option value="astaxie">astaxie</option>
            <option value="herry">herry</option>
            <option value="marry">marry</option>
        </select>
        <input type="submit" />
    </form>

    在處理這個(gè)表單的編程邏輯中,非常容易犯的錯(cuò)誤是認(rèn)為只能提交三個(gè)選擇中的一個(gè)。其實(shí)攻擊者可以模擬POST操作,遞交name=attack這樣的數(shù)據(jù),所以在此時(shí)我們需要做類似白名單的處理

    r.ParseForm()
    name := r.Form.Get("name")
    CleanMap := make(map[string]interface{}, 0)
    if name == "astaxie" || name == "herry" || name == "marry" {
        CleanMap["name"] = name
    }

    上面代碼中我們初始化了一個(gè)CleanMap的變量,當(dāng)判斷獲取的name是astaxie、herrymarry三個(gè)中的一個(gè)之后 ,我們把數(shù)據(jù)存儲(chǔ)到了CleanMap之中,這樣就可以確保CleanMap["name"]中的數(shù)據(jù)是合法的,從而在代碼的其它部分使用它。當(dāng)然我們還可以在else部分增加非法數(shù)據(jù)的處理,一種可能是再次顯示表單并提示錯(cuò)誤。但是不要試圖為了友好而輸出被污染的數(shù)據(jù)。

    上面的方法對(duì)于過(guò)濾一組已知的合法值的數(shù)據(jù)很有效,但是對(duì)于過(guò)濾有一組已知合法字符組成的數(shù)據(jù)時(shí)就沒(méi)有什么幫助。例如,你可能需要一個(gè)用戶名只能由字母及數(shù)字組成:

    r.ParseForm()
    username := r.Form.Get("username")
    CleanMap := make(map[string]interface{}, 0)
    if ok, _ := regexp.MatchString("^[a-zA-Z0-9].$", username); ok {
        CleanMap["username"] = username
    }

    總結(jié)

    數(shù)據(jù)過(guò)濾在Web安全中起到一個(gè)基石的作用,大多數(shù)的安全問(wèn)題都是由于沒(méi)有過(guò)濾數(shù)據(jù)和驗(yàn)證數(shù)據(jù)引起的,例如前面小節(jié)的CSRF攻擊,以及接下來(lái)將要介紹的XSS攻擊、SQL注入等都是沒(méi)有認(rèn)真地過(guò)濾數(shù)據(jù)引起的,因此我們需要特別重視這部分的內(nèi)容。

    以上內(nèi)容是否對(duì)您有幫助:
    在線筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號(hào)
    微信公眾號(hào)

    編程獅公眾號(hào)