Summary
The facet route loaders currently accept any integer for page and page_size, including non-positive values (0, negative) and very large values, without bounds checks before server-side fetches.
Affected code
src/routes/facets/[facet]/+page.ts
src/routes/facets/[facet]/[value]/+page.ts
src/lib/utils.ts (requireInt only checks parseability, not bounds)
Why this matters
- Non-positive values create invalid pagination behavior.
- Very large
page_size can trigger oversized upstream requests and increase latency/memory usage.
- This is a server-side entry point, so malformed query params can be repeatedly abused.
Reproduction
- Open a facet URL with invalid params, for example:
/facets/categories?page=0&page_size=0
/facets/categories?page=-5&page_size=100000
- Observe that the loader accepts these values and forwards them to
getFacet/getFacetValue.
Expected behavior
- Reject invalid values with
400 when:
- Enforce an upper bound for
page_size (for example 100 or 200) and reject/clamp values above the cap.
Suggested fix
- Add a shared validator for positive bounded integers (or extend
requireInt with min/max).
- Apply the same validation in both facet loaders to keep behavior consistent.
Summary
The facet route loaders currently accept any integer for
pageandpage_size, including non-positive values (0, negative) and very large values, without bounds checks before server-side fetches.Affected code
src/routes/facets/[facet]/+page.tssrc/routes/facets/[facet]/[value]/+page.tssrc/lib/utils.ts(requireIntonly checks parseability, not bounds)Why this matters
page_sizecan trigger oversized upstream requests and increase latency/memory usage.Reproduction
/facets/categories?page=0&page_size=0/facets/categories?page=-5&page_size=100000getFacet/getFacetValue.Expected behavior
400when:page < 1page_size < 1page_size(for example 100 or 200) and reject/clamp values above the cap.Suggested fix
requireIntwith min/max).