在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 9.2 確保輸入過濾
7 文本處理
3 Web基礎(chǔ)
14 擴展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫進行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計一個Web框架
14.3 表單及驗證支持
12 部署與維護
10 國際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應用日志
4.2 驗證表單的輸入
10.1 設(shè)置默認地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測試用例
8 Web服務
12.3 應用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯誤處理,調(diào)試和測試
9.2 確保輸入過濾
14.2 Session支持
6.4 預防session劫持
12.4 備份和恢復
8.1 Socket編程
13.1 項目規(guī)劃
13.4 日志和配置設(shè)計
7.6 字符串處理
13.2 自定義路由器設(shè)計
6.3 session存儲
3.4 Go的http包詳解
8.2 WebSocket
10.3 國際化站點
7.5 文件操作
7.4 模板處理
9.1 預防CSRF攻擊
13.3 controller設(shè)計
2.6 interface
14.4 用戶認證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯誤處理
9.5 存儲密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯誤處理
6 session和數(shù)據(jù)存儲
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結(jié)
3.2 Go搭建一個Web服務器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫
4.6 小結(jié)
8.4 RPC

9.2 確保輸入過濾

過濾用戶數(shù)據(jù)是Web應用安全的基礎(chǔ)。它是驗證數(shù)據(jù)合法性的過程。通過對所有的輸入數(shù)據(jù)進行過濾,可以避免惡意數(shù)據(jù)在程序中被誤信或誤用。大多數(shù)Web應用的漏洞都是因為沒有對用戶輸入的數(shù)據(jù)進行恰當過濾所引起的。

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

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

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

“識別數(shù)據(jù)”作為第一步是因為在你不知道“數(shù)據(jù)是什么,它來自于哪里”的前提下,你也就不能正確地過濾它。這里的數(shù)據(jù)是指所有源自非代碼內(nèi)部提供的數(shù)據(jù)。例如:所有來自客戶端的數(shù)據(jù),但客戶端并不是唯一的外部數(shù)據(jù)源,數(shù)據(jù)庫和第三方提供的接口數(shù)據(jù)等也可以是外部數(shù)據(jù)源。

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

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

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

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

過濾數(shù)據(jù)主要采用如下一些庫來操作:

  • strconv包下面的字符串轉(zhuǎn)化相關(guān)函數(shù),因為從Request中的r.Form返回的是字符串,而有些時候我們需要將之轉(zhuǎn)化成整/浮點數(shù),Atoi、ParseBool、ParseFloatParseInt等函數(shù)就可以派上用場了。
  • string包下面的一些過濾函數(shù)Trim、ToLowerToTitle等函數(shù),能夠幫助我們按照指定的格式獲取信息。
  • regexp包用來處理一些復雜的需求,例如判定輸入是否是Email、生日之類。

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

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

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

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

接下來,讓我們通過一個例子來鞏固這些概念,請看下面這個表單

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

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

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

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

上面的方法對于過濾一組已知的合法值的數(shù)據(jù)很有效,但是對于過濾有一組已知合法字符組成的數(shù)據(jù)時就沒有什么幫助。例如,你可能需要一個用戶名只能由字母及數(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ù)過濾在Web安全中起到一個基石的作用,大多數(shù)的安全問題都是由于沒有過濾數(shù)據(jù)和驗證數(shù)據(jù)引起的,例如前面小節(jié)的CSRF攻擊,以及接下來將要介紹的XSS攻擊、SQL注入等都是沒有認真地過濾數(shù)據(jù)引起的,因此我們需要特別重視這部分的內(nèi)容。

上一篇:2.7 并發(fā)下一篇:14.4 用戶認證