Go基礎學習記錄 - 編寫Web應用程序 - 安全驗證

轉載
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路由時,會出現異常錯誤提示學習

相關文章
相關標籤/搜索