Go基礎學習記錄 - 編寫Web應用程 - Web開發輸入驗證(一)

轉載
Go基礎學習記錄 - 編寫Web應用程 - Web開發輸入驗證(一)
前面的文章分享的部分功能都能正常使用,本次分享分析下 -- 輸入驗證前端

爲了保持項目的可學習性,我這裏將以前分享的代碼積累了下,放在github上,想要儘快入手學習的,能夠直接clone個人代碼,寫代碼不上手,都等於白搭,光看的話,對於我來講,我是不行的,沒辦法學會。git

項目地址github

https://github.com/durban89/wiki_blog
tag: 1.0.1

有些同窗可能看不懂,怎麼就只給了這些,徹底不懂呀。我把使用的命令打出來,照着操做,就應該能夠解決了正則表達式

git clone https://github.com/durban89/wiki_blog /local/path
cd /local/path
git fetch origin
git checkout 1.0.1

這些我以爲 夠清晰了。OK!typescript

繼續分享的輸入驗證的邏輯。後端

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在空白時對待不一樣的表單元素類型。
對於空文本框,文本區域和文件上傳,它返回一個空字符串;
對於單選按鈕和複選框,它甚至不會建立相應的項目。
相反,若是您嘗試訪問它,您將收到錯誤。
所以,使用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

另外一種方法是使用正則表達式。
代碼以下,咱們將上面的代碼段更換以下

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

出於高性能目的,正則表達式效率不高,但簡單的正則表達式一般足夠快。
若是您熟悉正則表達式,那麼這是驗證數據的一種很是方便的方法。
請注意,Go使用[RE2],所以支持全部UTF-8字符。

**RE2是一種快速,安全,線程友好的替代方法,用於回溯正則表達式引擎,如PCRE,Perl和Python中使用的那些。
它是一個C ++庫。**

項目更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.2
相關文章
相關標籤/搜索