include!(concat!(env!("OUT_DIR"), "/polyglots_data.rs"));
#[derive(Debug, Clone)]
pub struct PolyglotPayload {
pub payload: String,
pub contexts: Vec<&'static str>,
pub description: String,
}
#[must_use]
pub fn all_polyglots() -> Vec<PolyglotPayload> {
POLYGLOTS_RAW
.iter()
.map(|(payload, contexts, description)| PolyglotPayload {
payload: (*payload).to_string(),
contexts: contexts.to_vec(),
description: (*description).to_string(),
})
.collect()
}
#[must_use]
pub fn polyglots_for(context: &str) -> Vec<String> {
all_polyglots()
.into_iter()
.filter(|p| p.contexts.contains(&context))
.map(|p| p.payload)
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sql_xss_polyglots_exist() {
let polyglots = polyglots_for("sql");
assert!(
polyglots.len() >= 7,
"should have at least 7 SQL polyglots, got {}",
polyglots.len()
);
assert!(
polyglots
.iter()
.any(|p| p.contains("<script>") || p.contains("<svg") || p.contains("<img"))
);
}
#[test]
fn cmd_xss_polyglots_exist() {
let polyglots = polyglots_for("cmd");
assert!(polyglots.len() >= 5, "should have at least 5 CMD polyglots");
assert!(polyglots.iter().any(|p| p.contains("echo")));
}
#[test]
fn ssti_xss_polyglots_exist() {
let polyglots = polyglots_for("ssti");
assert!(
polyglots.len() >= 5,
"should have at least 5 SSTI polyglots"
);
assert!(
polyglots
.iter()
.any(|p| p.contains("{{") || p.contains("${"))
);
}
#[test]
fn all_polyglots_have_contexts() {
for p in all_polyglots() {
assert!(
!p.contexts.is_empty(),
"polyglot must declare at least one context"
);
}
}
#[test]
fn universal_polyglots_cover_multiple_contexts() {
let universals: Vec<_> = all_polyglots()
.into_iter()
.filter(|p| p.contexts.len() >= 3)
.collect();
assert!(
!universals.is_empty(),
"must have at least one polyglot covering 3+ contexts"
);
for p in &universals {
assert!(
p.contexts.len() >= 2,
"universal polyglots should cover 2+ contexts: {:?}",
p.contexts
);
}
}
#[test]
fn sql_cmd_polyglots_exist() {
let polyglots: Vec<_> = all_polyglots()
.into_iter()
.filter(|p| p.contexts.contains(&"sql") && p.contexts.contains(&"cmd"))
.collect();
assert!(polyglots.len() >= 3, "should have SQL+CMD polyglots");
}
#[test]
fn total_polyglot_count() {
let all = all_polyglots();
assert!(
all.len() >= 25,
"should have at least 25 total polyglots, got {}",
all.len()
);
}
#[test]
fn polyglots_for_unknown_context_empty() {
let polyglots = polyglots_for("nonexistent");
assert!(polyglots.is_empty());
}
}