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

鍍金池/ 教程/ GO/ 4.2 驗(yàn)證表單的輸入
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫進(jìn)行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è)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測(cè)試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測(cè)試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲(chǔ)
3.4 Go的http包詳解
8.2 WebSocket
10.3 國際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲(chǔ)密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲(chǔ)
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 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
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

4.2 驗(yàn)證表單的輸入

開發(fā)Web的一個(gè)原則就是,不能信任用戶輸入的任何信息,所以驗(yàn)證和過濾用戶的輸入信息就變得非常重要,我們經(jīng)常會(huì)在微博、新聞中聽到某某網(wǎng)站被入侵了,存在什么漏洞,這些大多是因?yàn)榫W(wǎng)站對(duì)于用戶輸入的信息沒有做嚴(yán)格的驗(yàn)證引起的,所以為了編寫出安全可靠的Web程序,驗(yàn)證表單輸入的意義重大。

我們平常編寫Web應(yīng)用主要有兩方面的數(shù)據(jù)驗(yàn)證,一個(gè)是在頁面端的js驗(yàn)證(目前在這方面有很多的插件庫,比如ValidationJS插件),一個(gè)是在服務(wù)器端的驗(yàn)證,我們這小節(jié)講解的是如何在服務(wù)器端驗(yàn)證。

必填字段

你想要確保從一個(gè)表單元素中得到一個(gè)值,例如前面小節(jié)里面的用戶名,我們?nèi)绾翁幚砟兀縂o有一個(gè)內(nèi)置函數(shù)len可以獲取字符串的長度,這樣我們就可以通過len來獲取數(shù)據(jù)的長度,例如:

if len(r.Form["username"][0])==0{
    //為空的處理
}

r.Form對(duì)不同類型的表單元素的留空有不同的處理, 對(duì)于空文本框、空文本區(qū)域以及文件上傳,元素的值為空值,而如果是未選中的復(fù)選框和單選按鈕,則根本不會(huì)在r.Form中產(chǎn)生相應(yīng)條目,如果我們用上面例子中的方式去獲取數(shù)據(jù)時(shí)程序就會(huì)報(bào)錯(cuò)。所以我們需要通過r.Form.Get()來獲取值,因?yàn)槿绻侄尾淮嬖?,通過該方式獲取的是空值。但是通過r.Form.Get()只能獲取單個(gè)的值,如果是map的值,必須通過上面的方式來獲取。

數(shù)字

你想要確保一個(gè)表單輸入框中獲取的只能是數(shù)字,例如,你想通過表單獲取某個(gè)人的具體年齡是50歲還是10歲,而不是像“一把年紀(jì)了”或“年輕著呢”這種描述

如果我們是判斷正整數(shù),那么我們先轉(zhuǎn)化成int類型,然后進(jìn)行處理

getint,err:=strconv.Atoi(r.Form.Get("age"))
if err!=nil{
    //數(shù)字轉(zhuǎn)化出錯(cuò)了,那么可能就不是數(shù)字
}

//接下來就可以判斷這個(gè)數(shù)字的大小范圍了
if getint >100 {
    //太大了
}

還有一種方式就是正則匹配的方式

if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
    return false
}

對(duì)于性能要求很高的用戶來說,這是一個(gè)老生常談的問題了,他們認(rèn)為應(yīng)該盡量避免使用正則表達(dá)式,因?yàn)槭褂谜齽t表達(dá)式的速度會(huì)比較慢。但是在目前機(jī)器性能那么強(qiáng)勁的情況下,對(duì)于這種簡單的正則表達(dá)式效率和類型轉(zhuǎn)換函數(shù)是沒有什么差別的。如果你對(duì)正則表達(dá)式很熟悉,而且你在其它語言中也在使用它,那么在Go里面使用正則表達(dá)式將是一個(gè)便利的方式。

Go實(shí)現(xiàn)的正則是RE2,所有的字符都是UTF-8編碼的。

中文

有時(shí)候我們想通過表單元素獲取一個(gè)用戶的中文名字,但是又為了保證獲取的是正確的中文,我們需要進(jìn)行驗(yàn)證,而不是用戶隨便的一些輸入。對(duì)于中文我們目前有兩種方式來驗(yàn)證,可以使用 unicode 包提供的 func Is(rangeTab *RangeTable, r rune) bool 來驗(yàn)證,也可以使用正則方式來驗(yàn)證,這里使用最簡單的正則方式,如下代碼所示

if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("realname")); !m {
    return false
}

英文

我們期望通過表單元素獲取一個(gè)英文值,例如我們想知道一個(gè)用戶的英文名,應(yīng)該是astaxie,而不是asta謝。

我們可以很簡單的通過正則驗(yàn)證數(shù)據(jù):

if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
    return false
}

電子郵件地址

你想知道用戶輸入的一個(gè)Email地址是否正確,通過如下這個(gè)方式可以驗(yàn)證:

if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {
    fmt.Println("no")
}else{
    fmt.Println("yes")
}

手機(jī)號(hào)碼

你想要判斷用戶輸入的手機(jī)號(hào)碼是否正確,通過正則也可以驗(yàn)證:

if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile")); !m {
    return false
}

下拉菜單

如果我們想要判斷表單里面<select>元素生成的下拉菜單中是否有被選中的項(xiàng)目。有些時(shí)候黑客可能會(huì)偽造這個(gè)下拉菜單不存在的值發(fā)送給你,那么如何判斷這個(gè)值是否是我們預(yù)設(shè)的值呢?

我們的select可能是這樣的一些元素

<select name="fruit">
<option value="apple">apple</option>
<option value="pear">pear</option>
<option value="banane">banane</option>
</select>

那么我們可以這樣來驗(yàn)證

slice:=[]string{"apple","pear","banane"}

for _, v := range slice {
    if v == r.Form.Get("fruit") {
        return true
    }
}
return false

單選按鈕

如果我們想要判斷radio按鈕是否有一個(gè)被選中了,我們頁面的輸出可能就是一個(gè)男、女性別的選擇,但是也可能一個(gè)15歲大的無聊小孩,一手拿著http協(xié)議的書,另一只手通過telnet客戶端向你的程序在發(fā)送請(qǐng)求呢,你設(shè)定的性別男值是1,女是2,他給你發(fā)送一個(gè)3,你的程序會(huì)出現(xiàn)異常嗎?因此我們也需要像下拉菜單的判斷方式類似,判斷我們獲取的值是我們預(yù)設(shè)的值,而不是額外的值。

<input type="radio" name="gender" value="1">男
<input type="radio" name="gender" value="2">女

那我們也可以類似下拉菜單的做法一樣

slice:=[]int{1,2}

for _, v := range slice {
    if v == r.Form.Get("gender") {
        return true
    }
}
return false

復(fù)選框

有一項(xiàng)選擇興趣的復(fù)選框,你想確定用戶選中的和你提供給用戶選擇的是同一個(gè)類型的數(shù)據(jù)。

<input type="checkbox" name="interest" value="football">足球
<input type="checkbox" name="interest" value="basketball">籃球
<input type="checkbox" name="interest" value="tennis">網(wǎng)球

對(duì)于復(fù)選框我們的驗(yàn)證和單選有點(diǎn)不一樣,因?yàn)榻邮盏降臄?shù)據(jù)是一個(gè)slice

slice:=[]string{"football","basketball","tennis"}
a:=Slice_diff(r.Form["interest"],slice)
if a == nil{
    return true
}

return false

上面這個(gè)函數(shù)Slice_diff包含在我開源的一個(gè)庫里面(操作slice和map的庫),https://github.com/astaxie/beeku

日期和時(shí)間

你想確定用戶填寫的日期或時(shí)間是否有效。例如 ,用戶在日程表中安排8月份的第45天開會(huì),或者提供未來的某個(gè)時(shí)間作為生日。

Go里面提供了一個(gè)time的處理包,我們可以把用戶的輸入年月日轉(zhuǎn)化成相應(yīng)的時(shí)間,然后進(jìn)行邏輯判斷

t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
fmt.Printf("Go launched at %s\n", t.Local())

獲取time之后我們就可以進(jìn)行很多時(shí)間函數(shù)的操作。具體的判斷就根據(jù)自己的需求調(diào)整。

身份證號(hào)碼

如果我們想驗(yàn)證表單輸入的是否是身份證,通過正則也可以方便的驗(yàn)證,但是身份證有15位和18位,我們兩個(gè)都需要驗(yàn)證

//驗(yàn)證15位身份證,15位的是全部數(shù)字
if m, _ := regexp.MatchString(`^(\d{15})$`, r.Form.Get("usercard")); !m {
    return false
}

//驗(yàn)證18位身份證,18位前17位為數(shù)字,最后一位是校驗(yàn)位,可能為數(shù)字或字符X。
if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {
    return false
}

上面列出了我們一些常用的服務(wù)器端的表單元素驗(yàn)證,希望通過這個(gè)引導(dǎo)入門,能夠讓你對(duì)Go的數(shù)據(jù)驗(yàn)證有所了解,特別是Go里面的正則處理。