go防止多次递交表单

go防止多次递交表单,第1张

概述不知道你是否曾经看到过一个论坛或者博客,在一个帖子或者文章后面出现多条重复的记录,这些大多数是因为用户重复递交了留言的表单引起的。由于种种原因,用户经常会重复递交表单。通常这只是鼠标的误 *** 作,如双击了递交按钮,也可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退

不知道你是否曾经看到过一个论坛或者博客,在一个帖子或者文章后面出现多条重复的记录,这些大多数是因为用户重复递交了留言的表单引起的。由于种种原因,用户经常会重复递交表单。通常这只是鼠标的误 *** 作,如双击了递交按钮,也可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退按钮,然后又再次点击了递交按钮而不是浏览器的前进按钮。当然,也可能是故意的——比如,在某项在线调查或者博彩活动中重复投票。那我们如何有效的防止用户多次递交相同的表单呢?

解决方案是在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带有该惟一值的表单是否已经递交过了。如果是,拒绝再次递交;如果不是,则处理表单进行逻辑处理。另外,如果是采用了AJAX模式递交表单的话,当表单递交后,通过JavaScript来禁用表单的递交按钮。

我继续拿4.2小节的例子优化:

<input type="checkBox" name="interest" value="football">足球<input type="checkBox" name="interest" value="basketball">篮球<input type="checkBox" name="interest" value="tennis">网球    用户名:<input type="text" name="username">密码:<input type="password" name="password"><input type="hIDden" name="token" value="{{.}}"><input type="submit" value="登陆">

我们在模版里面增加了一个隐藏字段token,这个值我们通过MD5(时间戳)来获取惟一值,然后我们把这个值存储到服务器端(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 {        //请求的是登陆数据,那么执行登陆的逻辑判断        r.ParseForm()        token := r.Form.Get("token")        if token != "" {            //验证token的合法性        } else {            //不存在token报错        }        fmt.Println("username length:", len(r.Form["username"][0]))        fmt.Println("username:", template.HTMLEscapestring(r.Form.Get("username"))) //输出到服务器端        fmt.Println("password:", template.HTMLEscapestring(r.Form.Get("password")))        template.HTMLEscape(w, []byte(r.Form.Get("username"))) //输出到客户端    }}

 

我们看到token已经有输出值,你可以不断的刷新,可以看到这个值在不断的变化。这样就保证了每次显示form表单的时候都是唯一的,用户递交的表单保持了唯一性。

我们的解决方案可以防止非恶意的***,并能使恶意用户暂时不知所措,然后,它却不能排除所有的欺骗性的动机,对此类情况还需要更复杂的工作。

总结

以上是内存溢出为你收集整理的go防止多次递交表单全部内容,希望文章能够帮你解决go防止多次递交表单所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1212224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存