Overview
The sanitization layer (src/lib/sanitize.ts) provides type-safe functions for cleaning user inputs before validation and storage. These utilities protect against injection attacks, normalize data formats, and enforce constraints.
Sanitization vs Validation: Sanitization transforms input into a safe format. Validation checks if input meets business rules. Always sanitize first, then validate.
Core Sanitization Functions
String Sanitization
Removes dangerous characters and enforces length limits:- Trims whitespace from both ends
- Strips all HTML tags (prevents XSS)
- Removes ASCII control characters (NULL, BEL, etc.)
- Enforces maximum length (defaults to 200 characters)
- Returns empty string for non-string inputs
What are control characters?
What are control characters?
Control characters (bytes 0x00-0x1F and 0x7F) are non-printable characters like NULL (
\0), backspace (\b), and bell (\a). They can cause issues in:- Database storage (NULL terminates strings in some systems)
- JSON serialization (invalid in JSON strings)
- Terminal output (can manipulate display)
- Log injection attacks
Email Sanitization
Validates and normalizes email addresses:- Inherits all string sanitization (HTML stripping, control char removal)
- Validates email format with RFC-compliant regex
- Normalizes to lowercase (prevents duplicate accounts)
- Respects RFC 5321 maximum length (254 characters)
- Returns empty string for invalid emails
Case normalization:
[email protected] and [email protected] are treated as the same address, preventing duplicate accounts with different casing.Phone Number Sanitization
Validates phone number format:- Allows digits, plus sign, spaces, dashes, and parentheses
- Enforces 6-20 character length (international format)
- Returns empty string for invalid formats
Number Sanitization
Validates numeric input within a range:- Coerces input to number
- Rejects
NaN,Infinity, and-Infinity - Enforces inclusive min/max bounds
- Returns
nullfor invalid input (not0or-1)
Enum Sanitization
Validates against an allowlist of string literals:- Type-safe with TypeScript generics
- Only accepts predefined values (allowlist approach)
- Returns
nullfor invalid input
Allowlist security: Only accepting predefined values prevents injection attacks and ensures type safety. Never use blocklists for enums.
Real-World Usage
Order Creation Endpoint
Complete sanitization example fromsrc/app/api/orders/route.ts:38:
Stripe Payment Intent
Fromsrc/app/api/stripe/route.ts:22:
PayPal Order Creation
Fromsrc/app/api/paypal/create-order/route.ts:40:
Sanitization Best Practices
Sanitize at the API boundary
Sanitize at the API boundary
Apply sanitization immediately after receiving user input, before any processing or validation. This creates a clean security perimeter.
Never trust client-side sanitization
Never trust client-side sanitization
Always sanitize on the server, even if you also sanitize on the client. Attackers can bypass client-side code entirely by crafting raw HTTP requests.
Use appropriate functions for data types
Use appropriate functions for data types
Don’t use
sanitizeString for emails or phone numbers. Each data type has specific validation requirements.Set appropriate length limits
Set appropriate length limits
Choose maximum lengths based on database schema and business requirements. Default to conservative limits.
Check for null/empty after sanitization
Check for null/empty after sanitization
Sanitization functions return empty strings or
null for invalid input. Always validate the result.Attack Vectors Prevented
| Attack Type | Prevention Mechanism |
|---|---|
| XSS (Cross-Site Scripting) | HTML tag stripping in sanitizeString |
| SQL Injection | String sanitization removes SQL metacharacters |
| NoSQL Injection | Type coercion and allowlist validation |
| Control Character Injection | Explicit removal of ASCII control chars |
| Buffer Overflow | Maximum length enforcement |
| Type Confusion | Strict type checking and coercion |
| Format String Attacks | Input normalization and validation |
| Email Enumeration | Case normalization and format validation |
Security Considerations
Context-Specific Encoding: Sanitization prepares data for storage and processing. When outputting data to different contexts (HTML, JSON, SQL), apply context-specific encoding:
- HTML output: HTML entity encoding
- JavaScript: JSON.stringify with proper escaping
- SQL: Parameterized queries (never string concatenation)
Testing Sanitization
Always test sanitization functions with malicious input:Related Documentation
- Validation - Business logic validation after sanitization
- Rate Limiting - Request throttling configuration
