轉載
Go基礎學習記錄 - 編寫Web應用程 - Web開發輸入驗證(一)
前面的文章分享的部分功能都能正常使用,本次分享分析下 -- 輸入驗證
為了保持項目的可學習性,我這裡將之前分享的代碼積累了下,放在github上,想要儘快入手學習的,可以直接cloneMy Code,寫代碼不上手,都等於白搭,光看的話,對於我來說,我是不行的,沒辦法學會。
項目地址
https://github.com/durban89/wiki_blogtag: 1.0.1
有些同學可能看不懂,怎麼就只給了這些,完全不懂呀。我把使用的命令打出來,照著操作,就應該可以解決了
git clone https://github.com/durban89/wiki_blog /local/pathcd /local/pathgit fetch origingit checkout 1.0.1
這些我覺得 夠清晰了。OK!
繼續分享的輸入驗證的邏輯。
Web開發中最重要的原則之一是您不能信任用戶端使用者表單中的任何內容。
您必須在使用之前驗證所有傳入資料。
許多網站都受到這個問題的影響,這個問題既簡單又至關重要。
有兩種方法可以驗證常用的表單資料。
第一個是前端的JavaScript驗證,第二個是後端的伺服器驗證。
本次只分享Web開發中的伺服器端驗證。
必要欄位
有時我們要求使用者輸入一些欄位,但他們無法完成該欄位。可以使用len函數來擷取欄位的長度,以確保使用者輸入了某些內容。在ArticleSave方法中加入如下代碼
if len(r.Form["author"][0]) == 0 { fmt.Println("author is empty") http.Redirect(w, r, "/view/"+title, http.StatusFound)}
當提交的時候我們不給author賦值,然後點擊Submit提交,會看到輸出如下內容
author: []author is empty
r.Form在空白時對待不同的表單元素類型。
對於空文字框,文本地區和檔案上傳,它返回一個Null 字元串;
對於選項按鈕和複選框,它甚至不會建立相應的項目。
相反,如果您嘗試訪問它,您將收到錯誤。
因此,使用r.Form.Get()擷取欄位值更安全,因為如果該值不存在,它將始終返回空。
另一方面,r.Form.Get()一次只能獲得一個欄位值,因此您需要使用r.Form來擷取值的映射。我們修改下剛才那段代碼如下
if len(r.Form.Get("author")) == 0 { fmt.Println("author is empty") http.Redirect(w, r, "/view/"+title, http.StatusFound)}
當提交的時候我們不給author賦值,然後點擊Submit提交,會看到輸出如下內容
author: []author is empty
得到的結果跟上段代碼是一致的
數字
有時我們需要提交過來的資料是數字而不是欄位值等其他文本。
例如,假設我們只需要整數形式的使用者年齡,即50或10,而不是“足夠老”或“年輕人”。
如果我們需要一個正數,我們可以先將值轉換為int類型,然後再處理它。下面我們在ArticleSave方法中加入如下代碼
getint, err := strconv.Atoi(r.Form.Get("author"))if err != nil { fmt.Println(err) http.Redirect(w, r, "/view/"+title, http.StatusFound)}fmt.Println("getint:", getint)
當提交的時候我們給author賦值durban,然後點擊Submit提交,會看到輸出如下內容
author: [durban]strconv.Atoi: parsing "durban": invalid syntax
當提交的時候我們給author賦值10,然後點擊Submit提交,會看到輸出如下內容
author: [10]getint: 10
另一種方法是使用Regex。
代碼如下,我們將上面的程式碼片段更換如下
if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("author")); !m { fmt.Println("非整數") http.Redirect(w, r, "/view/"+title, http.StatusFound) return}fmt.Println("get author:", r.Form.Get("author"))
當提交的時候我們給author賦值10,然後點擊Submit提交,會看到輸出如下內容
author: [10]get author: 10
出於高效能目的,Regex效率不高,但簡單的Regex通常足夠快。
如果您熟悉Regex,那麼這是驗證資料的一種非常方便的方法。
請注意,Go使用[RE2],因此支援所有UTF-8字元。
**RE2是一種快速,安全,線程友好的替代方法,用於回溯Regex引擎,如PCRE,Perl和Python中使用的那些。
它是一個C ++庫。**
項目更新地址
https://github.com/durban89/typescript_demo.gittag: 1.0.2