转载
Go基础学习记录 - 编写Web应用程序 - 安全验证正则表达式
前面加了不少功能,可是程序存在严重的安全漏洞,用户能够访问在服务器上读/写的任意路径。
为了缓解这种状况,咱们能够编写一个函数来使用正则表达式验证标题。
首先,将"regexp"添加到导入列表中。
而后咱们能够建立一个全局变量来存储咱们的验证表达式:安全
var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$")
函数regexp.MustCompile将解析并编译正则表达式,并返回一个regexp.Regexp。
MustCompile与Compile的区别在于,若是表达式编译失败,它将会出现异常,而Compile会将错误做为第二个参数返回。
如今,让咱们编写一个函数,该函数使用validPath表达式来验证路径并提取页面标题服务器
func getTitle(w http.ResponseWriter, r *http.Request) (string, error) { m := validPath.FindStringSubmatch(r.URL.Path) if m == nil { http.NotFound(w, r) return "", errors.New("无效的页面标题") } return m[2], nil // 标题是第二个子表达式中 }
若是标题有效,它将与nil错误值一块儿返回。
若是标题无效,该函数将向HTTP链接写入“404 Not Found”错误,并向处理程序返回错误。
要建立新错误,咱们必须导入错误包。
下面在每一个处理程序中调用getTitle:函数
func viewHandler(w http.ResponseWriter, r *http.Request) { title, err := getTitle(w, r) if err != nil { return } p, err := loadPage(title) if err != nil { http.Redirect(w, r, "/edit/"+title, http.StatusFound) return } renderTemplate(w, "view", p) } func editHandler(w http.ResponseWriter, r *http.Request) { title, err := getTitle(w, r) if err != nil { return } p, err := loadPage(title) if err != nil { p = &Page{Title: title} } renderTemplate(w, "edit", p) } func saveHandler(w http.ResponseWriter, r *http.Request) { title, err := getTitle(w, r) if err != nil { return } body := r.FormValue("body") p := &Page{ Title: title, Body: []byte(body), } err = p.save() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } http.Redirect(w, r, "/view/"+title, http.StatusFound) }
修改完以后,从新编译并运行程序,当访问非edit、view、save路由时,会出现异常错误提示学习