BETA Shoulder is in beta — Findings may sometimes be wrong. Your feedback shapes what we fix next. Share feedback

tRPC Procedure Missing Input Validation

Description

tRPC procedures without .input() validation accept unvalidated payloads at runtime, enabling injection and type confusion attacks.

What Shoulder detects

Procedure '{procedure}' accepts user input but lacks .input() validation. Add Zod schema to validate runtime data.

How to fix

Add Zod schema validation with .input() to all procedures.

```typescript
import { z } from 'zod';

export const userRouter = router({
  getUser: publicProcedure
    .input(z.object({
      userId: z.number().int().positive()
    }))
    .query(async ({ input }) => {
      return await db.user.findUnique({ where: { id: input.userId } });
    })
});
```

Learn more: https://shoulder.dev/learn/typescript/cwe-20/missing-input-validation

Applies to

Frameworks

trpc

References

Scan for this issue

Detect with Shoulder CLI
npx @shoulderdev/cli trust --rule=trpc-missing-input-validation .

Real-world examples

Known CVEs in the Improper Input Validation vulnerability class that this rule helps detect.

Related rules