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

解决方案是在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带有该惟一值的表单是否已经递交过了。如果是,拒绝再次递交;如果不是,则处理表单进行逻辑处理。另外,如果是采用了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. 交换网络安全防范系列五之802.1x-基于端口的网络访问控制技术
  2. python 绘制柱状图-「Python」python绘制图表
  3. 严定贵:互联网金融的速度与激情
  4. VS2010下安装配置OpenCV2.4.4
  5. marquee 移动属性
  6. InnoDB还是MyISAM?
  7. 用python将图片写入ppt_用python做ppt服务用于导入图片
  8. 360浏览器收藏夹_换了一台电脑,浏览器收藏的网站不见了,咋办?
  9. Dom4j工具--XML的DOM解析(下)--写操作
  10. 黑马程序员---java基础------------------多线程
  11. Java实验9 T6.将对象和数组存储在dat文件中
  12. Docker是什么,有什么用?一看就明白
  13. python实现对某招聘网接口测试获取平台信息
  14. 2022年中青杯B题数学建模文档及程序-三孩生育数学建模
  15. 《FLUENT 14流场分析自学手册》——第2章 流体流动分析软件概述 2.1 CFD软件简介...
  16. ①读后感之《当我们谈论爱情时我们在谈论什么》┊(美)雷蒙德.卡佛
  17. 【面向对象-09】子类、父类方法重写和覆盖
  18. QNX Hypervisor —— 虚拟设备
  19. PPT:灯塔工厂相关介绍
  20. Hive基础知识概念

热门文章

  1. ASP.NET Core WebAPI中的分析工具MiniProfiler
  2. jsp经验-Filter
  3. symmetric-tree
  4. C# 获取USB设备信息
  5. Struts2 访问web元素
  6. 无标题窗体的移动及其简单美化
  7. oracle10g- emctl start dbconsole 启动问题
  8. 课程名称翻译大全(zz)
  9. Spring Boot集成Hazelcast实现集群与分布式内存缓存
  10. 华为USG Firewall Ipsec L2L