From 7c18d1dfa7f1d3f6bff07176dd279c87138f9201 Mon Sep 17 00:00:00 2001 From: astaxie Date: Fri, 7 Sep 2012 16:27:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E7=AC=AC=E5=9B=9B?= =?UTF-8?q?=E7=AB=A0=E7=9A=84=E5=86=99=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 4.3.md | 13 +++--- 4.4.md | 63 +++++++++++++++++++++++++---- 4.5.md | 87 +++++++++++++++++++++++++++++++++++++++++ 4.6.md | 12 ++++++ images/4.4.token.png | Bin 0 -> 14634 bytes images/4.5.upload.png | Bin 0 -> 12980 bytes images/4.5.upload2.png | Bin 0 -> 6598 bytes 7 files changed, 161 insertions(+), 14 deletions(-) create mode 100644 4.5.md create mode 100644 4.6.md create mode 100644 images/4.4.token.png create mode 100644 images/4.5.upload.png create mode 100644 images/4.5.upload2.png diff --git a/4.3.md b/4.3.md index cb705646..783e889f 100644 --- a/4.3.md +++ b/4.3.md @@ -6,11 +6,12 @@ 对XSS最佳的防护应该结合以下两种方法:验证所有输入数据,有效检测攻击(这个我们前面小节已经有过介绍);对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。 -那么Go里面是怎么做这个有效防护的呢?Go的html/template里面带有下面几个函数可以帮你转移 +那么Go里面是怎么做这个有效防护的呢?Go的html/template里面带有下面几个函数可以帮你转义 + +- func HTMLEscape(w io.Writer, b []byte) //把b进行转义之后写到w +- func HTMLEscapeString(s string) string //转义s之后返回结果字符串 +- func HTMLEscaper(args ...interface{}) string //支持多个参数一起转义,返回结果字符串 -- func HTMLEscape(w io.Writer, b []byte) //把需要转移的b进行转义之后写到w -- func HTMLEscapeString(s string) string //转移s之后返回转义的字符串 -- func HTMLEscaper(args ...interface{}) string //支持多个参数一起转义,然后返回一个字符串 我们看4.1小节的例子 @@ -18,11 +19,11 @@ fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password"))) template.HTMLEscape(w, []byte(r.Form.Get("username"))) //输出到客户端 -我们看到最后输出到客户端的代码如下: +如果我们输入的username是``,那么我们可以在浏览器上面看到输出如下所示: ![](images/4.3.escape.png?raw=true) -那么我们在输出我们的模板的时候怎么处理的呢?Go的html/template包现在默认就帮你过滤了html元素,但是有时候你又想输出这样的信息,text/template也支持。请看下面的例子所示 +那么我们在输出我们的模板的时候怎么处理的呢?Go的html/template包默认帮你过滤了html元素,但是有时候你又想输出这样的信息,请使用text/template。请看下面的例子所示 import "text/template" ... diff --git a/4.4.md b/4.4.md index f947d8cf..8de992b8 100644 --- a/4.4.md +++ b/4.4.md @@ -1,9 +1,56 @@ -#4.4防止多次递交表单 - -## links - * [目录]() - * 上一节: [预防跨站脚本](<4.3.md>) - * 下一节: [处理文件上传](<4.5.md>) - -## LastModified +#4.4防止多次递交表单 + +不知道你是否曾经看到过一个论坛或者博客,在一个帖子或者文章后面出现多条重复的记录,这些大多数是因为用户重复递交了留言的表单引起的。由于种种原因,用户经常会重复递交表单。通常这只是鼠标的误操作,如双击了递交按钮,也可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退按钮,然后又再次点击了递交按钮而不是浏览器的前进按钮。当然,也可能是故意的——比如,在某项在线调查或者博彩活动中重复投票。那我们如何有效的防止用户多次递交相同的表单呢? + +解决方案是在表单中添加一个带有唯一值得隐藏字段。在验证表单时,先检查带有该惟一值的表单是否已经递交过了。如果是,拒绝再次递交;如果不是,则处理表单进行逻辑处理。另外,如果是采用了Ajax模式递交表单的话,当表单递交后,通过javascript来禁用表单的递交按钮。 + +我继续拿4.2小节的例子优化: + + 用户名: + 密码: + + + +我们看到在模版里面我们增加了一个隐藏字段`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"))) //输出到客户端 + } + } + +上面的代码输出到页面的源码如下: + +![](images/4.4.token.png?raw=true) + +我们看到token已经有输出值,你可以不断的刷新,可以看到这个值在不断的变化。这样就保证了每次显示form表单的时候都是唯一的,用户递交的表单保持了唯一性。 + +我们的解决方案可以防止非恶意的攻击,并能使恶意用户暂时不知所措,然后,它却不能排除所有的欺骗性的动机,对此类情况还需要更复杂的工作。 + +## links + * [目录]() + * 上一节: [预防跨站脚本](<4.3.md>) + * 下一节: [处理文件上传](<4.5.md>) + +## LastModified * $Id$ \ No newline at end of file diff --git a/4.5.md b/4.5.md new file mode 100644 index 00000000..888eec77 --- /dev/null +++ b/4.5.md @@ -0,0 +1,87 @@ +#4.5处理文件上传 +你想处理一个由用户上传的文件。例如,你正在建设一个类似Instagram 的网站,所以需要处理和存储用户提供的照片。我们该如何处理呢? + +文件要能够上传,首先第一步就是要修改form的`enctype`属性,`enctype`属性有如下三种情况: + + application/x-www-form-urlencoded 表示在发送前编码所有字符(默认) + multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 + text/plain 空格转换为 "+" 加号,但不对特殊字符编码。 + +我们如果要使得文件能够上传,那么我们的html应该如下所示 + + + + 上传文件 + + +
+ + + +
+ + + +我们增加一个handlerFunc如下: + + http.HandleFunc("/upload", upload) + + // upload + func upload(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("upload.gtpl") + t.Execute(w, token) + } else { + r.ParseMultipartForm(32 << 20) + file, handler, err := r.FormFile("file") + if err != nil { + fmt.Println(err) + } + defer file.Close() + fmt.Fprintf(w, "%v", handler.Header) + f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + panic(err) + } + defer f.Close() + io.Copy(f, file) + } + } + +通过上面的代码我们可以看到,文件上传我们需要调用`r.ParseMultipartForm`,里面的参数表示maxMemory,调用`ParseMultipartForm`之后我们上传的文件存储在设置的那么大的内存里面,如果文件大小超过了这个内存,那么剩下的部分存储在系统的临时文件中。我们可以通过`r.FormFile`获取上面的文件句柄,然后实例中使用了`io.Copy`来存储文件。 + +>获取其他非文件字段信息的时候就不需要调用`r.ParseForm`,因为在需要的时候Go自动会去调用。而且`ParseMultipartForm`调用一次之后,后面再次调用不会再有效果。 + +通过上面的实例我们可以看到我们上传文件主要三步处理: + +- 1、表单中增加enctype="multipart/form-data" +- 2、服务端调用`r.ParseMultipartForm`,把上传的文件存储在内存和临时文件中 +- 3、使用`r.FormFile`获取文件句柄,然后对文件进行存储等处理。 + +文件handler是multipart.FileHeader,里面存储了如下结构信息 + + type FileHeader struct { + Filename string + Header textproto.MIMEHeader + // contains filtered or unexported fields + } + +我们通过上面的实例代码打印出来上传文件的信息如下 + +![](images/4.5.upload2.png?raw=true) + + + +## links + * [目录]() + * 上一节: [防止多次递交表单](<4.4.md>) + * 下一节: [小结](<4.6.md>) + +## LastModified + * $Id$ \ No newline at end of file diff --git a/4.6.md b/4.6.md new file mode 100644 index 00000000..4c562cd3 --- /dev/null +++ b/4.6.md @@ -0,0 +1,12 @@ +#4.6 小结 +这一章里面我们学习了Go里面如何处理表单信息,我们通过一个登陆、一个上传例子展示了Go处理form表单信息,处理文件上传的能力。但是在处理表单过程中我们需要验证用户输入的信息,考虑到网站安全、数据过滤就变得相当重要了,因此专门一个小节讲解了各方面的数据过滤,顺带讲了一下Go里面对正则的处理。 + +通过这一章能够让你了解客户端和服务器端如何进行数据的交互,让客户端的数据进入我们的系服务器统,让我们系统处理之后的数据展现给客户端。 + +## links + * [目录]() + * 上一节: [处理文件上传](<4.4.md>) + * 下一章: [访问数据库](<5.md>) + +## LastModified + * $Id$ \ No newline at end of file diff --git a/images/4.4.token.png b/images/4.4.token.png new file mode 100644 index 0000000000000000000000000000000000000000..b52cc1d1fdaf071e0dd85060400419db8448fcdb GIT binary patch literal 14634 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 literal 0 HcmV?d00001 diff --git a/images/4.5.upload2.png b/images/4.5.upload2.png new file mode 100644 index 0000000000000000000000000000000000000000..06460446989beeaf93e5c6f4f6b2d54394da1c58 GIT binary patch literal 6598 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 literal 0 HcmV?d00001