Go基础学习记录 - 编写Web应用程 - Web开发输入验证(一)

转载
Go基础学习记录 - 编写Web应用程 - Web开发输入验证(一)
前面的文章分享的部分功能都能正常使用,本次分享分析下 -- 输入验证前端

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

项目地址github

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

有些同窗可能看不懂,怎么就只给了这些,彻底不懂呀。我把使用的命令打出来,照着操做,就应该能够解决了正则表达式

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

这些我以为 够清晰了。OK!typescript

继续分享的输入验证的逻辑。后端

Web开发中最重要的原则之一是您不能信任客户端用户表单中的任何内容。
您必须在使用以前验证全部传入数据。
许多网站都受到这个问题的影响,这个问题既简单又相当重要。
有两种方法能够验证经常使用的表单数据。
第一个是前端的JavaScript验证,第二个是后端的服务器验证。
本次只分享Web开发中的服务器端验证。安全

必填字段

有时咱们要求用户输入一些字段,但他们没法完成该字段。可使用len函数来获取字段的长度,以确保用户输入了某些内容。在ArticleSave方法中加入以下代码服务器

if len(r.Form["author"][0]) == 0 {
    fmt.Println("author is empty")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

当提交的时候咱们不给author赋值,而后点击Submit提交,会看到输出以下内容函数

author: []
author is empty

r.Form在空白时对待不一样的表单元素类型。
对于空文本框,文本区域和文件上传,它返回一个空字符串;
对于单选按钮和复选框,它甚至不会建立相应的项目。
相反,若是您尝试访问它,您将收到错误。
所以,使用r.Form.Get()获取字段值更安全,由于若是该值不存在,它将始终返回空。
另外一方面,r.Form.Get()一次只能得到一个字段值,所以您须要使用r.Form来获取值的映射。咱们修改下刚才那段代码以下性能

if len(r.Form.Get("author")) == 0 {
    fmt.Println("author is empty")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

当提交的时候咱们不给author赋值,而后点击Submit提交,会看到输出以下内容

author: []
author is empty

获得的结果跟上段代码是一致的

数字

有时咱们须要提交过来的数据是数字而不是字段值等其余文本。
例如,假设咱们只须要整数形式的用户年龄,即50或10,而不是“足够老”或“年轻人”。
若是咱们须要一个正数,咱们能够先将值转换为int类型,而后再处理它。下面咱们在ArticleSave方法中加入以下代码

getint, err := strconv.Atoi(r.Form.Get("author"))
if err != nil {
    fmt.Println(err)
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}
fmt.Println("getint:", getint)

当提交的时候咱们给author赋值durban,而后点击Submit提交,会看到输出以下内容

author: [durban]
strconv.Atoi: parsing "durban": invalid syntax

当提交的时候咱们给author赋值10,而后点击Submit提交,会看到输出以下内容

author: [10]
getint: 10

另外一种方法是使用正则表达式。
代码以下,咱们将上面的代码段更换以下

if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("author")); !m {
    fmt.Println("非整数")
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
    return
}
fmt.Println("get author:", r.Form.Get("author"))

当提交的时候咱们给author赋值10,而后点击Submit提交,会看到输出以下内容

author: [10]
get author: 10

出于高性能目的,正则表达式效率不高,但简单的正则表达式一般足够快。
若是您熟悉正则表达式,那么这是验证数据的一种很是方便的方法。
请注意,Go使用[RE2],所以支持全部UTF-8字符。

**RE2是一种快速,安全,线程友好的替代方法,用于回溯正则表达式引擎,如PCRE,Perl和Python中使用的那些。
它是一个C ++库。**

项目更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.2
相关文章
相关标签/搜索