0.5.3 |
|
---|---|
0.5.2 |
|
0.4.0 |
|
0.3.0 |
|
0.1.0 |
|
#81 in #string-literal
25KB
410 行
xmlsafe
一种流式 XML 写入器,
-
通过要求其参数实现特定特质来防止意外 XML 注入
-
提供了一个
tag!
宏来结构化您的代码(旨在与rustfmt
兼容)
如果您忘记转义字符串,则代码无法编译。为了防止 XML 注入,请注意以下两点
-
每次您提供字符串字面量(
&'static str
),请确保它在相应的上下文中是语法有效的。 -
每次您实现一个特质时,请确保您满足其要求。
示例
use std::fmt::Error;
use xmlsafe::{XmlWriter, format_text, escape_text, tag};
struct User {name: String, id: u8}
fn list_users(mut w: XmlWriter, users: Vec<User>) -> Result<(), Error> {
tag!(w, "div", "class"="users", {
w.write(format_text!("There are {} users:", users.len()))?;
tag!(w, "ul", {
for user in users {
tag!(w, "li", "data-id"=user.id, {
w.write(escape_text(user.name))?;
});
}
});
});
Ok(())
}
fn main() {
let mut out = String::new();
let users = vec![User{name: "Alice".into(), id: 3}, User{name: "Bob".into(), id: 5}];
list_users(XmlWriter::new(&mut out), users).unwrap();
assert_eq!(out, "<div class=\"users\">There are 2 users:\
<ul><li data-id=\"3\">Alice</li><li data-id=\"5\">Bob</li></ul></div>");
}
注意 XmlWriter
如何作为实际写入目标(我们的示例中的字符串)和 XML 生成代码之间的防护层。此外,请注意,如果我们忘记了 escape_text
调用,示例将无法编译。
安全性
xmlsafe 禁止 unsafe
代码,并且不会引发恐慌。