sql注入与xss本质不同,须分层防御:sql注入靠参数化查询拦截,xss靠bluemonday等白名单在handler层过滤富文本,并按html上下文严格校验输出。

直接说结论:SQL 注入和 XSS 是两类完全不同的漏洞,不能用同一个“过滤”动作同时解决;对含 HTML 的字符串,重点防 XSS,而 SQL 注入根本就**不该让它进 SQL 语句**——靠参数化查询拦截,不是靠字符串清洗。
为什么不能用同一套“过滤”防 SQL + XSS
SQL 注入发生在数据库查询拼接阶段,XSS 发生在 HTML 渲染阶段,两者触发位置、上下文、逃逸方式全都不一样。试图用正则删掉 <script></script> 同时又想拦住 ' OR 1=1 --,等于让一个函数干两件逻辑无关的事,结果是两边都防不住。
- 对 SQL 注入:Go 中唯一可靠方案是全程使用
db.Query/db.Prepare的参数占位符($1或?),用户输入永远不拼进 SQL 字符串 - 对 XSS:含 HTML 的字符串只可能出现在输出环节(如评论、文章正文),防御必须在渲染前完成,且必须按上下文区分处理
- 把
html.EscapeString或bluemonday.Sanitize的结果塞进 SQL 查询?这是典型误用——你本就不该把富文本当 SQL 参数用
含 HTML 的字符串该在哪一层过滤、用什么工具
富文本(比如用户提交的带 <p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7761" title="Article To Html"><img
src="https://img.php.cn/upload/skill/000/000/081/179168408018805.jpg" alt="Article To Html" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill7761" title="Article To Html" class="overflowclass">Article To Html</a>
<p class="overflowclass">文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。</p>
</div>
<a rel="nofollow" href="/xiazai/skill7761" title="Article To Html" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>、<strong></strong> 的评论)必须在 HTTP handler 层过滤,不能丢给模板或前端,更不能入库前硬删标签。
- 必须用
bluemonday做白名单解析过滤,不是正则:它会真正 parse 成 DOM 树,再按策略剔除危险标签(<script></script>)、危险属性(onerror、javascript:协议) - 选
bluemonday.UGCPolicy(),不是StrictPolicy():前者保留常见排版标签(<ul></ul>、<em></em>),后者会清空所有格式 - 过滤后得到的 clean 字符串,仍需显式转成
template.HTML类型,才能在html/template中绕过自动转义;否则<p>Hello</p>会被当纯文本显示出来 - 绝不在模板里写
{{.Raw | safeHTML}}:过滤逻辑必须前置到 handler,模板只负责渲染
哪些地方绝对不能依赖“过滤”,必须换做法
很多人以为“只要过一遍 bluemonday 就安全了”,但漏掉关键上下文,照样被绕过。
- 用户填的 URL 塞进
<a href="%7B%7B.URL%7D%7D"></a>?光过滤 HTML 不够,还得校验协议:strings.HasPrefix(url, "https://") || strings.HasPrefix(url, "/"),拒绝javascript:、data: - 要把用户输入塞进
<script>var name = "{{.Name}}";</script>?禁止字符串拼接,改用json.Marshal输出到data-属性,前端再读取 - 用户头像地址塞进
<img src="%7B%7B.Avatar%7D%7D">?同样要协议校验,且src属性值必须加引号,否则src=x onerror=alert(1)可能生效 - 用
text/template渲染?立刻失效——只有html/template有上下文感知转义能力
最常被忽略的一点:template.HTML 不是过滤器,是信任声明。你把它包在变量上,等于告诉模板引擎“这段我已确认安全”,如果上游没走 bluemonday,或者过滤后又被二次污染,XSS 就直接落地了。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










