Go 博客评论功能可用 net/http 和 SQLite 实现:解析 POST 表单、校验长度与邮箱格式、转义 XSS、过滤 spam 词、参数化插入、303 重定向成功或 400/500 错误响应。

在 Go 中实现博客评论提交功能,核心是处理表单提交、验证输入、存储数据并安全返回响应。不需要复杂框架,用标准库 net/http 和轻量数据库(如 SQLite 或内存 map)就能快速搭出可用原型。
接收并解析评论表单数据
用户通常通过 POST 表单提交评论,包含字段如 author、email、content 和隐藏的 post_id。使用 r.ParseForm() 解析,并用 r.FormValue() 获取字段:
- 确保路由只接受 POST 方法,避免 GET 滥用
- 对
content做基础长度限制(如 1–1000 字符),防止空评或超长垃圾内容 - 用
strings.TrimSpace()清除首尾空格,再判断是否为空
简单但必要的输入校验与清理
不依赖第三方库也能做有效防护:
- 用
html.EscapeString()转义author和content,防止 XSS(前端渲染时仍需信任 HTML 上下文) - 用正则粗略检查 email 格式(如
^[^\s@]+@[^\s@]+\.[^\s@]+$),不追求 RFC 完全合规,但拦住明显非法输入 - 拒绝包含典型 spam 关键词(如 “viagra”、“casino”)的评论,可存为 slice 简单遍历比对
保存评论到持久化层(以 SQLite 为例)
使用 github.com/mattn/go-sqlite3 驱动,建表语句示例:
立即学习“go语言免费学习笔记(深入)”;
CREATE TABLE IF NOT EXISTS comments (id INTEGER PRIMARY KEY AUTOINCREMENT, post_id INTEGER NOT NULL, author TEXT NOT NULL, email TEXT, content TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP)插入时使用参数化查询防止 SQL 注入:
_, err := db.Exec("INSERT INTO comments (post_id, author, email, content) VALUES (?, ?, ?, ?)", postID, author, email, content)- 检查
err并返回有意义的 HTTP 状态(如 400 表单错误,500 存储失败) - 成功后重定向回原文页面(303 See Other),避免刷新重复提交
返回响应:成功与错误都要清晰反馈
不要静默失败,也不要把错误细节暴露给用户:
- 成功:HTTP 303 +
Location: /post/123,前端自动跳转 - 表单校验失败:返回 400,重新渲染原页面,并在模板中显示提示(如
{{ if .Error }}{{ .Error }}{{ end }}) - 服务端错误(如 DB 连接中断):记录日志,返回通用提示“提交失败,请稍后再试”,状态码 500
不复杂但容易忽略。关键不是功能多全,而是每一步都守住边界:输入有约束、输出有转义、存储用预处理、反馈有状态。这样哪怕只是个人博客,评论区也扎实可用。










