pub fn sanitize_html(input: &str) -> String {
let mut output = String::with_capacity(input.len());
for c in input.chars() {
match c {
'&' => output.push_str("&"),
'<' => output.push_str("<"),
'>' => output.push_str(">"),
'"' => output.push_str("""),
'\'' => output.push_str("'"),
_ => output.push(c),
}
}
output
}
pub fn strip_tags(input: &str) -> String {
let mut output = String::with_capacity(input.len());
let mut inside_tag = false;
for c in input.chars() {
if c == '<' {
inside_tag = true;
} else if c == '>' {
inside_tag = false;
} else if !inside_tag {
output.push(c);
}
}
output
}
pub fn sanitize_json(value: &mut serde_json::Value) {
match value {
serde_json::Value::String(s) => *s = sanitize_html(s),
serde_json::Value::Array(arr) => {
for v in arr {
sanitize_json(v);
}
}
serde_json::Value::Object(map) => {
for (_, v) in map {
sanitize_json(v);
}
}
_ => {}
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_sanitize_html() {
let input = "<script>alert('XSS')</script>";
let expected = "<script>alert('XSS')</script>";
assert_eq!(sanitize_html(input), expected);
}
#[test]
fn test_strip_tags() {
let input = "<p>Hello <b>World</b></p>";
let expected = "Hello World";
assert_eq!(strip_tags(input), expected);
}
#[test]
fn test_sanitize_json() {
let mut data = json!({
"name": "<b>John</b>",
"age": 30,
"tags": ["<script>", "normal"]
});
sanitize_json(&mut data);
assert_eq!(data["name"], "<b>John</b>");
assert_eq!(data["tags"][0], "<script>");
assert_eq!(data["tags"][1], "normal");
}
}