8个稳定版本

4.0.0 2024年3月25日
3.3.0 2022年11月29日
3.2.1 2022年8月15日
3.2.0 2022年4月7日
0.1.0 2015年9月4日

21 in 文本处理

Download history 31900/week @ 2024-04-21 31562/week @ 2024-04-28 26990/week @ 2024-05-05 30516/week @ 2024-05-12 33260/week @ 2024-05-19 34901/week @ 2024-05-26 40118/week @ 2024-06-02 41344/week @ 2024-06-09 41225/week @ 2024-06-16 36675/week @ 2024-06-23 37478/week @ 2024-06-30 38523/week @ 2024-07-07 33826/week @ 2024-07-14 32427/week @ 2024-07-21 36037/week @ 2024-07-28 35901/week @ 2024-08-04

141,337 monthly downloads
用于63 个crate (44直接)

MIT/Apache

155KB
2.5K SLoC

HTML净化

Crates.IO Requires rustc 1.60.0

Ammonia是一个基于白名单的HTML净化库。它旨在防止未经验证的HTML被混合到更大的网页中,从而引起跨站脚本、布局破坏和点击劫持。

Ammonia使用html5ever以与浏览器相同的方式解析和序列化文档片段,因此它对语法混淆具有极高的抵抗力。

Ammonia严格按照HTML5规范解析其输入;它不会将裸URL链接化,插入行或段落断行,或把(C)转换为©。如果您需要这些功能,请在运行净化器之前使用标记处理器,如pulldown-cmark

安装

要使用ammonia,将其添加到项目的Cargo.toml文件中

[dependencies]
ammonia = "4"

更改

请参阅变更日志以获取发布历史。

示例

使用pulldown-cmark与Ammonia一起创建一个友好的用户界面评论网站。

use ammonia::clean;
use pulldown_cmark::{Parser, Options, html::push_html};

let text = "[a link](http://www.notriddle.com/)";

let mut options = Options::empty();
options.insert(Options::ENABLE_TABLES);

let mut md_parse = Parser::new_ext(text, options);
let mut unsafe_html = String::new();
push_html(&mut unsafe_html, md_parse);

let safe_html = clean(&*unsafe_html);
assert_eq!(safe_html, "<a href=\"http://www.notriddle.com/\">a link</a>");

性能

Ammonia构建DOM,遍历它(在途中替换不需要的节点),然后再次序列化。对于它所做的事情,它可能更快,如果您不希望允许任何HTML,则甚至可能比这更快。

但是,使用Ammonia 1.0比使用bleach-2.0.0和html5lib-0.999999999净化HTML字符串的时间大约是它的十五倍。

$ cd benchmarks
$ cargo run --release
    Running `target/release/ammonia_bench`
87539 nanoseconds to clean up the intro to the Ammonia docs.
$ python bleach_bench.py
(1498800.015449524, 'nanoseconds to clean up the intro to the Ammonia docs.')

许可

根据以下任一项许可

感谢

感谢其他净化库,特别是Python的Bleach和Node的sanitize-html,我们从它们那里大胆地复制了大部分API。

感谢ChALkeR,他的Improper Markup Sanitization文档帮助我们发现了Ammonia中的高级语义漏洞,感谢ssokolow的审阅和经验也非常有帮助,感谢securityMB发现了非常罕见的与命名空间相关的注入漏洞,以及xfix发现了递归析构函数中的DoS漏洞

最后,感谢贡献者

依赖项

~2.1–7.5MB
~79K SLoC