W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
不知道你是否曾經(jīng)看到過一個論壇或者博客,在一個帖子或者文章后面出現(xiàn)多條重復(fù)的記錄,這些大多數(shù)是因?yàn)橛脩糁貜?fù)遞交了留言的表單引起的。由于種種原因,用戶經(jīng)常會重復(fù)遞交表單。通常這只是鼠標(biāo)的誤操作,如雙擊了遞交按鈕,也可能是為了編輯或者再次核對填寫過的信息,點(diǎn)擊了瀏覽器的后退按鈕,然后又再次點(diǎn)擊了遞交按鈕而不是瀏覽器的前進(jìn)按鈕。當(dāng)然,也可能是故意的——比如,在某項(xiàng)在線調(diào)查中重復(fù)投票。那我們?nèi)绾斡行У姆乐褂脩舳啻芜f交相同的表單呢?
解決方案是在表單中添加一個帶有唯一值的隱藏字段。在驗(yàn)證表單時,先檢查帶有該惟一值的表單是否已經(jīng)遞交過了。如果是,拒絕再次遞交;如果不是,則處理表單進(jìn)行邏輯處理。另外,如果是采用了Ajax模式遞交表單的話,當(dāng)表單遞交后,通過javascript來禁用表單的遞交按鈕。
我繼續(xù)拿4.2小節(jié)的例子優(yōu)化:
<input type="checkbox" name="interest" value="football">足球
<input type="checkbox" name="interest" value="basketball">籃球
<input type="checkbox" name="interest" value="tennis">網(wǎng)球
用戶名:<input type="text" name="username">
密碼:<input type="password" name="password">
<input type="hidden" name="token" value="{{.}}">
<input type="submit" value="登陸">
我們在模版里面增加了一個隱藏字段token
,這個值我們通過MD5(時間戳)來獲取惟一值,然后我們把這個值存儲到服務(wù)器端(session來控制,我們將在第六章講解如何保存),以方便表單提交時比對判定。
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //獲取請求的方法
if r.Method == "GET" {
crutime := time.Now().Unix()
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
token := fmt.Sprintf("%x", h.Sum(nil))
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, token)
} else {
//請求的是登陸數(shù)據(jù),那么執(zhí)行登陸的邏輯判斷
r.ParseForm()
token := r.Form.Get("token")
if token != "" {
//驗(yàn)證token的合法性
} else {
//不存在token報(bào)錯
}
fmt.Println("username length:", len(r.Form["username"][0]))
fmt.Println("username:", template.HTMLEscapeString(r.Form.Get("username"))) //輸出到服務(wù)器端
fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))
template.HTMLEscape(w, []byte(r.Form.Get("username"))) //輸出到客戶端
}
}
上面的代碼輸出到頁面的源碼如下:
我們看到token已經(jīng)有輸出值,你可以不斷的刷新,可以看到這個值在不斷的變化。這樣就保證了每次顯示form表單的時候都是唯一的,用戶遞交的表單保持了唯一性。
我們的解決方案可以防止非惡意的攻擊,并能使惡意用戶暫時不知所措,然后,它卻不能排除所有的欺騙性的動機(jī),對此類情況還需要更復(fù)雜的工作。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: