sanitize-html招募
现招募开发者共同参与基于仓颉语言的高性能HTML sanitizer(HTML净化器)开发项目。该工具将基于成熟的sanitize-html设计理念,为核心功能提供安全可靠的HTML内容过滤解决方案。 本项目致力于为开源社区贡献一个企业级的HTML安全处理库,确保用户提交的HTML内容在保留必要格式的同时,彻底消除潜在的安全风险。
悬赏内容
招募内容
1. 项目简介
为丰富仓颉语言的开源生态,我们启动了一项公益性开源项目,旨在利用仓颉语言的系统级编程优势,开发一个高性能、高安全性的HTML净化库。该项目灵感来源于成熟的 sanitize-html库,但将从头进行原生设计与实现,旨在为仓颉语言提供一款企业级的内容安全处理工具。
项目核心价值:为解决Web应用中用户生成内容的可信渲染问题,提供一个默认安全、配置灵活、性能卓越的基础组件,保障Web应用的安全底线,同时保留内容的丰富表现形式。
2. 项目详细规格与技术要求
2.1 核心功能模块
本项目需实现的Sanitizer应包含以下核心模块,每个模块需有清晰的接口定义和严格的内部验证。
模块名称 | 功能描述 | 输入示例 | 预期输出 |
|---|---|---|---|
解析与树构建 | 将输入HTML字符串解析为内存中的抽象语法树,为后续过滤操作提供基础。 |
| 一棵代表 |
标签与属性过滤引擎 | 根据预定义的白名单策略,对AST进行遍历,移除或转义不在白名单内的标签和属性。 | 输入同上,白名单中允许 |
|
URL净化器 | 对标签属性中的URL(如 |
|
|
CSS净化器 | 对 |
|
|
输出序列化 | 将净化后的AST序列化回安全的HTML字符串。 | 净化后的AST |
|
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%。 | 1. 通过自动化XSS测试向量集(如HTML5 Security Cheatsheet)。 |
正确性 | 1. 输出HTML100%符合XML/HTML5规范,可通过标准验证器。 | 1. 使用W3C Validator等工具进行合规性测试。 |
性能 | 1. 在基准测试中,处理速度与主流同类库(如DOMPurify)处于同一数量级或更优。 | 1. 定义性能基准测试集,并持续监控。 |
可靠性 | 1. 代码测试覆盖率(行覆盖/分支覆盖)不低于95%。 | 1. 使用覆盖率工具(如gcov, llvm-cov)生成报告。 |
3.2 必需交付物
源代码:结构清晰、注释完备的仓颉语言项目代码,托管于GitHub或Gitee。
API文档:使用标准文档工具生成的详细API参考,包含所有公共模块、结构体和函数的说明。
测试套件:完整的单元测试、集成测试和性能基准测试代码,与源代码一同维护。
示例程序:提供多个可直接运行的示例,展示从基础到高级的用法。
安全审计报告:项目结项时,需提供由第三方或核心贡献者共同完成的安全评估摘要。
开源许可:项目采用MIT许可证,确保最大程度的开放性。
相关附件
质量认证要求
交付件
NO | 交付件描述 | 备注 |
1 | 三方库源代码 | 源代码 |
2 | 三方库测试方案和用例 | 测试用例和文档 |
3 | 用户手册,API文档,设计文档,license文档 | 资料和文档 |
验收标准
1.功能
三方库必须有明确的功能;
如果参考对标库移值开发,功能与参考三方库保持一致。
2.资料
Readme:包含简介,软件架构,目录结构,下载安装(编译构建),接口说明,使用示例,约束限制,开源协议,参与贡献等内容;
Changelog,三方库版本需包含基本的修改说明。
3.标准遵从性(可选),三方库实现需满足对应协议或行业标准,举例
appquth:支持对OAuth 的PKCE扩展;
icu4j:支持unicode标准库,通用字符集ISO/IEC 10646。
4.性能目标
性能敏感三方库接口运行性能持平对标三方库
5.开源协议遵从,必须包含License文件
放置合适的开源License协议,建议Apache License Version 2.0;
引用或参考开源三方库,需遵从开源协议。
6.网络安全要求
满足基础的网络安全红线及隐私要求,符合安全编码规范。
过程质量要求
指标分类 | 指标名称 | 指标要求 | 度量工具 | 牵引 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 |

