go驗證表單的輸入

2021-10-25 15:24:35 字數 3574 閱讀 6255

開發web的乙個原則就是,不能信任使用者輸入的任何資訊,所以驗證和過濾使用者的輸入資訊就變得非常重要,我們經常會在微博、新聞中聽到某某**被入侵了,存在什麼漏洞,這些大多是因為**對於使用者輸入的資訊沒有做嚴格的驗證引起的,所以為了編寫出安全可靠的web程式,驗證表單輸入的意義重大。

我們平常編寫web應用主要有兩方面的資料驗證,乙個是在頁面端的js驗證(目前在這方面有很多的外掛程式庫,比如validationjs外掛程式),乙個是在伺服器端的驗證,我們這小節講解的是如何在伺服器端驗證。

你想要確保從乙個表單元素中得到乙個值,例如前面小節裡面的使用者名稱,我們如何處理呢?go有乙個內建函式len可以獲取字串的長度,這樣我們就可以通過len來獲取資料的長度,例如:

if len(r.form["username"][0])==0
r.form對不同型別的表單元素的留空有不同的處理, 對於空文字框、空文字區域以及檔案上傳,元素的值為空值,而如果是未選中的核取方塊和單選按鈕,則根本不會在r.form中產生相應條目,如果我們用上面例子中的方式去獲取資料時程式就會報錯。所以我們需要通過r.form.get()來獲取值,因為如果欄位不存在,通過該方式獲取的是空值。但是通過r.form.get()只能獲取單個的值,如果是map的值,必須通過上面的方式來獲取。

你想要確保乙個表單輸入框中獲取的只能是數字,例如,你想通過表單獲取某個人的具體年齡是50歲還是10歲,而不是像「一把年紀了」或「年輕著呢」這種描述

如果我們是判斷正整數,那麼我們先轉化成int型別,然後進行處理

getint,err:=strconv.atoi(r.form.get("age"))

if err!=nil

//接下來就可以判斷這個數字的大小範圍了

if getint >100

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

if m, _ := regexp.matchstring("^[0-9]+$", r.form.get("age")); !m
對於效能要求很高的使用者來說,這是乙個老生常談的問題了,他們認為應該盡量避免使用正規表示式,因為使用正規表示式的速度會比較慢。但是在目前機器效能那麼強勁的情況下,對於這種簡單的正規表示式效率和型別轉換函式是沒有什麼差別的。如果你對正規表示式很熟悉,而且你在其它語言中也在使用它,那麼在go裡面使用正規表示式將是乙個便利的方式。

go實現的正則是re2,所有的字元都是utf-8編碼的。

有時候我們想通過表單元素獲取乙個使用者的中文名字,但是又為了保證獲取的是正確的中文,我們需要進行驗證,而不是使用者隨便的一些輸入。對於中文我們目前有兩種方式來驗證,可以使用unicode包提供的func is(rangetab *rangetable, r rune) bool來驗證,也可以使用正則方式來驗證,這裡使用最簡單的正則方式,如下**所示

if m, _ := regexp.matchstring("^\\p+$", r.form.get("realname")); !m
我們期望通過表單元素獲取乙個英文值,例如我們想知道乙個使用者的英文名,應該是astaxie,而不是asta謝。

我們可以很簡單的通過正則驗證資料:

if m, _ := regexp.matchstring("^[a-za-z]+$", r.form.get("engname")); !m
if m, _ := regexp.matchstring(`^([\w\.\_])@(\w).([a-z])$`, r.form.get("email")); !m else
你想要判斷使用者輸入的手機號碼是否正確,通過正則也可以驗證:

if m, _ := regexp.matchstring(`^(1[3|4|5|8][0-9]\d)$`, r.form.get("mobile")); !m
如果我們想要判斷表單裡面``元素生成的下拉列表中是否有被選中的專案。有些時候黑客可能會偽造這個下拉列表不存在的值傳送給你,那麼如何判斷這個值是否是我們預設的值呢?

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

pear

banane

那麼我們可以這樣來驗證

for _, v := range slice

}return false

如果我們想要判斷radio按鈕是否有乙個被選中了,我們頁面的輸出可能就是乙個男、女性別的選擇,但是也可能乙個15歲大的無聊小孩,一手拿著http協議的書,另乙隻手通過telnet客戶端向你的程式在傳送請求呢,你設定的性別男值是1,女是2,他給你傳送乙個3,你的程式會出現異常嗎?因此我們也需要像下拉列表的判斷方式類似,判斷我們獲取的值是我們預設的值,而不是額外的值。

那我們也可以類似下拉列表的做法一樣

slice:=int

for _, v := range slice

}return false

有一項選擇興趣的核取方塊,你想確定使用者選中的和你提供給使用者選擇的是同乙個型別的資料。

足球

籃球網球

對於核取方塊我們的驗證和單選有點不一樣,因為接收到的資料是乙個slice

slice:=string

a:=slice_diff(r.form["interest"],slice)

if a == nil

return false

上面這個函式slice_diff包含在我開源的乙個庫裡面(操作slice和map的庫),

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

go裡面提供了乙個time的處理包,我們可以把使用者的輸入年月日轉化成相應的時間,然後進行邏輯判斷

t := time.date(2009, time.november, 10, 23, 0, 0, 0, time.utc)

fmt.printf("go launched at %s\n", t.local())

獲取time之後我們就可以進行很多時間函式的操作。具體的判斷就根據自己的需求調整。

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

//驗證15位身份證,15位的是全部數字

if m, _ := regexp.matchstring(`^(\d)$`, r.form.get("usercard")); !m

//驗證18位身份證,18位前17位為數字,最後一位是校驗位,可能為數字或字元x。

if m, _ := regexp.matchstring(`^(\d)([0-9]|x)$`, r.form.get("usercard")); !m

上面列出了我們一些常用的伺服器端的表單元素驗證,希望通過這個引導入門,能夠讓你對go的資料驗證有所了解,特別是go裡面的正則處理。

GO隨筆 表單驗證

新發現 r.form裡面包含了所有請求的引數,比如url中query string post的資料 put的資料,所有當你在url的query string欄位和post衝突時,會儲存成乙個slice,裡面儲存了多個值 舉個例子 get方法傳遞username go 使用者名稱 用post方法傳遞u...

AngularJS(五) 表單及輸入驗證

表單基礎 表單是html中很重要的乙個部分,基本上我們的資訊錄入都依靠表單,接下來我們學習如何在angularjs中使用表單,首先看以下示例 示例 angularjs 13.html 分析以上 我們新增了乙個表單,在表單中增加了ng submit指令,這樣我們就無需在提交按鈕中新增ng click了...

python表單驗證 表單驗證

django有乙個form類為我們提供了強大的表單驗證提交。1 建立form from django import forms class commentform forms.form name forms.charfield label 您的姓名 max length 100 email form...