@xssdoctor's CSPT research covers eight frameworks:
lab.ctbb.show/research/the-d…
React Router's .replace(///g, "/") in matchPath has no i flag, so double-decode only works when the F in / is uppercase. This was reintroduced after a previous fix and is still in the codebase. Splat routes (path="files/*") match with (.*) instead of ([^\\/] ), so ../../admin works with zero encoding.
Next.js uses the same await params API in page components and route handlers but they do opposite things. Page components re-encode through getParamValue(), route handlers fully decode through getRouteMatcher(). The traversal lands server-side.
Ember's normalizePath() re-encodes % after decoding, which accidentally kills double-encoding. Wildcard params skip the final decodeURIComponent entirely, so they need literal ../ instead of encoded payloads.
SvelteKit's param matchers reject bad values at the routing level before any load function even runs. Server load functions in page.server.ts bypass hooks.server.ts, so auth middleware won't protect you.
Nuxt's island component payload revival (revive-payload.client.js) is a stored CSPT sink. If you can poison window.__NUXT__, the key traverses the
$fetch URL. (CVE-2025-59414)