new capacity bits (#67)

This commit is contained in:
Eli Peter 2026-05-07 01:29:31 -04:00 committed by GitHub
parent afaffc0df6
commit 7d0e7320e2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
261 changed files with 10591 additions and 231 deletions

View file

@ -0,0 +1,12 @@
// Baseline: expression is a compile-time constant. No taint reaches
// xpath.select so no XPATH_INJECTION finding fires.
const xpath = require('xpath');
const { DOMParser } = require('xmldom');
function lookup(req, res) {
const doc = new DOMParser().parseFromString('<root/>');
const nodes = xpath.select("//user[@role='admin']", doc);
res.json(nodes);
}
module.exports = lookup;

View file

@ -0,0 +1,20 @@
// Safe: user-supplied substring routed through the project-local
// `escapeXpath` helper before concatenation. The sanitizer clears the
// XPATH_INJECTION cap so the sink does not fire.
const xpath = require('xpath');
const { DOMParser } = require('xmldom');
function escapeXpath(raw) {
return raw.replace(/'/g, '&apos;').replace(/"/g, '&quot;');
}
function lookup(req, res) {
const doc = new DOMParser().parseFromString('<root/>');
const user = req.query.user;
const safe = escapeXpath(user);
const expr = "//user[name='" + safe + "']";
const nodes = xpath.select(expr, doc);
res.json(nodes);
}
module.exports = lookup;

View file

@ -0,0 +1,14 @@
// Unsafe: npm `xpath` package's `select` receives an expression assembled
// from req.query. XPATH_INJECTION fires on the expression argument.
const xpath = require('xpath');
const { DOMParser } = require('xmldom');
function lookup(req, res) {
const doc = new DOMParser().parseFromString('<root/>');
const user = req.query.user;
const expr = "//user[name='" + user + "']";
const nodes = xpath.select(expr, doc);
res.json(nodes);
}
module.exports = lookup;