Go基础学习记录 - 编写Web应用程 - 重复提交

{app.params.name}}{app.params.name}}{app.params.name}}

本次分享下 -- 表单的重复提交

为了保持项目的可学习性,我这里将之前分享的代码积累了下,放在github上,想要尽快入手学习的,可以直接clone我的代码,写代码不上手,都等于白搭,光看的话,对于我来说,我是不行的,没办法学会。

项目地址

https://github.com/durban89/wiki_blog
tag: 1.0.6

有些同学可能看不懂,怎么就只给了这些,完全不懂呀。我把使用的命令打出来,照着操作,就应该可以解决了

git clone https://github.com/durban89/wiki_blog /local/path
cd /local/path
git fetch origin
git checkout 1.0.6

这些我觉得 够清晰了。OK!

继续分享"重复提交"的分享。

重复提交

我不知道你有没有看到一些博客或BBS有多个帖子完全相同,但我可以告诉你,这是因为用户提交了重复的帖子导致的。
有许多事情可能会导致重复提交;
有时用户只需双击提交按钮,或者他们想在发布后修改一些内容,然后按后退按钮。
在某些情况下,这是恶意用户的故意行为。
很容易看出重复提交会如何导致许多问题。
因此,我们必须使用有效的手段来预防它。
解决方案是向表单添加一个带有唯一标记的隐藏字段,并在处理传入数据之前始终检查此标记。
此外,如果您使用Ajax提交表单,请在提交表单后使用JavaScript禁用提交按钮。
具体实例演示如下

第一步 首先修改下我们的edit.html

添加如下代码

<input type="hidden" name="token" value="{{.Token}}">

第二步 修改我们的Page结构体

type Page struct {
  Title  string
  Body   []byte
  Script string
  Html   template.HTML
  Token  string
}

第三步 添加Token

修改ArticleEdit函数,添加生成token的逻辑

crutime := time.Now().Unix()
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
token := fmt.Sprintf("%x", h.Sum(nil))

当我们重新编译程序并运行后,访问edit页面的时候,通过查看源代码的方式能够看到有如下代码

<input type="hidden" name="token" value="f3072482bbf23a8cbf2eeef3dd489eaf">

您可以刷新页面,每次都会看到不同的token。
这确保了每种形式都是独特的。

第四步 添加验证逻辑

我这里修改ArticleSave函数,并添加如下逻辑

if token != "" {
  // check token validity
  fmt.Println("Token is empty")
} else {
  // give error if no token
  fmt.Println("To Validate Token")
}

我们使用MD5哈希(时间戳)生成令牌,并将其添加到客户端表单上的隐藏字段和服务器端的会话cookie(后面的分享中介绍)。
然后我们可以使用此令牌来检查此表单是否已提交。


目前,您可以通过向表单添加令牌来防止许多重复提交攻击,但它无法阻止此类型的所有欺骗性攻击。
还有许多工作需要完成


今天就分享到这里,如果你有更好的方法请在下方留言或者加群交流


项目更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.7

 

版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/59



版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 小绒毛的足迹博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/59