Golang如何正确存储和从数据库读取HTML内容

Golang如何正确存储和从数据库读取HTML内容 我正在尝试将来自summernote的HTML保存到PostgreSQL数据库中,然后将其取出并在产品页面中显示。

以下是保存产品的代码:

func addProductToDB(product productsDB) {
	sqlStatement := `
	UPDATE product_information
	SET title = $2,description = $3,current_price = $4,old_price = $5, category_id=$6
	WHERE id = $1`
	_, err := db.Exec(sqlStatement, product.Id, product.Title, product.Description, product.Current_Price, product.Current_Price, product.Category)
	if err != nil {
		panic(err)
	}
}

以下是我如何显示它:

func showProductHandler(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	id, err := strconv.ParseInt(r.FormValue("id"), 10, 32)
	checkErr(err)
	product := getSingleProductFromDB(id)
	html := string(productTemplate)
	ctx := plush.NewContext()
	ctx.Set("product", product)
	ctx.Set("productId", id)
	s, _ := plush.Render(html, ctx)
	fmt.Fprint(w, s)
}

问题是HTML显示为经过清理的状态(如果这是正确的说法)。基本上它显示为纯文本。我认为这是作为安全措施而实施的。我应该如何使其按照原始格式显示文本。

此致


更多关于Golang如何正确存储和从数据库读取HTML内容的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

尝试在 ResponseWriterHeaders 中设置内容类型为 “text/html” 之类的值。

更多关于Golang如何正确存储和从数据库读取HTML内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中正确存储和显示HTML内容需要确保HTML不被转义。当使用模板引擎时,默认行为通常会对HTML进行转义以防止XSS攻击。以下是解决方案:

首先,确保数据库字段类型能够存储HTML内容。PostgreSQL的textvarchar类型都可以存储HTML。

在显示时,需要使用模板的HTML类型来防止转义。以下是修改后的代码示例:

func showProductHandler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    id, err := strconv.ParseInt(r.FormValue("id"), 10, 32)
    if err != nil {
        http.Error(w, "Invalid product ID", http.StatusBadRequest)
        return
    }
    
    product := getSingleProductFromDB(id)
    
    // 创建自定义模板函数来输出原始HTML
    funcMap := template.FuncMap{
        "safeHTML": func(s string) template.HTML {
            return template.HTML(s)
        },
    }
    
    // 解析模板并使用函数映射
    tmpl, err := template.New("product").Funcs(funcMap).Parse(productTemplate)
    if err != nil {
        http.Error(w, "Template error", http.StatusInternalServerError)
        return
    }
    
    // 在模板中使用safeHTML函数
    err = tmpl.Execute(w, map[string]interface{}{
        "product":   product,
        "productId": id,
    })
    if err != nil {
        http.Error(w, "Template execution error", http.StatusInternalServerError)
    }
}

在模板中,使用safeHTML函数来显示未转义的HTML:

<div class="product-description">
    {{safeHTML .product.Description}}
</div>

如果你使用的是plush模板引擎,解决方案类似。Plush支持原始HTML输出:

func showProductHandler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    id, err := strconv.ParseInt(r.FormValue("id"), 10, 32)
    checkErr(err)
    
    product := getSingleProductFromDB(id)
    html := string(productTemplate)
    ctx := plush.NewContext()
    ctx.Set("product", product)
    ctx.Set("productId", id)
    
    // 在plush模板中使用raw过滤器
    s, err := plush.Render(html, ctx)
    if err != nil {
        http.Error(w, "Template rendering error", http.StatusInternalServerError)
        return
    }
    fmt.Fprint(w, s)
}

在Plush模板中:

<div class="product-description">
    <%= raw(product.Description) %>
</div>

存储HTML到数据库的代码不需要修改,因为HTML内容已经作为字符串正确存储。关键是在显示时使用适当的方法防止HTML转义。

注意:直接输出原始HTML存在安全风险,请确保HTML内容来自可信来源,或者在使用前进行适当的清理和验证。

回到顶部