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

解决方案是在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带有该惟一值的表单是否已经递交过了。如果是,拒绝再次递交;如果不是,则处理表单进行逻辑处理。另外,如果是采用了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防止多次递交表单相关推荐

  1. 表单的几个基本常用功能

    代码片段1: 在表单中禁用"回车键": $("#form").keypress(function(e) {if (e.which == 13) {return ...

  2. 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...

  3. jQuery实现表单验证

    1.基于html表单,利用jQuery实现表单验证功能. 2.html基本结构和样式: 3.html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  4. 表单中隐藏域的html代码是,JS中input表单隐藏域及其使用方法_心病_前端开发者...

    一.表单隐藏域 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式: <input ...

  5. ccform 表单的单据打印

    为什么80%的码农都做不了架构师?>>>    9.0 特别注意事项 1, 模板里面不要有西文字符. 2, 尽量不要用word来编辑尤其是高版本的word,要用写字板来编辑. 1, ...

  6. golang表单及验证支持

    在Web开发中对于这样的一个流程可能很眼熟: 打开一个网页显示出表单. 用户填写并提交了表单. 如果用户提交了一些无效的信息,或者可能漏掉了一个必填项,表单将会连同用户的数据和错误问题的描述信息返回. ...

  7. html表单下拉美化教程,用javascript实现select的美化的方法

    论坛经常有人会问到用CSS如何美化Select标签,其实但凡你看到很酷的都是用javascript来实现的.昨天试着做了一下,基本实现的初级功能.拿出来和大家一起分享一下.先可以看一下预览效果:htt ...

  8. php显示html表单内容,HTML表单是什么?HTML表单内容的详细介绍(附代码)

    HTML 表单是用于搜集不同类型的用户输入的,表单是一个包含表单元素的区域:表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素:表单使用表单标签( )定义. 一.介 ...

  9. 前端页面与form表单提交:代码分享

    今天分享下"前端页面与form表单提交:代码分享"这篇文章,文中根据实例编码详细介绍,或许对大家的编程之路有着一定的参考空间与使用价值,需要的朋友接下来跟着云南仟龙Mark一起学习 ...

最新文章

  1. 函数项目一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)...
  2. python itertools模块实现排列组合
  3. 【论文学习】ICLR2021,鲁棒早期学习法:抑制记忆噪声标签ROBUST EARLY-LEARNING: HINDERING THE MEMORIZATION OF NOISY LABELS
  4. LinkedIn的使用开源项目
  5. Windows 10 关闭Hyper-V
  6. gulp + browsersync实现页面自动刷新
  7. sqlite事务模型、性能优化tips、常见误区
  8. word转pdf公式乱码_求助:Word转pdf时公式会公式变成乱码
  9. 三菱Q系列做modbusTCP服务器,汇川H3u与三菱Q/L系列PLC MODBUS TCP通信说明
  10. 【信息汇总】北京航空航天大学计算机考研
  11. 功率 db 和dbm 的区别
  12. wordpress网站被挂马处理
  13. 原生WebGL场景中绘制多个圆锥圆柱
  14. 报错 proxyconnect tcp: tls: first record does not look like a TLS handshake
  15. 过年表情包 || 一个月后就能用啦
  16. 日本亚马逊海淘经验-2015
  17. 硬核! 逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你!
  18. 26 欧拉积分疑惑解析
  19. JAVA中如何将大数字或字符串放进数组
  20. 超级应用入选Gartner十大技术趋势,小程序容器迎来爆发期

热门文章

  1. 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
  2. 【Android 应用开发】Android - 按钮组件详解
  3. 设计模式-Decorator模式
  4. wubantu18.04版,pycharm2.18.3.2永久破解来了,借鉴个位大神的教程破掉的,感谢各位大佬...
  5. [WCF] Restful 自定义宿主
  6. Cloud Native workshop
  7. HttpApplication IHttpAsyncHandler, IHttpHandler, IComponent, IDisposable ps url System.Web.dll
  8. C++ 继承和派生 及 学生管理范例
  9. [linux内核][LINUX内核编程]学习笔记(一)
  10. 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽