code/inner-html
12 pages
[
{
"url": "app/(app)/review/prophecy/evaluations/page.tsx",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "app/(app)/review/prophecy/evaluations/page.tsx",
"line": 430,
"snippet": "dangerouslySetInnerHTML={{"
}
},
{
"url": "app/layout.tsx",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "app/layout.tsx",
"line": 116,
"snippet": "<script dangerouslySetInnerHTML={{ __html: themeScript }} />"
}
},
{
"url": "app/layout.tsx",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "app/layout.tsx",
"line": 129,
"snippet": "dangerouslySetInnerHTML={{ __html: gtagStub(site.analytics.gaId) }}"
}
},
{
"url": "app/posts/[slug]/page.tsx",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "app/posts/[slug]/page.tsx",
"line": 96,
"snippet": "dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}"
}
},
{
"url": "app/posts/[slug]/page.tsx",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "app/posts/[slug]/page.tsx",
"line": 117,
"snippet": "<div className=\"prose\" dangerouslySetInnerHTML={{ __html: post.html }} />"
}
},
{
"url": "components/site/pub.tsx",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "components/site/pub.tsx",
"line": 22,
"snippet": "dangerouslySetInnerHTML={{ __html: topicPattern(t, seed) }}"
}
},
{
"url": "tools/admin/index.html",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "tools/admin/index.html",
"line": 176,
"snippet": "$(\"cstats\").innerHTML ="
}
},
{
"url": "tools/admin/index.html",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "tools/admin/index.html",
"line": 181,
"snippet": "if(!q.length){ $(\"queue\").innerHTML='<div class=\"hint\">Nothing pending.</div>'; return; }"
}
},
{
"url": "tools/admin/index.html",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "tools/admin/index.html",
"line": 182,
"snippet": "$(\"queue\").innerHTML = q.map(c=>`"
}
},
{
"url": "tools/studio/index.html",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "tools/studio/index.html",
"line": 122,
"snippet": "function renderPreview(){ $(\"preview\").innerHTML = md.render($(\"body\").value || \"*Nothing yet.*\"); }"
}
},
{
"url": "tools/studio/index.html",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "tools/studio/index.html",
"line": 139,
"snippet": "$(\"titles\").innerHTML = c.titles.map(t=>\"• \"+t).join(\"<br>\") || \"none yet\";"
}
},
{
"url": "tools/studio/index.html",
"severity": "moderate",
"title": "Raw HTML injection surface",
"evidence": {
"source": "tools/studio/index.html",
"line": 140,
"snippet": "$(\"status\").innerHTML = `provider <b>${c.provider.provider}</b> · ${c.provider.model}` +"
}
}
]
code/logic
4 pages
[
{
"url": "lib/auth/session.ts",
"severity": "minor",
"title": "Session age check does not reject negative age",
"evidence": {
"selector": "lib/auth/session.ts:69",
"snippet": "if (!Number.isFinite(age) || age > MAX_AGE_SECONDS) return null;"
}
},
{
"url": "lib/auth/tokens.ts",
"severity": "moderate",
"title": "TOCTOU race allows a token to be redeemed twice concurrently",
"evidence": {
"selector": "lib/auth/tokens.ts:99-105",
"snippet": "const token = await prisma.loginToken.findUnique({ where: { tokenHash } });\n if (!token || token.usedAt || token.expiresAt < new Date()) return null;\n\n await prisma.loginToken.update({\n where: { id: token.id },\n data: { usedAt: new Date() },\n });"
}
},
{
"url": "app/api/payments/webhook/route.ts",
"severity": "moderate",
"title": "No idempotency check on fulfillment",
"evidence": {
"selector": "app/api/payments/webhook/route.ts:29-31",
"snippet": "if (event?.paid) {\n await fulfillByRef(event.ref);\n }"
}
},
{
"url": "app/api/payments/webhook/route.ts",
"severity": "minor",
"title": "Errors from fulfillByRef are unhandled",
"evidence": {
"selector": "app/api/payments/webhook/route.ts:29-31",
"snippet": "await fulfillByRef(event.ref);"
}
}
]
security/xss
4 pages
[
{
"url": "app/(app)/review/prophecy/evaluations/page.tsx",
"severity": "info",
"title": "dangerouslySetInnerHTML use is a static, hardcoded style string (not user input)",
"evidence": {
"selector": "app/(app)/review/prophecy/evaluations/page.tsx",
"snippet": "dangerouslySetInnerHTML={{ __html: \".eval-charts{--s0:#7d251f;...}\" }}",
"note": "Static literal, no template interpolation of external data."
}
},
{
"url": "app/layout.tsx",
"severity": "info",
"title": "innerHTML usage confined to build-time constant scripts",
"evidence": {
"selector": "app/layout.tsx:120",
"snippet": "<script dangerouslySetInnerHTML={{ __html: themeScript }} />",
"note": "no diff available; reviewed as static file"
}
},
{
"url": "app/posts/[slug]/page.tsx",
"severity": "moderate",
"title": "Unsanitized HTML rendered via dangerouslySetInnerHTML",
"evidence": {
"selector": "app/posts/[slug]/page.tsx:120",
"snippet": "<div className=\"prose\" dangerouslySetInnerHTML={{ __html: post.html }} />"
}
},
{
"url": "components/site/pub.tsx",
"severity": "minor",
"title": "dangerouslySetInnerHTML fed by topic/seed derived from data",
"evidence": {
"selector": "components/site/pub.tsx:22-25",
"snippet": "dangerouslySetInnerHTML={{ __html: topicPattern(t, seed) }}"
}
}
]
generic-credential
1 page
[
{
"url": "tests/preview.test.ts",
"severity": "moderate",
"title": "Possible hard-coded credential exposed",
"evidence": {
"source": "tests/preview.test.ts",
"rule": "generic-credential",
"match": "TOKE…ink\"",
"offset": 808
}
}
]