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

DurbanZhang發表於2019-02-16

轉載
Go基礎學習記錄 – 編寫Web應用程 – Web開發輸入驗證(三)
繼續前面幾篇文章的分享,本次分享下 — 輸入驗證

為了保持專案的可學習性,我這裡將之前分享的程式碼積累了下,放在github上,想要儘快入手學習的,可以直接clone我的程式碼,寫程式碼不上手,都等於白搭,光看的話,對於我來說,我是不行的,沒辦法學會。

專案地址

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

有些同學可能看不懂,怎麼就只給了這些,完全不懂呀。我把使用的命令打出來,照著操作,就應該可以解決了

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

這些我覺得 夠清晰了。OK!

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

Web開發中最重要的原則之一是您不能信任客戶端使用者表單中的任何內容。
您必須在使用之前驗證所有傳入資料。
許多網站都受到這個問題的影響,這個問題既簡單又至關重要。
有兩種方法可以驗證常用的表單資料。
第一個是前端的JavaScript驗證,第二個是後端的伺服器驗證。
本次繼續上次分享,分享Web開發中的伺服器端驗證第三部分

驗證整理

先將上次的驗證分享進行下整理,上次驗證主要包括中文、英文和郵箱,我們將這些小的功能整理到一個獨立的檔案中,方便我們後面呼叫
建立helpers/strings.go,整理的後的程式碼如下,當然如果您有更好的建議或者方式也可以分享一下。

package helpers

import (
    "regexp"
)

// ValidateInt 驗證整數
func ValidateInt(str string) bool {
    if m, _ := regexp.MatchString("^[0-9]+$", str); m {
        return true
    }
    return false
}

// ValidateEmail 驗證郵箱
func ValidateEmail(str string) bool {
    if m, _ := regexp.MatchString(`^([w.\_]{2,10})@(w{1,}).([a-z]{2,4})$`, str); m {
        return true
    }

    return false
}

// ValidateChinese 驗證中文
func ValidateChinese(str string) bool {
    if m, _ := regexp.MatchString("^[\x{4e00}-\x{9fa5}]+$", str); m {
        return true
    }

    return false
}

// ValidateEnglish 驗證英文
func ValidateEnglish(str string) bool {
    if m, _ := regexp.MatchString("^[a-zA-Z]+$", str); m {
        return true
    }

    return false
}

下拉選單

假設我們需要一個來自下拉選單的專案,裡面是文章的分類內容,但我們得到的是黑客捏造的值。我們如何防止這種情況發生?
假設我們有以下<select>:

<select name="category">
  <option value="php">PHP</option>
  <option value="java">Python</option>
  <option value="golang">Golang</option>
</select>

這裡我修改edit.html檔案
增加後部分內容如下

<div class="form-group">
  <label for="category">分類</label>
  <select class="form-control" name="category">
    <option value="php">PHP</option>
    <option value="java">Python</option>
    <option value="golang">Golang</option>
  </select>
</div>

服務端修改ArticleSave方法,新增如下程式碼

category := r.FormValue("category")

fmt.Println("category ", category)

重新編譯程式碼並重啟專案,分類中我們選擇Golang後提交,會在後臺終端輸入類似如下的輸出

category  golang

如果僅僅是接收到了引數,如果黑客不是通過web端,而是模擬web提交資料的話,我們就會收到意想不到的結果,下面對這個輸入進行下驗證
在helpers/strings.go中加入驗證函式

// ValidateInArray 元素是否在指定的陣列中
func ValidateInArray(slice []string, str string) bool {
    for _, v := range slice {
        if v == str {
            return true
        }
    }

    return false
}

並在ArticleSave呼叫,進行驗證

slice := []string{"php", "java", "golang"}
if !helpers.ValidateInArray(slice, category) {
    fmt.Println("category not in slice")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
    return
}

為了測試我們在edit.html中加入一個不在”php”, “java”, “golang”中的元素”html”

重新編譯程式碼並重啟專案,分類中我們選擇Html後提交,會在後臺終端輸入類似如下的輸出

category not in slice

今天就分享到這裡,如果你有更好的方法請在下方留言或者加群交流

專案更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.4

相關文章