0

0

输出格式要求:标题:Go 模板中安全地允许特定 HTML 标签

碧海醫心

碧海醫心

发布时间:2025-08-30 15:13:22

|

313人浏览过

|

来源于php中文网

原创

输出格式要求:标题:Go 模板中安全地允许特定 HTML 标签

第一段引用上面的摘要:

gohtml/template 包中,处理来自不可信来源的 html 内容时,直接使用 html 类型可能会引入安全风险。本文介绍了一种通过解析 html 并仅保留特定允许的标签,从而安全地在 go 模板中渲染部分 html 内容的方法。该方法利用第三方库,例如 go-html-transform,来解析 html,过滤掉未授权的标签和属性,并最终生成安全可信的输出,从而避免潜在的跨站脚本攻击(xss)。

在 Web 应用程序中,尤其是论坛或评论系统,经常需要处理用户提交的 HTML 内容。直接将这些内容未经处理地渲染到页面上,会带来严重的安全风险,例如跨站脚本攻击(XSS)。Go 的 html/template 包提供了强大的 HTML 转义功能,可以有效地防止 XSS 攻击。然而,在某些情况下,我们可能希望允许用户使用一些基本的 HTML 标签,例如
等,来实现简单的格式化。

一种安全的做法是解析 HTML 内容,并仅保留允许的标签和属性。这可以通过以下步骤实现:

  1. 使用 HTML 解析器: 选择一个合适的 HTML 解析器。go-html-transform 是一个常用的选择,因为它专门设计用于转换和清理 HTML。虽然 Go 1 移除了 exp/html,但 go-html-transform 提供了类似的功能,并且更加健壮。

  2. 定义白名单: 创建一个白名单,其中包含允许的 HTML 标签和属性。例如,我们可能允许 p、br、b、i 标签,以及 href 属性(仅用于 a 标签)。

    立即学习前端免费学习笔记(深入)”;

  3. 解析和过滤: 使用 HTML 解析器解析用户提交的 HTML 内容。然后,遍历解析后的 HTML 树,移除所有不在白名单中的标签和属性。

  4. 生成安全 HTML: 将过滤后的 HTML 树重新序列化为 HTML 字符串。这个字符串可以安全地在模板中渲染,因为它只包含允许的标签和属性。

    万知
    万知

    万知: 你的个人AI工作站

    下载

示例代码 (使用 go-html-transform):

package main

import (
    "fmt"
    "strings"

    "github.com/jaytaylor/html2text"
    "golang.org/x/net/html"
)

// allowedTags 定义允许的 HTML 标签
var allowedTags = map[string]bool{
    "p":  true,
    "br": true,
    "b":  true,
    "i":  true,
    "a":  true,
}

// allowedAttributes 定义允许的 HTML 属性,以及允许的标签
var allowedAttributes = map[string]map[string]bool{
    "a": {"href": true},
}

// sanitizeHTML 对 HTML 进行清理,只保留白名单中的标签和属性
func sanitizeHTML(htmlString string) (string, error) {
    root, err := html.Parse(strings.NewReader(htmlString))
    if err != nil {
        return "", err
    }

    var f func(*html.Node)
    f = func(n *html.Node) {
        // 移除不在白名单中的标签
        if n.Type == html.ElementNode {
            if _, ok := allowedTags[n.Data]; !ok {
                n.Type = html.TextNode
                n.Data = "" // 移除标签内容
            } else {
                // 清理属性
                var attrs []html.Attribute
                for _, attr := range n.Attr {
                    if allowedAttributes[n.Data] == nil || allowedAttributes[n.Data][attr.Key] {
                        attrs = append(attrs, attr)
                    }
                }
                n.Attr = attrs
            }
        }

        // 递归处理子节点
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            f(c)
        }
    }

    f(root)

    // 将 HTML 树重新序列化为字符串
    sanitizedHTML, err := html2text.RenderNode(root)
    if err != nil {
        return "", err
    }

    return sanitizedHTML, nil
}

func main() {
    untrustedHTML := `

This is a bold text with a and link.

` safeHTML, err := sanitizeHTML(untrustedHTML) if err != nil { fmt.Println("Error:", err) return } fmt.Println("Original HTML:", untrustedHTML) fmt.Println("Sanitized HTML:", safeHTML) }

注意事项:

  • 性能: HTML 解析和过滤可能比较耗时,尤其是在处理大型 HTML 文档时。考虑使用缓存或其他优化技术来提高性能。
  • 复杂性: HTML 解析是一项复杂的任务,需要处理各种边缘情况。确保选择一个成熟、可靠的 HTML 解析器。
  • 安全: 仔细审查白名单,确保只允许必要的标签和属性。避免允许可能导致 XSS 攻击的标签和属性,例如 script、onload 等。
  • 转义: 即使使用了白名单,仍然建议对输出的 HTML 进行转义,以防止意外的 XSS 攻击。Go 的 html/template 包会自动进行转义。

总结:

通过解析 HTML 并仅保留白名单中的标签和属性,可以安全地在 Go 模板中渲染部分 HTML 内容。这种方法可以有效地防止 XSS 攻击,同时允许用户使用一些基本的 HTML 格式化。请务必谨慎选择 HTML 解析器,并仔细审查白名单,以确保应用程序的安全性。 使用 go-html-transform 库能够方便地实现 HTML 的解析和清理,并提供更安全的 HTML 输出。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

653

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

83

2025.08.07

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 25.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号