sanitize-html招募

发布人:仓颉技术交流平台官方
分类:工具库 / 其他工具

现招募开发者共同参与基于仓颉语言的高性能HTML sanitizer(HTML净化器)开发项目。该工具将基于成熟的sanitize-html设计理念,为核心功能提供安全可靠的HTML内容过滤解决方案。 本项目致力于为开源社区贡献一个企业级的HTML安全处理库,确保用户提交的HTML内容在保留必要格式的同时,彻底消除潜在的安全风险。

等待接取
2025-11-20
4

悬赏内容

招募内容

1. 项目简介

为丰富仓颉语言的开源生态,我们启动了一项公益性开源项目,旨在利用仓颉语言的系统级编程优势,开发一个高性能、高安全性的HTML净化库。该项目灵感来源于成熟的 sanitize-html库,但将从头进行原生设计与实现,旨在为仓颉语言提供一款企业级的内容安全处理工具。

项目核心价值:为解决Web应用中用户生成内容的可信渲染问题,提供一个默认安全、配置灵活、性能卓越的基础组件,保障Web应用的安全底线,同时保留内容的丰富表现形式。

2. 项目详细规格与技术要求

2.1 核心功能模块

本项目需实现的Sanitizer应包含以下核心模块,每个模块需有清晰的接口定义和严格的内部验证。

模块名称

功能描述

输入示例

预期输出

解析与树构建

将输入HTML字符串解析为内存中的抽象语法树,为后续过滤操作提供基础。

"<p>Hello </p>"

一棵代表 <p>和其子节点的DOM树。

标签与属性过滤引擎

根据预定义的白名单策略,对AST进行遍历,移除或转义不在白名单内的标签和属性。

输入同上,白名单中允许<p>,禁止``。

"<p>Hello </p>"

URL净化器

对标签属性中的URL(如 href, src) 进行验证,只允许特定的协议和可信域名。

<a href="javascript:alert('xss')">Click</a>

<a>Click</a>(属性被移除)

CSS净化器

style属性内的CSS进行解析和过滤,只允许安全的样式规则。

<p style="color:red; position:absolute;">Text</p>

<p style="color:red;">Text</p>(移除position)

输出序列化

将净化后的AST序列化回安全的HTML字符串。

净化后的AST

"<p class="safe">Safe HTML</p>"

2.2 配置化架构

该库必须通过一个高度可配置的结构体来定义净化策略。以下为仓颉语言的配置示例代码块:

// 示例:配置结构体定义 (仓颉语言风格伪代码)
SanitizeConfig ::= struct {
    // 允许的HTML标签列表
    allowed_tags: []string = ["p", "strong", "em", "a", "ul", "ol", "li", "br"],

    // 按标签名组织的允许属性列表,支持通配符
    allowed_attrs: map[string][]string = {
        "a": ["href", "title", "target"],
        "p": ["class"],
        // 允许所有标签拥有 'data-' 开头的自定义属性
        "*": ["data-*"]
    },

    // 允许的URL协议
    allowed_schemes: []string = ["http", "https", "mailto", "tel"],

    // 允许的iframe宿主域名
    allowed_iframe_hosts: []string = ["www.youtube.com", "player.vimeo.com"],

    // 处理非白名单标签的模式:丢弃、转义或递归转义
    disallowed_tags_mode: DisallowedMode = .Discard,
}

2.3 关键算法与流程

净化过程应遵循以下严谨的算法逻辑,特别是对于标签内容的处理:

// 示例:核心净化算法伪代码
func sanitize_html(html: string, config: SanitizeConfig) -> string {
    dom_tree = parse_html(html) // 解析为AST
    
    traverse_tree(dom_tree, func (node) {
        if node.type == .Element {
            // 1. 检查标签是否允许
            if !is_tag_allowed(node.name, config.allowed_tags) {
                handle_disallowed_tag(node, config.disallowed_tags_mode)
                return
            }
            
            // 2. 检查并过滤属性
            for attr in node.attributes.copy() {
                if !is_attribute_allowed(node.name, attr.name, config.allowed_attrs) {
                    node.attributes.remove(attr.name)
                    continue
                }
                
                // 3. 特殊属性(href, src)的URL验证
                if attr.name in ["href", "src", "cite"] {
                    if !is_url_safe(attr.value, config.allowed_schemes, config.allowed_iframe_hosts) {
                        node.attributes.remove(attr.name)
                    }
                }
                
                // 4. 过滤style属性
                if attr.name == "style" {
                    node.attributes["style"] = sanitize_css(attr.value)
                }
            }
        }
        
        // 递归处理子节点
        for child in node.children {
            traverse_tree(child)
        }
    })
    
    return serialize_tree(dom_tree)
}

3. 质量认证与交付物标准

3.1 质量认证标准表

认证类别

具体标准

验证方法

安全性

1. 在OWASP XSS防护备忘单的测试向量下,防护成功率达100%。
2. 无已知的绕过漏洞(如mXSS、Unicode编码绕过等)。
3. 依赖项无已知安全漏洞。

1. 通过自动化XSS测试向量集(如HTML5 Security Cheatsheet)。
2. 第三方安全代码审计。
3. 依赖成分分析(SCA)工具扫描。

正确性

1. 输出HTML100%符合XML/HTML5规范,可通过标准验证器。
2. 对于畸形HTML输入,具备良好的容错性,不崩溃且输出安全。
3. 所有公开API的函数行为与文档描述完全一致。

1. 使用W3C Validator等工具进行合规性测试。
2. 模糊测试(Fuzzing)和异常输入测试。
3. 完整的单元测试和集成测试。

性能

1. 在基准测试中,处理速度与主流同类库(如DOMPurify)处于同一数量级或更优。
2. 无内存泄漏,内存分配效率高。
3. 在长文档(>100KB)处理下,无明显的性能劣化。

1. 定义性能基准测试集,并持续监控。
2. 使用Valgrind、ASan等工具进行内存分析。
3. 压力测试和性能剖析(Profiling)。

可靠性

1. 代码测试覆盖率(行覆盖/分支覆盖)不低于95%。
2. 所有边界条件均有对应测试用例覆盖。
3. API 保持向后兼容,任何破坏性变更需遵循语义化版本控制。

1. 使用覆盖率工具(如gcov, llvm-cov)生成报告。
2. 测试用例评审。
3. 完善的变更日志和版本说明。

3.2 必需交付物

  • 源代码:结构清晰、注释完备的仓颉语言项目代码,托管于GitHub或Gitee。

  • API文档:使用标准文档工具生成的详细API参考,包含所有公共模块、结构体和函数的说明。

  • 测试套件:完整的单元测试、集成测试和性能基准测试代码,与源代码一同维护。

  • 示例程序:提供多个可直接运行的示例,展示从基础到高级的用法。

  • 安全审计报告:项目结项时,需提供由第三方或核心贡献者共同完成的安全评估摘要。

  • 开源许可:项目采用MIT许可证,确保最大程度的开放性。

相关附件

暂无附件

质量认证要求

交付件

NO

交付件描述

备注

1

三方库源代码

源代码

2

三方库测试方案和用例

测试用例和文档

3

用户手册,API文档,设计文档,license文档

 资料和文档

验收标准

1.功能

  1. 三方库必须有明确的功能;

  2. 如果参考对标库移值开发,功能与参考三方库保持一致。

2.资料

  1. Readme:包含简介,软件架构,目录结构,下载安装(编译构建),接口说明,使用示例,约束限制,开源协议,参与贡献等内容;

  2. Changelog,三方库版本需包含基本的修改说明。

3.标准遵从性(可选),三方库实现需满足对应协议或行业标准,举例

  1. appquth:支持对OAuth 的PKCE扩展;

  2. icu4j:支持unicode标准库,通用字符集ISO/IEC 10646。

4.性能目标

  1. 性能敏感三方库接口运行性能持平对标三方库

5.开源协议遵从,必须包含License文件

  1. 放置合适的开源License协议,建议Apache License Version 2.0;

  2. 引用或参考开源三方库,需遵从开源协议。

6.网络安全要求

  1. 满足基础的网络安全红线及隐私要求,符合安全编码规范。

过程质量要求

指标分类

指标名称

指标要求

度量工具

牵引 OR Must

代码度量

平均文件代码行

≤300 LOC

CMetricsPlus,CJMetric

Must

总文件重复率

C/C++≤4%;相比开源不劣化

CMetricsPlus,CJMetric

Must

源文件重复率

C/C++≤4%;相比开源不劣化

CMetricsPlus,CJMetric

Must

平均函数或方法代码行*

≤30  LOC

CMetricsPlus,CJMetric

Must

总代码重复率

C/C++≤10%;相比开源不劣化

CMetricsPlus,CJMetric

Must

源文件代码重复率

C/C++≤10%;相比开源不劣化

CMetricsPlus,CJMetric

Must

平均圈复杂度

≤5;相比开源不劣化

CMetricsPlus,CJMetric

Must

冗余代码

“0” 【2】;

CMetricsPlus,CJMetric

Must

不安全函数

NA

CMetricsPlus,CJMetric

Must

静态检查

编译告警

“0” 【2】

Compile工具

牵引

通用静态告警

“0” 【2】

Pclint plus,CJLINT

Must

开发者测试

DT用例密度(个/KLOC)

> 40

手工

牵引 

DT代码语句覆盖率

>=85%

Gcov,cjcov

牵引

DT代码分支覆盖率

>=50%

Gcov,cjcov

牵引

未做DT文件数

0

手工

牵引

问题解决率

遗留问题DI

整体<10

Issue

牵引 

遗留致命缺陷数(0)

0

Issue

Must

累计缺陷解决率

85%

Issue

牵引 

软件开发

每日构建成功率

100%

CI

牵引

测试评估

测试缺陷密度(/KLOC)

5-9

人工

牵引

测试用例密度(个/KLOC)

20-40

人工

牵引

初验用例自动化率

100%

CIDA

牵引 

HLT自动化用例比率

【85%,95%】

CIDA

牵引 

开源第三方(含构建工具)

开源片段引用

0(除例外备案类)

FOSSBOT+人工

Must

可信构建

二进制一致性

0(含可澄清)

人工

Mus