轉載
Go基礎學習記錄 - 編寫Web應用程 - Web開發輸入驗證(三)
繼續前面幾篇文章的分享,本次分享下 -- 輸入驗證
為了保持項目的可學習性,我這裡將之前分享的代碼積累了下,放在github上,想要儘快入手學習的,可以直接cloneMy Code,寫代碼不上手,都等於白搭,光看的話,對於我來說,我是不行的,沒辦法學會。
項目地址
https://github.com/durban89/wiki_blogtag: 1.0.3
有些同學可能看不懂,怎麼就只給了這些,完全不懂呀。我把使用的命令打出來,照著操作,就應該可以解決了
git clone https://github.com/durban89/wiki_blog /local/pathcd /local/pathgit fetch origingit checkout 1.0.3
這些我覺得 夠清晰了。OK!
繼續分享的輸入驗證的邏輯。
Web開發中最重要的原則之一是您不能信任用戶端使用者表單中的任何內容。
您必須在使用之前驗證所有傳入資料。
許多網站都受到這個問題的影響,這個問題既簡單又至關重要。
有兩種方法可以驗證常用的表單資料。
第一個是前端的JavaScript驗證,第二個是後端的伺服器驗證。
本次繼續上次分享,分享Web開發中的伺服器端驗證第三部分
驗證整理
先將上次的驗證分享進行下整理,上次驗證主要包括中文、英文和郵箱,我們將這些小的功能整理到一個獨立的檔案中,方便我們後面調用
建立helpers/strings.go,整理的後的代碼如下,當然如果您有更好的建議或者方式也可以分享一下。
package helpersimport ( "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.gittag: 1.0.4