#xml #escaping #writer #markup #html #string-literal

已删除 xmlsafe

一种流式 XML 写入器,通过类型安全保护您免受 XML 注入攻击

0.5.3 2021年8月28日
0.5.2 2021年8月26日
0.4.0 2021年8月19日
0.3.0 2021年8月19日
0.1.0 2021年8月14日

#81 in #string-literal

MIT 许可证

25KB
410

xmlsafe

一种流式 XML 写入器,

  • 通过要求其参数实现特定特质来防止意外 XML 注入

  • 提供了一个 tag! 宏来结构化您的代码(旨在与 rustfmt 兼容)

如果您忘记转义字符串,则代码无法编译。为了防止 XML 注入,请注意以下两点

  1. 每次您提供字符串字面量(&'static str),请确保它在相应的上下文中是语法有效的。

  2. 每次您实现一个特质时,请确保您满足其要求。

示例

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 代码,并且不会引发恐慌。

无运行时依赖