nextjs-secure 0.3.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +656 -501
- package/dist/audit.cjs +1337 -0
- package/dist/audit.cjs.map +1 -0
- package/dist/audit.d.cts +679 -0
- package/dist/audit.d.ts +679 -0
- package/dist/audit.js +1300 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth.cjs +500 -6
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts +180 -19
- package/dist/auth.d.ts +180 -19
- package/dist/auth.js +493 -6
- package/dist/auth.js.map +1 -1
- package/dist/index.cjs +3743 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3668 -8
- package/dist/index.js.map +1 -1
- package/dist/path-BVbunPfR.d.cts +534 -0
- package/dist/path-BVbunPfR.d.ts +534 -0
- package/dist/validation.cjs +2031 -0
- package/dist/validation.cjs.map +1 -0
- package/dist/validation.d.cts +42 -0
- package/dist/validation.d.ts +42 -0
- package/dist/validation.js +1964 -0
- package/dist/validation.js.map +1 -0
- package/package.json +26 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware/validation/utils.ts","../src/middleware/validation/validators/schema.ts","../src/middleware/validation/validators/content-type.ts","../src/middleware/validation/sanitizers/path.ts","../src/middleware/validation/validators/file.ts","../src/middleware/validation/sanitizers/xss.ts","../src/middleware/validation/sanitizers/sql.ts","../src/middleware/validation/middleware.ts"],"names":["DANGEROUS_PATTERNS"],"mappings":"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","file":"validation.js","sourcesContent":["import type { Schema, CustomSchema, FieldRule, ValidationError, ValidationResult } from './types'\n\n/**\n * Check if a schema is a Zod-like schema (has safeParse method)\n */\nexport function isZodSchema(schema: unknown): schema is Schema {\n return (\n typeof schema === 'object' &&\n schema !== null &&\n 'safeParse' in schema &&\n typeof (schema as Schema).safeParse === 'function'\n )\n}\n\n/**\n * Check if a schema is a custom schema (plain object with field rules)\n */\nexport function isCustomSchema(schema: unknown): schema is CustomSchema {\n if (typeof schema !== 'object' || schema === null) return false\n if ('safeParse' in schema) return false\n\n const entries = Object.entries(schema)\n if (entries.length === 0) return false\n\n return entries.every(([_, rule]) => {\n return typeof rule === 'object' && rule !== null && 'type' in rule\n })\n}\n\n/**\n * Email regex pattern (RFC 5322 simplified)\n */\nconst EMAIL_PATTERN = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/\n\n/**\n * URL regex pattern (supports domain names, localhost, and IP addresses)\n */\nconst URL_PATTERN = /^https?:\\/\\/(?:(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}|localhost|(?:\\d{1,3}\\.){3}\\d{1,3})(?::\\d{1,5})?(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/\n\n/**\n * UUID regex pattern (v4)\n */\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\n/**\n * ISO date pattern\n */\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?(?:Z|[+-]\\d{2}:?\\d{2})?)?$/\n\n/**\n * Validate a single field with a rule\n */\nexport function validateField(value: unknown, rule: FieldRule, fieldName: string): ValidationError | null {\n // Handle required\n if (value === undefined || value === null || value === '') {\n if (rule.required) {\n return {\n field: fieldName,\n code: 'required',\n message: rule.message || `${fieldName} is required`,\n received: value,\n }\n }\n return null // Optional field with no value\n }\n\n // Type validation\n switch (rule.type) {\n case 'string':\n if (typeof value !== 'string') {\n return {\n field: fieldName,\n code: 'invalid_type',\n message: rule.message || `${fieldName} must be a string`,\n expected: 'string',\n received: typeof value,\n }\n }\n // String length validation\n if (rule.minLength !== undefined && value.length < rule.minLength) {\n return {\n field: fieldName,\n code: 'too_short',\n message: rule.message || `${fieldName} must be at least ${rule.minLength} characters`,\n received: value.length,\n }\n }\n if (rule.maxLength !== undefined && value.length > rule.maxLength) {\n return {\n field: fieldName,\n code: 'too_long',\n message: rule.message || `${fieldName} must be at most ${rule.maxLength} characters`,\n received: value.length,\n }\n }\n // Pattern validation\n if (rule.pattern && !rule.pattern.test(value)) {\n return {\n field: fieldName,\n code: 'invalid_pattern',\n message: rule.message || `${fieldName} has invalid format`,\n received: value,\n }\n }\n break\n\n case 'number':\n const num = typeof value === 'number' ? value : Number(value)\n if (isNaN(num)) {\n return {\n field: fieldName,\n code: 'invalid_type',\n message: rule.message || `${fieldName} must be a number`,\n expected: 'number',\n received: typeof value,\n }\n }\n if (rule.integer && !Number.isInteger(num)) {\n return {\n field: fieldName,\n code: 'invalid_integer',\n message: rule.message || `${fieldName} must be an integer`,\n received: num,\n }\n }\n if (rule.min !== undefined && num < rule.min) {\n return {\n field: fieldName,\n code: 'too_small',\n message: rule.message || `${fieldName} must be at least ${rule.min}`,\n received: num,\n }\n }\n if (rule.max !== undefined && num > rule.max) {\n return {\n field: fieldName,\n code: 'too_large',\n message: rule.message || `${fieldName} must be at most ${rule.max}`,\n received: num,\n }\n }\n break\n\n case 'boolean':\n if (typeof value !== 'boolean' && value !== 'true' && value !== 'false') {\n return {\n field: fieldName,\n code: 'invalid_type',\n message: rule.message || `${fieldName} must be a boolean`,\n expected: 'boolean',\n received: typeof value,\n }\n }\n break\n\n case 'email':\n if (typeof value !== 'string' || !EMAIL_PATTERN.test(value)) {\n return {\n field: fieldName,\n code: 'invalid_email',\n message: rule.message || `${fieldName} must be a valid email address`,\n received: value,\n }\n }\n break\n\n case 'url':\n if (typeof value !== 'string' || !URL_PATTERN.test(value)) {\n return {\n field: fieldName,\n code: 'invalid_url',\n message: rule.message || `${fieldName} must be a valid URL`,\n received: value,\n }\n }\n break\n\n case 'uuid':\n if (typeof value !== 'string' || !UUID_PATTERN.test(value)) {\n return {\n field: fieldName,\n code: 'invalid_uuid',\n message: rule.message || `${fieldName} must be a valid UUID`,\n received: value,\n }\n }\n break\n\n case 'date':\n if (typeof value !== 'string' || !DATE_PATTERN.test(value)) {\n const parsed = new Date(value as string)\n if (isNaN(parsed.getTime())) {\n return {\n field: fieldName,\n code: 'invalid_date',\n message: rule.message || `${fieldName} must be a valid date`,\n received: value,\n }\n }\n }\n break\n\n case 'array':\n if (!Array.isArray(value)) {\n return {\n field: fieldName,\n code: 'invalid_type',\n message: rule.message || `${fieldName} must be an array`,\n expected: 'array',\n received: typeof value,\n }\n }\n if (rule.minItems !== undefined && value.length < rule.minItems) {\n return {\n field: fieldName,\n code: 'too_few_items',\n message: rule.message || `${fieldName} must have at least ${rule.minItems} items`,\n received: value.length,\n }\n }\n if (rule.maxItems !== undefined && value.length > rule.maxItems) {\n return {\n field: fieldName,\n code: 'too_many_items',\n message: rule.message || `${fieldName} must have at most ${rule.maxItems} items`,\n received: value.length,\n }\n }\n // Validate items if rule provided\n if (rule.items) {\n for (let i = 0; i < value.length; i++) {\n const itemError = validateField(value[i], rule.items, `${fieldName}[${i}]`)\n if (itemError) return itemError\n }\n }\n break\n\n case 'object':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n field: fieldName,\n code: 'invalid_type',\n message: rule.message || `${fieldName} must be an object`,\n expected: 'object',\n received: Array.isArray(value) ? 'array' : typeof value,\n }\n }\n break\n }\n\n // Custom validation\n if (rule.custom) {\n const result = rule.custom(value)\n if (result !== true) {\n return {\n field: fieldName,\n code: 'custom_validation',\n message: typeof result === 'string' ? result : rule.message || `${fieldName} failed validation`,\n received: value,\n }\n }\n }\n\n return null\n}\n\n/**\n * Validate data against a custom schema\n */\nexport function validateCustomSchema<T>(data: unknown, schema: CustomSchema): ValidationResult<T> {\n if (typeof data !== 'object' || data === null) {\n return {\n success: false,\n errors: [{\n field: '_root',\n code: 'invalid_type',\n message: 'Expected an object',\n received: data,\n }],\n }\n }\n\n const errors: ValidationError[] = []\n const record = data as Record<string, unknown>\n\n for (const [fieldName, rule] of Object.entries(schema)) {\n const error = validateField(record[fieldName], rule, fieldName)\n if (error) {\n errors.push(error)\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors }\n }\n\n return { success: true, data: data as T }\n}\n\n/**\n * Validate data against a Zod schema\n */\nexport function validateZodSchema<T>(data: unknown, schema: Schema<T>): ValidationResult<T> {\n const result = schema.safeParse(data)\n\n if (result.success) {\n return { success: true, data: result.data }\n }\n\n const errors: ValidationError[] = result.error.issues.map(issue => ({\n field: issue.path.join('.') || '_root',\n code: issue.code,\n message: issue.message,\n path: issue.path.map(String),\n }))\n\n return { success: false, errors }\n}\n\n/**\n * Deep get value from object by path\n */\nexport function getByPath(obj: unknown, path: string): unknown {\n if (typeof obj !== 'object' || obj === null) return undefined\n\n const parts = path.split('.')\n let current: unknown = obj\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) return undefined\n current = (current as Record<string, unknown>)[part]\n }\n\n return current\n}\n\n/**\n * Deep set value in object by path\n */\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!(part in current) || typeof current[part] !== 'object') {\n current[part] = {}\n }\n current = current[part] as Record<string, unknown>\n }\n\n current[parts[parts.length - 1]] = value\n}\n\n/**\n * Walk through object and apply function to all string values\n */\nexport function walkObject(\n obj: unknown,\n fn: (value: string, path: string) => string,\n path = ''\n): unknown {\n if (typeof obj === 'string') {\n return fn(obj, path)\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item, i) => walkObject(item, fn, `${path}[${i}]`))\n }\n\n if (typeof obj === 'object' && obj !== null) {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n const newPath = path ? `${path}.${key}` : key\n result[key] = walkObject(value, fn, newPath)\n }\n return result\n }\n\n return obj\n}\n\n/**\n * Parse query string to object\n */\nexport function parseQueryString(url: string): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {}\n\n try {\n const urlObj = new URL(url)\n for (const [key, value] of urlObj.searchParams.entries()) {\n if (key in result) {\n const existing = result[key]\n if (Array.isArray(existing)) {\n existing.push(value)\n } else {\n result[key] = [existing, value]\n }\n } else {\n result[key] = value\n }\n }\n } catch {\n // Invalid URL, return empty\n }\n\n return result\n}\n","import type { NextRequest } from 'next/server'\nimport type {\n Schema,\n CustomSchema,\n ValidationResult,\n ValidationError,\n ValidatedContext,\n} from '../types'\nimport { isZodSchema, isCustomSchema, validateCustomSchema, validateZodSchema, parseQueryString } from '../utils'\n\n/**\n * Validate data against a schema (Zod or custom)\n */\nexport function validate<T>(\n data: unknown,\n schema: Schema<T> | CustomSchema\n): ValidationResult<T> {\n if (isZodSchema(schema)) {\n return validateZodSchema(data, schema)\n }\n\n if (isCustomSchema(schema)) {\n return validateCustomSchema<T>(data, schema)\n }\n\n // Unknown schema type\n return {\n success: false,\n errors: [{\n field: '_schema',\n code: 'invalid_schema',\n message: 'Invalid schema provided',\n }],\n }\n}\n\n/**\n * Extract and validate request body\n */\nexport async function validateBody<T>(\n request: NextRequest,\n schema: Schema<T> | CustomSchema\n): Promise<ValidationResult<T>> {\n let body: unknown\n\n try {\n const contentType = request.headers.get('content-type') || ''\n\n if (contentType.includes('application/json')) {\n body = await request.json()\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const text = await request.text()\n body = Object.fromEntries(new URLSearchParams(text))\n } else if (contentType.includes('multipart/form-data')) {\n const formData = await request.formData()\n const obj: Record<string, unknown> = {}\n formData.forEach((value, key) => {\n // Skip File objects for validation, only include strings\n if (typeof value === 'string') {\n obj[key] = value\n }\n })\n body = obj\n } else {\n // Try JSON as fallback\n try {\n body = await request.json()\n } catch {\n body = {}\n }\n }\n } catch (error) {\n return {\n success: false,\n errors: [{\n field: '_body',\n code: 'parse_error',\n message: 'Failed to parse request body',\n }],\n }\n }\n\n return validate<T>(body, schema)\n}\n\n/**\n * Extract and validate query parameters\n */\nexport function validateQuery<T>(\n request: NextRequest,\n schema: Schema<T> | CustomSchema\n): ValidationResult<T> {\n const query = parseQueryString(request.url)\n return validate<T>(query, schema)\n}\n\n/**\n * Validate path parameters (from URL pattern)\n */\nexport function validateParams<T>(\n params: Record<string, string | string[]>,\n schema: Schema<T> | CustomSchema\n): ValidationResult<T> {\n return validate<T>(params, schema)\n}\n\n/**\n * Combined request validation\n */\nexport async function validateRequest<\n TBody = unknown,\n TQuery = unknown,\n TParams = unknown\n>(\n request: NextRequest,\n config: {\n body?: Schema<TBody> | CustomSchema\n query?: Schema<TQuery> | CustomSchema\n params?: Schema<TParams> | CustomSchema\n routeParams?: Record<string, string | string[]>\n }\n): Promise<{\n success: boolean\n data?: ValidatedContext<TBody, TQuery, TParams>\n errors?: ValidationError[]\n}> {\n const allErrors: ValidationError[] = []\n const data: Partial<ValidatedContext<TBody, TQuery, TParams>> = {}\n\n // Validate body\n if (config.body) {\n const bodyResult = await validateBody<TBody>(request, config.body)\n if (!bodyResult.success) {\n allErrors.push(...(bodyResult.errors || []).map(e => ({\n ...e,\n field: `body.${e.field}`.replace('body._root', 'body'),\n })))\n } else {\n data.body = bodyResult.data\n }\n } else {\n data.body = {} as TBody\n }\n\n // Validate query\n if (config.query) {\n const queryResult = validateQuery<TQuery>(request, config.query)\n if (!queryResult.success) {\n allErrors.push(...(queryResult.errors || []).map(e => ({\n ...e,\n field: `query.${e.field}`.replace('query._root', 'query'),\n })))\n } else {\n data.query = queryResult.data\n }\n } else {\n data.query = {} as TQuery\n }\n\n // Validate params\n if (config.params && config.routeParams) {\n const paramsResult = validateParams<TParams>(config.routeParams, config.params)\n if (!paramsResult.success) {\n allErrors.push(...(paramsResult.errors || []).map(e => ({\n ...e,\n field: `params.${e.field}`.replace('params._root', 'params'),\n })))\n } else {\n data.params = paramsResult.data\n }\n } else {\n data.params = {} as TParams\n }\n\n if (allErrors.length > 0) {\n return { success: false, errors: allErrors }\n }\n\n return {\n success: true,\n data: data as ValidatedContext<TBody, TQuery, TParams>,\n }\n}\n\n/**\n * Default validation error response\n */\nexport function defaultValidationErrorResponse(\n errors: ValidationError[]\n): Response {\n return new Response(\n JSON.stringify({\n error: 'validation_error',\n message: 'Request validation failed',\n details: errors.map(e => ({\n field: e.field,\n code: e.code,\n message: e.message,\n })),\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n}\n\n/**\n * Create a validation function for a schema\n */\nexport function createValidator<T>(\n schema: Schema<T> | CustomSchema\n): (data: unknown) => ValidationResult<T> {\n return (data: unknown) => validate<T>(data, schema)\n}\n\n/**\n * Check if all validation results are successful\n */\nexport function allValid(...results: ValidationResult[]): boolean {\n return results.every(r => r.success)\n}\n\n/**\n * Merge validation errors from multiple results\n */\nexport function mergeErrors(...results: ValidationResult[]): ValidationError[] {\n const errors: ValidationError[] = []\n for (const result of results) {\n if (result.errors) {\n errors.push(...result.errors)\n }\n }\n return errors\n}\n","import type { NextRequest } from 'next/server'\nimport type { ContentTypeConfig } from '../types'\n\n/**\n * Common MIME types\n */\nexport const MIME_TYPES = {\n // Text\n TEXT_PLAIN: 'text/plain',\n TEXT_HTML: 'text/html',\n TEXT_CSS: 'text/css',\n TEXT_JAVASCRIPT: 'text/javascript',\n\n // Application\n JSON: 'application/json',\n FORM_URLENCODED: 'application/x-www-form-urlencoded',\n MULTIPART_FORM: 'multipart/form-data',\n XML: 'application/xml',\n PDF: 'application/pdf',\n ZIP: 'application/zip',\n GZIP: 'application/gzip',\n OCTET_STREAM: 'application/octet-stream',\n\n // Image\n IMAGE_PNG: 'image/png',\n IMAGE_JPEG: 'image/jpeg',\n IMAGE_GIF: 'image/gif',\n IMAGE_WEBP: 'image/webp',\n IMAGE_SVG: 'image/svg+xml',\n\n // Audio\n AUDIO_MP3: 'audio/mpeg',\n AUDIO_WAV: 'audio/wav',\n AUDIO_OGG: 'audio/ogg',\n\n // Video\n VIDEO_MP4: 'video/mp4',\n VIDEO_WEBM: 'video/webm',\n} as const\n\n/**\n * Parse Content-Type header\n */\nexport function parseContentType(header: string | null): {\n type: string\n subtype: string\n mediaType: string\n charset?: string\n boundary?: string\n parameters: Record<string, string>\n} {\n if (!header) {\n return {\n type: '',\n subtype: '',\n mediaType: '',\n parameters: {},\n }\n }\n\n // Split by semicolon to separate media type from parameters\n const parts = header.split(';').map(p => p.trim())\n const mediaType = parts[0].toLowerCase()\n\n // Split media type into type/subtype\n const [type = '', subtype = ''] = mediaType.split('/')\n\n // Parse parameters\n const parameters: Record<string, string> = {}\n for (let i = 1; i < parts.length; i++) {\n const [key, value] = parts[i].split('=').map(p => p.trim())\n if (key && value) {\n // Remove quotes if present\n parameters[key.toLowerCase()] = value.replace(/^[\"']|[\"']$/g, '')\n }\n }\n\n return {\n type,\n subtype,\n mediaType,\n charset: parameters['charset'],\n boundary: parameters['boundary'],\n parameters,\n }\n}\n\n/**\n * Check if Content-Type matches allowed types\n */\nexport function isAllowedContentType(\n contentType: string | null,\n allowedTypes: string[],\n strict = false\n): boolean {\n if (!contentType) {\n return !strict\n }\n\n const { mediaType } = parseContentType(contentType)\n\n return allowedTypes.some(allowed => {\n const normalizedAllowed = allowed.toLowerCase().trim()\n\n // Exact match\n if (mediaType === normalizedAllowed) {\n return true\n }\n\n // Wildcard match (e.g., 'application/*' matches 'application/json')\n if (normalizedAllowed.endsWith('/*')) {\n const prefix = normalizedAllowed.slice(0, -2)\n return mediaType.startsWith(prefix + '/')\n }\n\n // Type-only match (e.g., 'application' matches 'application/json')\n if (!normalizedAllowed.includes('/')) {\n const { type } = parseContentType(contentType)\n return type === normalizedAllowed\n }\n\n return false\n })\n}\n\n/**\n * Validate Content-Type header\n */\nexport function validateContentType(\n request: NextRequest,\n config: ContentTypeConfig\n): { valid: boolean; contentType: string | null; reason?: string } {\n const contentType = request.headers.get('content-type')\n const { allowed, strict = false, charset } = config\n\n // Check if Content-Type is required but missing\n if (strict && !contentType) {\n return {\n valid: false,\n contentType: null,\n reason: 'Content-Type header is required',\n }\n }\n\n // Check if Content-Type is allowed\n if (contentType && !isAllowedContentType(contentType, allowed, strict)) {\n return {\n valid: false,\n contentType,\n reason: `Content-Type '${contentType}' is not allowed`,\n }\n }\n\n // Check charset if specified\n if (charset && contentType) {\n const parsed = parseContentType(contentType)\n if (parsed.charset && parsed.charset.toLowerCase() !== charset.toLowerCase()) {\n return {\n valid: false,\n contentType,\n reason: `Charset '${parsed.charset}' is not allowed, expected '${charset}'`,\n }\n }\n }\n\n return { valid: true, contentType }\n}\n\n/**\n * Default Content-Type validation error response\n */\nexport function defaultContentTypeErrorResponse(\n contentType: string | null,\n reason: string\n): Response {\n return new Response(\n JSON.stringify({\n error: 'invalid_content_type',\n message: reason,\n received: contentType,\n }),\n {\n status: 415, // Unsupported Media Type\n headers: { 'Content-Type': 'application/json' },\n }\n )\n}\n\n/**\n * Check if request has JSON content type\n */\nexport function isJsonRequest(request: NextRequest): boolean {\n return isAllowedContentType(\n request.headers.get('content-type'),\n [MIME_TYPES.JSON]\n )\n}\n\n/**\n * Check if request has form content type\n */\nexport function isFormRequest(request: NextRequest): boolean {\n return isAllowedContentType(\n request.headers.get('content-type'),\n [MIME_TYPES.FORM_URLENCODED, MIME_TYPES.MULTIPART_FORM]\n )\n}\n\n/**\n * Check if request has multipart content type\n */\nexport function isMultipartRequest(request: NextRequest): boolean {\n return isAllowedContentType(\n request.headers.get('content-type'),\n [MIME_TYPES.MULTIPART_FORM]\n )\n}\n\n/**\n * Get boundary from multipart Content-Type\n */\nexport function getMultipartBoundary(request: NextRequest): string | null {\n const contentType = request.headers.get('content-type')\n if (!contentType) return null\n\n const { boundary } = parseContentType(contentType)\n return boundary || null\n}\n","import type { PathValidationConfig, PathValidationResult } from '../types'\n\n/**\n * Dangerous path patterns\n */\nconst DANGEROUS_PATTERNS = [\n // Unix path traversal\n /\\.\\.\\//g,\n /\\.\\./g,\n // Windows path traversal\n /\\.\\.\\\\/g,\n // Null byte (can truncate paths in some systems)\n /%00/g,\n /\\0/g,\n // URL encoded traversal\n /%2e%2e%2f/gi, // ../\n /%2e%2e\\//gi, // ../\n /%2e%2e%5c/gi, // ..\\\n /%2e%2e\\\\/gi, // ..\\\n // Double URL encoding\n /%252e%252e%252f/gi,\n /%252e%252e%255c/gi,\n // Unicode encoding\n /\\.%u002e\\//gi,\n /%u002e%u002e%u002f/gi,\n // Overlong UTF-8 encoding\n /%c0%ae%c0%ae%c0%af/gi,\n /%c1%9c/gi, // Backslash variant\n]\n\n/**\n * Default blocked extensions\n */\nconst DEFAULT_BLOCKED_EXTENSIONS = [\n '.exe', '.dll', '.so', '.dylib', // Executables\n '.sh', '.bash', '.bat', '.cmd', '.ps1', // Scripts\n '.php', '.asp', '.aspx', '.jsp', '.cgi', // Server scripts\n '.htaccess', '.htpasswd', // Apache config\n '.env', '.git', '.svn', // Config/VCS\n]\n\n/**\n * Normalize path separators\n */\nfunction normalizePathSeparators(path: string): string {\n return path.replace(/\\\\/g, '/')\n}\n\n/**\n * URL decode a path (handles double encoding)\n */\nfunction decodePathComponent(path: string): string {\n let result = path\n let previous = ''\n\n // Keep decoding until no more changes (handles double encoding)\n while (result !== previous) {\n previous = result\n try {\n result = decodeURIComponent(result)\n } catch {\n break\n }\n }\n\n return result\n}\n\n/**\n * Check if path contains traversal patterns\n */\nexport function hasPathTraversal(path: string): boolean {\n if (!path || typeof path !== 'string') return false\n\n // Normalize and decode\n const normalized = normalizePathSeparators(decodePathComponent(path))\n\n // Check for dangerous patterns\n for (const pattern of DANGEROUS_PATTERNS) {\n pattern.lastIndex = 0\n if (pattern.test(normalized)) {\n return true\n }\n }\n\n // Check for .. sequences (already handled by patterns but double check)\n if (normalized.includes('..')) {\n return true\n }\n\n return false\n}\n\n/**\n * Validate and sanitize a path\n */\nexport function validatePath(\n path: string,\n config: PathValidationConfig = {}\n): PathValidationResult {\n if (!path || typeof path !== 'string') {\n return { valid: false, reason: 'Path is empty or not a string' }\n }\n\n const {\n allowAbsolute = false,\n allowedPrefixes = [],\n allowedExtensions,\n blockedExtensions = DEFAULT_BLOCKED_EXTENSIONS,\n maxDepth = 10,\n maxLength = 255,\n normalize = true,\n } = config\n\n // Check length\n if (path.length > maxLength) {\n return { valid: false, reason: `Path exceeds maximum length of ${maxLength}` }\n }\n\n // Decode and normalize\n let normalized = decodePathComponent(path)\n if (normalize) {\n normalized = normalizePathSeparators(normalized)\n }\n\n // Check for null bytes\n if (normalized.includes('\\0') || path.includes('%00')) {\n return { valid: false, reason: 'Path contains null bytes' }\n }\n\n // Check for path traversal\n if (hasPathTraversal(path)) {\n return { valid: false, reason: 'Path contains traversal sequences' }\n }\n\n // Check absolute path\n const isAbsolute = normalized.startsWith('/') ||\n /^[a-zA-Z]:/.test(normalized) || // Windows drive letter\n normalized.startsWith('\\\\\\\\') // UNC path\n\n if (isAbsolute && !allowAbsolute) {\n return { valid: false, reason: 'Absolute paths are not allowed' }\n }\n\n // Check allowed prefixes\n if (allowedPrefixes.length > 0) {\n const hasValidPrefix = allowedPrefixes.some(prefix => {\n const normalizedPrefix = normalizePathSeparators(prefix)\n return normalized.startsWith(normalizedPrefix)\n })\n\n if (!hasValidPrefix) {\n return { valid: false, reason: 'Path does not start with an allowed prefix' }\n }\n }\n\n // Check path depth\n const segments = normalized.split('/').filter(s => s && s !== '.')\n if (segments.length > maxDepth) {\n return { valid: false, reason: `Path depth exceeds maximum of ${maxDepth}` }\n }\n\n // Get extension\n const lastSegment = segments[segments.length - 1] || ''\n const dotIndex = lastSegment.lastIndexOf('.')\n const extension = dotIndex > 0 ? lastSegment.slice(dotIndex).toLowerCase() : ''\n\n // Check blocked extensions\n if (extension && blockedExtensions.length > 0) {\n if (blockedExtensions.map(e => e.toLowerCase()).includes(extension)) {\n return { valid: false, reason: `Extension ${extension} is not allowed` }\n }\n }\n\n // Check allowed extensions\n if (extension && allowedExtensions && allowedExtensions.length > 0) {\n if (!allowedExtensions.map(e => e.toLowerCase()).includes(extension)) {\n return { valid: false, reason: `Extension ${extension} is not in allowed list` }\n }\n }\n\n // Normalize double slashes\n const sanitized = normalized.replace(/\\/+/g, '/')\n\n return { valid: true, sanitized }\n}\n\n/**\n * Sanitize a path by removing dangerous elements\n */\nexport function sanitizePath(\n path: string,\n config: PathValidationConfig = {}\n): string {\n if (!path || typeof path !== 'string') return ''\n\n const { normalize = true, maxLength = 255 } = config\n\n // Decode\n let result = decodePathComponent(path)\n\n // Normalize separators\n if (normalize) {\n result = normalizePathSeparators(result)\n }\n\n // Remove null bytes\n result = result.replace(/\\0/g, '').replace(/%00/g, '')\n\n // Remove traversal sequences\n result = result.replace(/\\.\\.\\//g, '').replace(/\\.\\.\\\\/g, '')\n\n // Remove leading slashes if not allowed absolute\n if (!config.allowAbsolute) {\n result = result.replace(/^\\/+/, '')\n result = result.replace(/^[a-zA-Z]:/, '')\n result = result.replace(/^\\\\\\\\/, '')\n }\n\n // Remove double slashes\n result = result.replace(/\\/+/g, '/')\n\n // Remove trailing slashes\n result = result.replace(/\\/+$/, '')\n\n // Limit length\n if (result.length > maxLength) {\n result = result.slice(0, maxLength)\n }\n\n return result\n}\n\n/**\n * Check if a path is within a base directory (safe containment)\n */\nexport function isPathContained(path: string, baseDir: string): boolean {\n if (!path || !baseDir) return false\n\n // Normalize both paths\n const normalizedPath = normalizePathSeparators(decodePathComponent(path))\n const normalizedBase = normalizePathSeparators(baseDir)\n\n // Resolve the path (simulate what a file system would do)\n const resolvedPath = resolvePath(normalizedPath, normalizedBase)\n\n // Check if resolved path starts with base directory\n return resolvedPath.startsWith(normalizedBase.replace(/\\/$/, '') + '/')\n}\n\n/**\n * Simple path resolver (simulates path.resolve)\n */\nfunction resolvePath(path: string, base: string): string {\n // Combine base and path\n let combined: string\n if (path.startsWith('/')) {\n combined = path\n } else {\n combined = `${base.replace(/\\/$/, '')}/${path}`\n }\n\n // Resolve . and ..\n const segments: string[] = []\n for (const segment of combined.split('/')) {\n if (segment === '' || segment === '.') {\n continue\n }\n if (segment === '..') {\n segments.pop()\n } else {\n segments.push(segment)\n }\n }\n\n return '/' + segments.join('/')\n}\n\n/**\n * Get the file extension from a path\n */\nexport function getExtension(path: string): string {\n if (!path || typeof path !== 'string') return ''\n\n const normalized = normalizePathSeparators(path)\n const segments = normalized.split('/')\n const filename = segments[segments.length - 1] || ''\n\n const dotIndex = filename.lastIndexOf('.')\n if (dotIndex <= 0) return '' // No extension or hidden file\n\n return filename.slice(dotIndex).toLowerCase()\n}\n\n/**\n * Get the filename from a path\n */\nexport function getFilename(path: string): string {\n if (!path || typeof path !== 'string') return ''\n\n const normalized = normalizePathSeparators(path)\n const segments = normalized.split('/')\n\n return segments[segments.length - 1] || ''\n}\n\n/**\n * Sanitize a filename (remove dangerous characters)\n */\nexport function sanitizeFilename(filename: string): string {\n if (typeof filename !== 'string') return 'file'\n if (!filename) return 'file'\n\n let result = filename\n\n // Remove path separators\n result = result.replace(/[/\\\\]/g, '')\n\n // Remove null bytes\n result = result.replace(/\\0/g, '')\n\n // Remove control characters\n result = result.replace(/[\\x00-\\x1f\\x7f]/g, '')\n\n // Remove dangerous characters for file systems\n result = result.replace(/[<>:\"|?*]/g, '')\n\n // Remove leading/trailing dots and spaces\n result = result.replace(/^[.\\s]+|[.\\s]+$/g, '')\n\n // Limit length (common file system limit)\n if (result.length > 255) {\n const ext = getExtension(result)\n const name = result.slice(0, 255 - ext.length)\n result = name + ext\n }\n\n return result || 'file'\n}\n\n/**\n * Check if path is a hidden file (starts with dot)\n */\nexport function isHiddenPath(path: string): boolean {\n if (!path) return false\n\n const normalized = normalizePathSeparators(path)\n const segments = normalized.split('/').filter(Boolean)\n\n return segments.some(segment => segment.startsWith('.'))\n}\n","import type { NextRequest } from 'next/server'\nimport type { FileValidationConfig, FileValidationError, FileInfo, MagicNumber } from '../types'\nimport { sanitizeFilename, getExtension } from '../sanitizers/path'\n\n/**\n * Known magic numbers for file type validation\n */\nconst MAGIC_NUMBERS: MagicNumber[] = [\n // Images\n { type: 'image/jpeg', extension: '.jpg', signature: [0xFF, 0xD8, 0xFF] },\n { type: 'image/png', extension: '.png', signature: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A] },\n { type: 'image/gif', extension: '.gif', signature: [0x47, 0x49, 0x46, 0x38] }, // GIF87a or GIF89a\n { type: 'image/webp', extension: '.webp', signature: [0x52, 0x49, 0x46, 0x46], offset: 0 }, // RIFF\n { type: 'image/bmp', extension: '.bmp', signature: [0x42, 0x4D] },\n { type: 'image/tiff', extension: '.tiff', signature: [0x49, 0x49, 0x2A, 0x00] }, // Little endian\n { type: 'image/tiff', extension: '.tiff', signature: [0x4D, 0x4D, 0x00, 0x2A] }, // Big endian\n { type: 'image/x-icon', extension: '.ico', signature: [0x00, 0x00, 0x01, 0x00] },\n { type: 'image/svg+xml', extension: '.svg', signature: [0x3C, 0x3F, 0x78, 0x6D, 0x6C] }, // <?xml\n\n // Documents\n { type: 'application/pdf', extension: '.pdf', signature: [0x25, 0x50, 0x44, 0x46] }, // %PDF\n { type: 'application/zip', extension: '.zip', signature: [0x50, 0x4B, 0x03, 0x04] }, // PK\n { type: 'application/gzip', extension: '.gz', signature: [0x1F, 0x8B] },\n { type: 'application/x-rar-compressed', extension: '.rar', signature: [0x52, 0x61, 0x72, 0x21] },\n { type: 'application/x-7z-compressed', extension: '.7z', signature: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C] },\n\n // Microsoft Office (new format - zip based)\n { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', extension: '.xlsx', signature: [0x50, 0x4B, 0x03, 0x04] },\n { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', extension: '.docx', signature: [0x50, 0x4B, 0x03, 0x04] },\n { type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', extension: '.pptx', signature: [0x50, 0x4B, 0x03, 0x04] },\n\n // Microsoft Office (old format)\n { type: 'application/msword', extension: '.doc', signature: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1] },\n { type: 'application/vnd.ms-excel', extension: '.xls', signature: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1] },\n\n // Audio\n { type: 'audio/mpeg', extension: '.mp3', signature: [0xFF, 0xFB] }, // MP3 frame sync\n { type: 'audio/mpeg', extension: '.mp3', signature: [0x49, 0x44, 0x33] }, // ID3\n { type: 'audio/wav', extension: '.wav', signature: [0x52, 0x49, 0x46, 0x46] }, // RIFF\n { type: 'audio/ogg', extension: '.ogg', signature: [0x4F, 0x67, 0x67, 0x53] },\n { type: 'audio/flac', extension: '.flac', signature: [0x66, 0x4C, 0x61, 0x43] },\n\n // Video\n { type: 'video/mp4', extension: '.mp4', signature: [0x00, 0x00, 0x00], offset: 0 }, // Partial match\n { type: 'video/webm', extension: '.webm', signature: [0x1A, 0x45, 0xDF, 0xA3] },\n { type: 'video/avi', extension: '.avi', signature: [0x52, 0x49, 0x46, 0x46] }, // RIFF\n { type: 'video/quicktime', extension: '.mov', signature: [0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70] },\n\n // Web\n { type: 'application/wasm', extension: '.wasm', signature: [0x00, 0x61, 0x73, 0x6D] }, // \\0asm\n\n // Fonts\n { type: 'font/woff', extension: '.woff', signature: [0x77, 0x4F, 0x46, 0x46] },\n { type: 'font/woff2', extension: '.woff2', signature: [0x77, 0x4F, 0x46, 0x32] },\n]\n\n/**\n * Default file size limits\n */\nexport const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024 // 10MB\nexport const DEFAULT_MAX_FILES = 10\n\n/**\n * Dangerous file extensions to block by default\n */\nexport const DANGEROUS_EXTENSIONS = [\n '.exe', '.dll', '.so', '.dylib', '.bin',\n '.sh', '.bash', '.bat', '.cmd', '.ps1', '.vbs',\n '.php', '.asp', '.aspx', '.jsp', '.cgi', '.pl',\n '.py', '.rb', '.jar', '.class',\n '.msi', '.dmg', '.pkg', '.deb', '.rpm',\n '.scr', '.pif', '.com', '.hta',\n]\n\n/**\n * Check magic number signature\n */\nexport function checkMagicNumber(bytes: Uint8Array, magicNumber: MagicNumber): boolean {\n const offset = magicNumber.offset || 0\n const signature = magicNumber.signature\n\n if (bytes.length < offset + signature.length) {\n return false\n }\n\n for (let i = 0; i < signature.length; i++) {\n if (bytes[offset + i] !== signature[i]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Detect file type from magic number\n */\nexport function detectFileType(bytes: Uint8Array): { type: string; extension: string } | null {\n for (const magic of MAGIC_NUMBERS) {\n if (checkMagicNumber(bytes, magic)) {\n return { type: magic.type, extension: magic.extension }\n }\n }\n return null\n}\n\n/**\n * Validate a single file\n */\nexport async function validateFile(\n file: File,\n config: FileValidationConfig = {}\n): Promise<{ valid: boolean; info: FileInfo; errors: FileValidationError[] }> {\n const {\n maxSize = DEFAULT_MAX_FILE_SIZE,\n minSize = 0,\n allowedTypes = [],\n blockedTypes = [],\n allowedExtensions = [],\n blockedExtensions = DANGEROUS_EXTENSIONS,\n validateMagicNumbers = true,\n sanitizeFilename: doSanitize = true,\n } = config\n\n const errors: FileValidationError[] = []\n const extension = getExtension(file.name)\n\n const info: FileInfo = {\n filename: doSanitize ? sanitizeFilename(file.name) : file.name,\n size: file.size,\n type: file.type,\n extension,\n }\n\n // Check size\n if (file.size > maxSize) {\n errors.push({\n filename: file.name,\n code: 'size_exceeded',\n message: `File size (${formatBytes(file.size)}) exceeds maximum allowed (${formatBytes(maxSize)})`,\n details: { size: file.size, maxSize },\n })\n }\n\n if (file.size < minSize) {\n errors.push({\n filename: file.name,\n code: 'size_too_small',\n message: `File size (${formatBytes(file.size)}) is below minimum required (${formatBytes(minSize)})`,\n details: { size: file.size, minSize },\n })\n }\n\n // Check extension\n if (blockedExtensions.length > 0 && extension) {\n if (blockedExtensions.map(e => e.toLowerCase()).includes(extension.toLowerCase())) {\n errors.push({\n filename: file.name,\n code: 'extension_not_allowed',\n message: `File extension '${extension}' is not allowed`,\n details: { extension, blockedExtensions },\n })\n }\n }\n\n if (allowedExtensions.length > 0 && extension) {\n if (!allowedExtensions.map(e => e.toLowerCase()).includes(extension.toLowerCase())) {\n errors.push({\n filename: file.name,\n code: 'extension_not_allowed',\n message: `File extension '${extension}' is not in allowed list`,\n details: { extension, allowedExtensions },\n })\n }\n }\n\n // Check MIME type\n if (blockedTypes.length > 0 && file.type) {\n if (blockedTypes.includes(file.type)) {\n errors.push({\n filename: file.name,\n code: 'type_not_allowed',\n message: `File type '${file.type}' is not allowed`,\n details: { type: file.type, blockedTypes },\n })\n }\n }\n\n if (allowedTypes.length > 0) {\n if (!allowedTypes.includes(file.type)) {\n errors.push({\n filename: file.name,\n code: 'type_not_allowed',\n message: `File type '${file.type}' is not in allowed list`,\n details: { type: file.type, allowedTypes },\n })\n }\n }\n\n // Validate magic numbers\n if (validateMagicNumbers && errors.length === 0) {\n try {\n const buffer = await file.arrayBuffer()\n const bytes = new Uint8Array(buffer.slice(0, 32)) // Read first 32 bytes\n const detected = detectFileType(bytes)\n\n if (detected) {\n // Check if detected type matches claimed type\n if (file.type && detected.type !== file.type) {\n // Allow some flexibility for similar types\n const isSimilar =\n (detected.type.startsWith('image/') && file.type.startsWith('image/')) ||\n (detected.type.startsWith('audio/') && file.type.startsWith('audio/')) ||\n (detected.type.startsWith('video/') && file.type.startsWith('video/'))\n\n if (!isSimilar) {\n errors.push({\n filename: file.name,\n code: 'invalid_content',\n message: `File content doesn't match declared type (claimed: ${file.type}, detected: ${detected.type})`,\n details: { claimed: file.type, detected: detected.type },\n })\n }\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n return {\n valid: errors.length === 0,\n info,\n errors,\n }\n}\n\n/**\n * Validate multiple files\n */\nexport async function validateFiles(\n files: File[],\n config: FileValidationConfig = {}\n): Promise<{ valid: boolean; infos: FileInfo[]; errors: FileValidationError[] }> {\n const { maxFiles = DEFAULT_MAX_FILES } = config\n\n const allErrors: FileValidationError[] = []\n const infos: FileInfo[] = []\n\n // Check total file count\n if (files.length > maxFiles) {\n allErrors.push({\n filename: '',\n code: 'too_many_files',\n message: `Too many files (${files.length}), maximum allowed is ${maxFiles}`,\n details: { count: files.length, maxFiles },\n })\n }\n\n // Validate each file\n for (const file of files) {\n const result = await validateFile(file, config)\n infos.push(result.info)\n allErrors.push(...result.errors)\n }\n\n return {\n valid: allErrors.length === 0,\n infos,\n errors: allErrors,\n }\n}\n\n/**\n * Extract files from FormData\n */\nexport function extractFilesFromFormData(formData: FormData): Map<string, File[]> {\n const files = new Map<string, File[]>()\n\n formData.forEach((value, key) => {\n if (value instanceof File) {\n const existing = files.get(key) || []\n existing.push(value)\n files.set(key, existing)\n }\n })\n\n return files\n}\n\n/**\n * Validate files from a request\n */\nexport async function validateFilesFromRequest(\n request: NextRequest,\n config: FileValidationConfig = {}\n): Promise<{ valid: boolean; files: Map<string, FileInfo[]>; errors: FileValidationError[] }> {\n const contentType = request.headers.get('content-type') || ''\n\n if (!contentType.includes('multipart/form-data')) {\n return { valid: true, files: new Map(), errors: [] }\n }\n\n try {\n const formData = await request.formData()\n const fileMap = extractFilesFromFormData(formData)\n\n const allInfos = new Map<string, FileInfo[]>()\n const allErrors: FileValidationError[] = []\n\n let totalFileCount = 0\n\n for (const [field, files] of fileMap.entries()) {\n totalFileCount += files.length\n const result = await validateFiles(files, { ...config, maxFiles: Infinity }) // Check max later\n\n allInfos.set(field, result.infos)\n allErrors.push(...result.errors.map(e => ({ ...e, field })))\n }\n\n // Check total file count across all fields\n const maxFiles = config.maxFiles ?? DEFAULT_MAX_FILES\n if (totalFileCount > maxFiles) {\n allErrors.push({\n filename: '',\n code: 'too_many_files',\n message: `Total file count (${totalFileCount}) exceeds maximum (${maxFiles})`,\n details: { count: totalFileCount, maxFiles },\n })\n }\n\n return {\n valid: allErrors.length === 0,\n files: allInfos,\n errors: allErrors,\n }\n } catch {\n return {\n valid: false,\n files: new Map(),\n errors: [{\n filename: '',\n code: 'invalid_content',\n message: 'Failed to parse multipart form data',\n }],\n }\n }\n}\n\n/**\n * Default file validation error response\n */\nexport function defaultFileErrorResponse(errors: FileValidationError[]): Response {\n return new Response(\n JSON.stringify({\n error: 'file_validation_error',\n message: 'File validation failed',\n details: errors.map(e => ({\n filename: e.filename,\n field: e.field,\n code: e.code,\n message: e.message,\n })),\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n\n const units = ['B', 'KB', 'MB', 'GB']\n const k = 1024\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${units[i]}`\n}\n","import type { SanitizeConfig } from '../types'\n\n/**\n * Default allowed tags for 'allow-safe' mode\n */\nconst DEFAULT_ALLOWED_TAGS = [\n 'a', 'abbr', 'b', 'blockquote', 'br', 'code', 'del', 'em', 'h1', 'h2', 'h3',\n 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'li', 'mark', 'ol', 'p', 'pre', 'q',\n 's', 'small', 'span', 'strong', 'sub', 'sup', 'u', 'ul',\n]\n\n/**\n * Default allowed attributes per tag\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES: Record<string, string[]> = {\n a: ['href', 'title', 'target', 'rel'],\n img: ['src', 'alt', 'title', 'width', 'height'],\n abbr: ['title'],\n q: ['cite'],\n blockquote: ['cite'],\n}\n\n/**\n * Safe protocols for URLs\n */\nconst DEFAULT_SAFE_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:']\n\n/**\n * Dangerous patterns to detect\n */\nconst DANGEROUS_PATTERNS = [\n // Event handlers\n /\\bon\\w+\\s*=/gi,\n // JavaScript protocol\n /javascript\\s*:/gi,\n // VBScript protocol\n /vbscript\\s*:/gi,\n // Data URI with scripts\n /data\\s*:[^,]*(?:text\\/html|application\\/javascript|text\\/javascript)/gi,\n // Expression in CSS\n /expression\\s*\\(/gi,\n // Binding in CSS (Firefox)\n /-moz-binding\\s*:/gi,\n // Behavior in CSS (IE)\n /behavior\\s*:/gi,\n // Import in CSS\n /@import/gi,\n // Script tags\n /<\\s*script/gi,\n // Style tags with expressions\n /<\\s*style[^>]*>[^<]*expression/gi,\n // SVG with scripts\n /<\\s*svg[^>]*onload/gi,\n // Object/embed/applet tags\n /<\\s*(object|embed|applet)/gi,\n // Base tag (can redirect resources)\n /<\\s*base/gi,\n // Meta refresh\n /<\\s*meta[^>]*http-equiv\\s*=\\s*[\"']?refresh/gi,\n // Form action hijacking\n /<\\s*form[^>]*action\\s*=\\s*[\"']?javascript/gi,\n // Link tag with import\n /<\\s*link[^>]*rel\\s*=\\s*[\"']?import/gi,\n]\n\n/**\n * HTML entities map\n */\nconst HTML_ENTITIES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '=',\n}\n\n/**\n * Escape HTML special characters\n */\nexport function escapeHtml(str: string): string {\n return str.replace(/[&<>\"'`=/]/g, char => HTML_ENTITIES[char] || char)\n}\n\n/**\n * Unescape HTML entities\n */\nexport function unescapeHtml(str: string): string {\n const entityMap: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n '/': '/',\n '`': '`',\n '=': '=',\n ''': \"'\",\n '/': '/',\n }\n\n return str.replace(/&(?:amp|lt|gt|quot|#x27|#x2F|#x60|#x3D|#39|#47);/gi, entity => {\n return entityMap[entity.toLowerCase()] || entity\n })\n}\n\n/**\n * Strip all HTML tags\n */\nexport function stripHtml(str: string): string {\n // Remove script and style content completely\n let result = str.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n result = result.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n\n // Remove all HTML tags\n result = result.replace(/<[^>]*>/g, '')\n\n // Decode entities\n result = unescapeHtml(result)\n\n // Remove null bytes\n result = result.replace(/\\0/g, '')\n\n return result.trim()\n}\n\n/**\n * Check if a URL is safe\n */\nexport function isSafeUrl(url: string, allowedProtocols: string[] = DEFAULT_SAFE_PROTOCOLS): boolean {\n if (!url) return true\n\n // Normalize\n const trimmed = url.trim().toLowerCase()\n\n // Check for dangerous protocols\n if (trimmed.startsWith('javascript:')) return false\n if (trimmed.startsWith('vbscript:')) return false\n\n // Allow data:image URLs (commonly used for base64 images)\n if (trimmed.startsWith('data:image/')) return true\n\n // Block other data URLs\n if (trimmed.startsWith('data:')) return false\n\n // Check if protocol is allowed\n try {\n const parsed = new URL(url, 'https://example.com')\n if (parsed.protocol && !allowedProtocols.includes(parsed.protocol)) {\n // Allow relative URLs\n if (!url.includes(':')) return true\n return false\n }\n } catch {\n // Relative URL, allow\n return true\n }\n\n return true\n}\n\n/**\n * Sanitize HTML with allowed tags\n */\nexport function sanitizeHtml(\n str: string,\n allowedTags: string[] = DEFAULT_ALLOWED_TAGS,\n allowedAttributes: Record<string, string[]> = DEFAULT_ALLOWED_ATTRIBUTES,\n allowedProtocols: string[] = DEFAULT_SAFE_PROTOCOLS\n): string {\n // Remove null bytes first\n let result = str.replace(/\\0/g, '')\n\n // Remove script and style content completely\n result = result.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n result = result.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n\n // Remove comments\n result = result.replace(/<!--[\\s\\S]*?-->/g, '')\n\n // Process tags\n result = result.replace(/<\\/?([a-z][a-z0-9]*)\\b([^>]*)>/gi, (match, tagName, attributes) => {\n const lowerTag = tagName.toLowerCase()\n const isClosing = match.startsWith('</')\n\n // Check if tag is allowed\n if (!allowedTags.includes(lowerTag)) {\n return ''\n }\n\n if (isClosing) {\n return `</${lowerTag}>`\n }\n\n // Process attributes\n const allowedAttrs = allowedAttributes[lowerTag] || []\n const safeAttrs: string[] = []\n\n // Parse attributes\n const attrRegex = /([a-z][a-z0-9-]*)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]*))/gi\n let attrMatch\n\n while ((attrMatch = attrRegex.exec(attributes)) !== null) {\n const attrName = attrMatch[1].toLowerCase()\n const attrValue = attrMatch[2] || attrMatch[3] || attrMatch[4] || ''\n\n // Check if attribute is allowed\n if (!allowedAttrs.includes(attrName)) continue\n\n // Check for dangerous patterns in value\n if (DANGEROUS_PATTERNS.some(pattern => pattern.test(attrValue))) continue\n\n // Check URL attributes\n if (['href', 'src', 'action', 'formaction'].includes(attrName)) {\n if (!isSafeUrl(attrValue, allowedProtocols)) continue\n }\n\n // Escape attribute value\n const safeValue = escapeHtml(attrValue)\n safeAttrs.push(`${attrName}=\"${safeValue}\"`)\n }\n\n const attrStr = safeAttrs.length > 0 ? ' ' + safeAttrs.join(' ') : ''\n return `<${lowerTag}${attrStr}>`\n })\n\n // Final check for any remaining dangerous patterns\n for (const pattern of DANGEROUS_PATTERNS) {\n result = result.replace(pattern, '')\n }\n\n return result\n}\n\n/**\n * Detect if string contains potential XSS\n */\nexport function detectXSS(str: string): boolean {\n if (!str || typeof str !== 'string') return false\n\n // Normalize\n const normalized = str\n .replace(/\\\\x([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/\\\\u([0-9a-f]{4})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/&#x([0-9a-f]+);?/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/&#(\\d+);?/gi, (_, dec) => String.fromCharCode(parseInt(dec, 10)))\n\n // Reset lastIndex for global regexes before testing\n for (const pattern of DANGEROUS_PATTERNS) {\n pattern.lastIndex = 0\n if (pattern.test(normalized)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Main sanitize function\n */\nexport function sanitize(input: string, config: SanitizeConfig = {}): string {\n if (!input || typeof input !== 'string') return ''\n\n const {\n mode = 'escape',\n allowedTags = DEFAULT_ALLOWED_TAGS,\n allowedAttributes = DEFAULT_ALLOWED_ATTRIBUTES,\n allowedProtocols = DEFAULT_SAFE_PROTOCOLS,\n maxLength,\n stripNull = true,\n } = config\n\n let result = input\n\n // Strip null bytes\n if (stripNull) {\n result = result.replace(/\\0/g, '')\n }\n\n // Apply sanitization based on mode\n switch (mode) {\n case 'escape':\n result = escapeHtml(result)\n break\n\n case 'strip':\n result = stripHtml(result)\n break\n\n case 'allow-safe':\n result = sanitizeHtml(result, allowedTags, allowedAttributes, allowedProtocols)\n break\n }\n\n // Apply max length\n if (maxLength !== undefined && result.length > maxLength) {\n result = result.slice(0, maxLength)\n }\n\n return result\n}\n\n/**\n * Sanitize object values recursively\n */\nexport function sanitizeObject<T>(obj: T, config: SanitizeConfig = {}): T {\n if (typeof obj === 'string') {\n return sanitize(obj, config) as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => sanitizeObject(item, config)) as T\n }\n\n if (typeof obj === 'object' && obj !== null) {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = sanitizeObject(value, config)\n }\n return result as T\n }\n\n return obj\n}\n\n/**\n * Sanitize specific fields in an object\n */\nexport function sanitizeFields<T extends Record<string, unknown>>(\n obj: T,\n fields: string[],\n config: SanitizeConfig = {}\n): T {\n const result = { ...obj }\n\n for (const field of fields) {\n if (field in result && typeof result[field] === 'string') {\n (result as Record<string, unknown>)[field] = sanitize(result[field] as string, config)\n }\n }\n\n return result\n}\n","import type { SQLDetection } from '../types'\n\n/**\n * SQL injection patterns with severity levels\n */\ninterface SQLPattern {\n pattern: RegExp\n name: string\n severity: 'low' | 'medium' | 'high'\n}\n\n/**\n * Common SQL injection patterns\n */\nconst SQL_PATTERNS: SQLPattern[] = [\n // High severity - Definite attacks\n {\n pattern: /'\\s*OR\\s+'?\\d+'?\\s*=\\s*'?\\d+'?/gi,\n name: \"OR '1'='1' attack\",\n severity: 'high',\n },\n {\n pattern: /'\\s*OR\\s+'[^']*'\\s*=\\s*'[^']*'/gi,\n name: \"OR 'x'='x' attack\",\n severity: 'high',\n },\n {\n pattern: /;\\s*DROP\\s+(TABLE|DATABASE|INDEX|VIEW)/gi,\n name: 'DROP statement',\n severity: 'high',\n },\n {\n pattern: /;\\s*DELETE\\s+FROM/gi,\n name: 'DELETE statement',\n severity: 'high',\n },\n {\n pattern: /;\\s*TRUNCATE\\s+/gi,\n name: 'TRUNCATE statement',\n severity: 'high',\n },\n {\n pattern: /;\\s*INSERT\\s+INTO/gi,\n name: 'INSERT statement',\n severity: 'high',\n },\n {\n pattern: /;\\s*UPDATE\\s+\\w+\\s+SET/gi,\n name: 'UPDATE statement',\n severity: 'high',\n },\n {\n pattern: /UNION\\s+(ALL\\s+)?SELECT/gi,\n name: 'UNION SELECT attack',\n severity: 'high',\n },\n {\n pattern: /EXEC(\\s+|\\()+(sp_|xp_)/gi,\n name: 'SQL Server stored procedure',\n severity: 'high',\n },\n {\n pattern: /EXECUTE\\s+IMMEDIATE/gi,\n name: 'Oracle EXECUTE IMMEDIATE',\n severity: 'high',\n },\n {\n pattern: /INTO\\s+(OUT|DUMP)FILE/gi,\n name: 'MySQL file write',\n severity: 'high',\n },\n {\n pattern: /LOAD_FILE\\s*\\(/gi,\n name: 'MySQL file read',\n severity: 'high',\n },\n {\n pattern: /BENCHMARK\\s*\\(\\s*\\d+\\s*,/gi,\n name: 'MySQL BENCHMARK DoS',\n severity: 'high',\n },\n {\n pattern: /SLEEP\\s*\\(\\s*\\d+\\s*\\)/gi,\n name: 'SQL SLEEP time-based attack',\n severity: 'high',\n },\n {\n pattern: /WAITFOR\\s+DELAY/gi,\n name: 'SQL Server WAITFOR DELAY',\n severity: 'high',\n },\n {\n pattern: /PG_SLEEP\\s*\\(/gi,\n name: 'PostgreSQL pg_sleep',\n severity: 'high',\n },\n\n // Medium severity - Likely attacks\n {\n pattern: /'\\s*--/g,\n name: 'SQL comment injection',\n severity: 'medium',\n },\n {\n pattern: /'\\s*#/g,\n name: 'MySQL comment injection',\n severity: 'medium',\n },\n {\n pattern: /\\/\\*[\\s\\S]*?\\*\\//g,\n name: 'Block comment',\n severity: 'medium',\n },\n {\n pattern: /'\\s*;\\s*$/g,\n name: 'Statement terminator',\n severity: 'medium',\n },\n {\n pattern: /HAVING\\s+\\d+\\s*=\\s*\\d+/gi,\n name: 'HAVING clause injection',\n severity: 'medium',\n },\n {\n pattern: /GROUP\\s+BY\\s+\\d+/gi,\n name: 'GROUP BY injection',\n severity: 'medium',\n },\n {\n pattern: /ORDER\\s+BY\\s+\\d+/gi,\n name: 'ORDER BY injection',\n severity: 'medium',\n },\n {\n pattern: /CONCAT\\s*\\(/gi,\n name: 'CONCAT function',\n severity: 'medium',\n },\n {\n pattern: /CHAR\\s*\\(\\s*\\d+\\s*\\)/gi,\n name: 'CHAR function bypass',\n severity: 'medium',\n },\n {\n pattern: /0x[0-9a-f]{2,}/gi,\n name: 'Hex encoded value',\n severity: 'medium',\n },\n {\n pattern: /CONVERT\\s*\\(/gi,\n name: 'CONVERT function',\n severity: 'medium',\n },\n {\n pattern: /CAST\\s*\\(/gi,\n name: 'CAST function',\n severity: 'medium',\n },\n\n // Low severity - Suspicious but may be false positives\n {\n pattern: /'\\s*AND\\s+'?\\d+'?\\s*=\\s*'?\\d+'?/gi,\n name: \"AND '1'='1' pattern\",\n severity: 'low',\n },\n {\n pattern: /'\\s*AND\\s+'[^']*'\\s*=\\s*'[^']*'/gi,\n name: \"AND 'x'='x' pattern\",\n severity: 'low',\n },\n {\n pattern: /SELECT\\s+[\\w\\s,*]+\\s+FROM/gi,\n name: 'SELECT statement',\n severity: 'low',\n },\n {\n pattern: /'\\s*\\+\\s*'/g,\n name: 'String concatenation',\n severity: 'low',\n },\n {\n pattern: /'\\s*\\|\\|\\s*'/g,\n name: 'Oracle string concatenation',\n severity: 'low',\n },\n]\n\n/**\n * Additional encoded patterns (URL, hex, unicode)\n * Note: These match on the NORMALIZED (decoded) input\n */\nconst ENCODED_PATTERNS: SQLPattern[] = [\n {\n pattern: /%27\\s*%4f%52\\s*%27/gi, // URL encoded ' OR '\n name: 'URL encoded OR injection',\n severity: 'high',\n },\n {\n pattern: /%27\\s*%2d%2d/gi, // URL encoded ' --\n name: 'URL encoded comment injection',\n severity: 'medium',\n },\n {\n pattern: /\\0|%00/g, // Null byte (decoded or encoded)\n name: 'Null byte injection',\n severity: 'high',\n },\n {\n pattern: /\\\\x27/gi, // Hex escape\n name: 'Hex escaped quote',\n severity: 'medium',\n },\n {\n pattern: /\\\\u0027/gi, // Unicode escape\n name: 'Unicode escaped quote',\n severity: 'medium',\n },\n]\n\n/**\n * Normalize input by decoding common encodings\n */\nfunction normalizeInput(input: string): string {\n let result = input\n\n // URL decode\n try {\n result = decodeURIComponent(result)\n } catch {\n // Ignore decode errors\n }\n\n // HTML entity decode\n result = result\n .replace(/&#x([0-9a-f]+);?/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/&#(\\d+);?/gi, (_, dec) => String.fromCharCode(parseInt(dec, 10)))\n .replace(/"/gi, '\"')\n .replace(/'/gi, \"'\")\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/&/gi, '&')\n\n // Hex escape decode\n result = result.replace(/\\\\x([0-9a-f]{2})/gi, (_, hex) =>\n String.fromCharCode(parseInt(hex, 16))\n )\n\n // Unicode escape decode\n result = result.replace(/\\\\u([0-9a-f]{4})/gi, (_, hex) =>\n String.fromCharCode(parseInt(hex, 16))\n )\n\n return result\n}\n\n/**\n * Detect SQL injection in a string\n */\nexport function detectSQLInjection(\n input: string,\n options: {\n customPatterns?: RegExp[]\n checkEncoded?: boolean\n minSeverity?: 'low' | 'medium' | 'high'\n } = {}\n): SQLDetection[] {\n if (!input || typeof input !== 'string') return []\n\n const {\n customPatterns = [],\n checkEncoded = true,\n minSeverity = 'low',\n } = options\n\n const severityOrder = { low: 0, medium: 1, high: 2 }\n const minSeverityLevel = severityOrder[minSeverity]\n\n const detections: SQLDetection[] = []\n const seenPatterns = new Set<string>()\n\n // Normalize input for encoded pattern detection\n const normalizedInput = checkEncoded ? normalizeInput(input) : input\n\n // Check all patterns\n const allPatterns = [\n ...SQL_PATTERNS,\n ...(checkEncoded ? ENCODED_PATTERNS : []),\n ...customPatterns.map(p => ({ pattern: p, name: 'Custom pattern', severity: 'high' as const })),\n ]\n\n for (const { pattern, name, severity } of allPatterns) {\n if (severityOrder[severity] < minSeverityLevel) continue\n\n // Reset regex state\n pattern.lastIndex = 0\n\n const testInput = checkEncoded ? normalizedInput : input\n if (pattern.test(testInput)) {\n const key = `${name}:${severity}`\n if (!seenPatterns.has(key)) {\n seenPatterns.add(key)\n detections.push({\n field: '', // Will be set by caller\n value: input,\n pattern: name,\n severity,\n })\n }\n }\n }\n\n return detections\n}\n\n/**\n * Check if string contains SQL injection (boolean check)\n */\nexport function hasSQLInjection(\n input: string,\n minSeverity: 'low' | 'medium' | 'high' = 'medium'\n): boolean {\n return detectSQLInjection(input, { minSeverity }).length > 0\n}\n\n/**\n * Sanitize input to prevent SQL injection\n * NOTE: This should NOT be a replacement for parameterized queries!\n */\nexport function sanitizeSQLInput(input: string): string {\n if (!input || typeof input !== 'string') return ''\n\n let result = input\n\n // Remove null bytes\n result = result.replace(/\\0/g, '')\n\n // Escape single quotes\n result = result.replace(/'/g, \"''\")\n\n // Remove dangerous characters\n result = result.replace(/;/g, '')\n result = result.replace(/--/g, '')\n result = result.replace(/\\/\\*/g, '')\n result = result.replace(/\\*\\//g, '')\n\n // Remove hex encoded values\n result = result.replace(/0x[0-9a-f]+/gi, '')\n\n return result\n}\n\n/**\n * Detect SQL injection in object fields\n */\nexport function detectSQLInjectionInObject(\n obj: unknown,\n options: {\n fields?: string[]\n deep?: boolean\n customPatterns?: RegExp[]\n minSeverity?: 'low' | 'medium' | 'high'\n } = {}\n): SQLDetection[] {\n const { fields, deep = true, customPatterns, minSeverity } = options\n const detections: SQLDetection[] = []\n\n function walk(value: unknown, path: string): void {\n if (typeof value === 'string') {\n // If fields specified, only check those\n if (fields && fields.length > 0) {\n const fieldName = path.split('.').pop() || path\n if (!fields.includes(fieldName)) return\n }\n\n const detected = detectSQLInjection(value, { customPatterns, minSeverity })\n for (const d of detected) {\n detections.push({ ...d, field: path })\n }\n } else if (deep && Array.isArray(value)) {\n value.forEach((item, i) => walk(item, `${path}[${i}]`))\n } else if (deep && typeof value === 'object' && value !== null) {\n for (const [key, val] of Object.entries(value)) {\n walk(val, path ? `${path}.${key}` : key)\n }\n }\n }\n\n walk(obj, '')\n return detections\n}\n\n/**\n * Check if value is in allowlist (safe values)\n */\nexport function isAllowedValue(value: string, allowList: string[]): boolean {\n if (!allowList || allowList.length === 0) return false\n return allowList.includes(value)\n}\n","import type { NextRequest } from 'next/server'\nimport type {\n ValidationConfig,\n ValidatedContext,\n ValidationError,\n SanitizationMiddlewareConfig,\n SanitizationChange,\n SQLProtectionConfig,\n ContentTypeConfig,\n FileValidationConfig,\n FileInfo,\n Schema,\n CustomSchema,\n} from './types'\nimport { validateRequest, defaultValidationErrorResponse } from './validators/schema'\nimport { validateContentType, defaultContentTypeErrorResponse } from './validators/content-type'\nimport { validateFilesFromRequest, defaultFileErrorResponse } from './validators/file'\nimport { sanitize, detectXSS } from './sanitizers/xss'\nimport { detectSQLInjectionInObject } from './sanitizers/sql'\nimport { walkObject } from './utils'\n\ntype RouteHandler = (req: NextRequest) => Response | Promise<Response>\n\n/**\n * Validation middleware\n * Validates request body, query, and params against schemas\n */\nexport function withValidation<\n TBody = unknown,\n TQuery = unknown,\n TParams = unknown\n>(\n handler: (\n req: NextRequest,\n ctx: { validated: ValidatedContext<TBody, TQuery, TParams> }\n ) => Response | Promise<Response>,\n config: ValidationConfig<TBody, TQuery, TParams> & {\n routeParams?: Record<string, string | string[]>\n }\n): RouteHandler {\n const onError = config.onError || ((_, errors) => defaultValidationErrorResponse(errors))\n\n return async (req: NextRequest): Promise<Response> => {\n const result = await validateRequest<TBody, TQuery, TParams>(req, {\n body: config.body as Schema<TBody> | CustomSchema | undefined,\n query: config.query as Schema<TQuery> | CustomSchema | undefined,\n params: config.params as Schema<TParams> | CustomSchema | undefined,\n routeParams: config.routeParams,\n })\n\n if (!result.success) {\n return onError(req, result.errors || [])\n }\n\n return handler(req, { validated: result.data! })\n }\n}\n\n/**\n * XSS Sanitization middleware\n * Sanitizes string values in request body\n */\nexport function withSanitization(\n handler: (\n req: NextRequest,\n ctx: { sanitized: unknown; changes: SanitizationChange[] }\n ) => Response | Promise<Response>,\n config: SanitizationMiddlewareConfig = {}\n): RouteHandler {\n const {\n fields,\n mode = 'escape',\n allowedTags,\n skip,\n onSanitized,\n } = config\n\n return async (req: NextRequest): Promise<Response> => {\n // Check skip condition\n if (skip && await skip(req)) {\n return handler(req, { sanitized: null, changes: [] })\n }\n\n let body: unknown\n try {\n body = await req.json()\n } catch {\n return handler(req, { sanitized: null, changes: [] })\n }\n\n const changes: SanitizationChange[] = []\n\n const sanitized = walkObject(body, (value, path) => {\n // If specific fields are specified, only sanitize those\n if (fields && fields.length > 0) {\n const fieldName = path.split('.').pop() || path\n if (!fields.includes(fieldName)) {\n return value\n }\n }\n\n const cleaned = sanitize(value, { mode, allowedTags })\n\n if (cleaned !== value) {\n changes.push({\n field: path,\n original: value,\n sanitized: cleaned,\n })\n }\n\n return cleaned\n }, '')\n\n // Callback for tracking\n if (onSanitized && changes.length > 0) {\n onSanitized(req, changes)\n }\n\n return handler(req, { sanitized, changes })\n }\n}\n\n/**\n * XSS Detection middleware\n * Blocks requests with potential XSS payloads in body and query parameters\n */\nexport function withXSSProtection(\n handler: RouteHandler,\n config: {\n fields?: string[]\n deep?: boolean\n checkQuery?: boolean\n onDetection?: (req: NextRequest, field: string, value: string) => Response | void | Promise<Response | void>\n } = {}\n): RouteHandler {\n const { fields, onDetection, checkQuery = true } = config\n\n return async (req: NextRequest): Promise<Response> => {\n const detections: { field: string; value: string }[] = []\n\n // Check query parameters for XSS\n if (checkQuery) {\n const url = new URL(req.url)\n for (const [key, value] of url.searchParams.entries()) {\n if (detectXSS(value)) {\n detections.push({ field: `query.${key}`, value })\n }\n }\n }\n\n // Check body\n let body: unknown\n try {\n body = await req.json()\n } catch {\n // No body or invalid JSON, skip body check\n body = null\n }\n\n if (body) {\n walkObject(body, (value, path) => {\n // If specific fields are specified, only check those\n if (fields && fields.length > 0) {\n const fieldName = path.split('.').pop() || path\n if (!fields.includes(fieldName)) {\n return value\n }\n }\n\n if (detectXSS(value)) {\n detections.push({ field: path, value })\n }\n\n return value\n }, '')\n }\n\n if (detections.length > 0) {\n if (onDetection) {\n for (const { field, value } of detections) {\n const result = await onDetection(req, field, value)\n if (result instanceof Response) {\n return result\n }\n }\n }\n\n // Default: block request\n return new Response(\n JSON.stringify({\n error: 'xss_detected',\n message: 'Potentially malicious content detected',\n fields: detections.map(d => d.field),\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n\n return handler(req)\n }\n}\n\n/**\n * SQL Injection Protection middleware\n */\nexport function withSQLProtection(\n handler: RouteHandler,\n config: SQLProtectionConfig = {}\n): RouteHandler {\n const {\n fields,\n deep = true,\n mode = 'block',\n customPatterns,\n allowList = [],\n onDetection,\n } = config\n\n return async (req: NextRequest): Promise<Response> => {\n let body: unknown\n try {\n body = await req.json()\n } catch {\n return handler(req)\n }\n\n const detections = detectSQLInjectionInObject(body, {\n fields,\n deep,\n customPatterns,\n minSeverity: mode === 'detect' ? 'low' : 'medium',\n })\n\n // Filter out allowed values\n const filtered = detections.filter(d => !allowList.includes(d.value))\n\n if (filtered.length > 0) {\n if (onDetection) {\n const result = await onDetection(req, filtered)\n if (result instanceof Response) {\n return result\n }\n }\n\n if (mode === 'block') {\n return new Response(\n JSON.stringify({\n error: 'sql_injection_detected',\n message: 'Potentially malicious SQL detected',\n detections: filtered.map(d => ({\n field: d.field,\n pattern: d.pattern,\n severity: d.severity,\n })),\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n }\n\n return handler(req)\n }\n}\n\n/**\n * Content-Type validation middleware\n */\nexport function withContentType(\n handler: RouteHandler,\n config: ContentTypeConfig\n): RouteHandler {\n const onInvalid = config.onInvalid || ((_, contentType) =>\n defaultContentTypeErrorResponse(contentType, `Content-Type '${contentType}' is not allowed`)\n )\n\n return async (req: NextRequest): Promise<Response> => {\n const result = validateContentType(req, config)\n\n if (!result.valid) {\n return onInvalid(req, result.contentType)\n }\n\n return handler(req)\n }\n}\n\n/**\n * File upload validation middleware\n */\nexport function withFileValidation(\n handler: (\n req: NextRequest,\n ctx: { files: Map<string, FileInfo[]> }\n ) => Response | Promise<Response>,\n config: FileValidationConfig = {}\n): RouteHandler {\n const onInvalid = config.onInvalid || ((_, errors) => defaultFileErrorResponse(errors))\n\n return async (req: NextRequest): Promise<Response> => {\n const result = await validateFilesFromRequest(req, config)\n\n if (!result.valid) {\n return onInvalid(req, result.errors)\n }\n\n return handler(req, { files: result.files })\n }\n}\n\n/**\n * Combined validation middleware\n * Combines schema validation, sanitization, and protection\n */\nexport function withSecureValidation<\n TBody = unknown,\n TQuery = unknown,\n TParams = unknown\n>(\n handler: (\n req: NextRequest,\n ctx: {\n validated: ValidatedContext<TBody, TQuery, TParams>\n files?: Map<string, FileInfo[]>\n }\n ) => Response | Promise<Response>,\n config: {\n schema?: ValidationConfig<TBody, TQuery, TParams>\n routeParams?: Record<string, string | string[]>\n contentType?: ContentTypeConfig\n files?: FileValidationConfig\n sanitize?: SanitizationMiddlewareConfig\n xss?: { enabled: boolean; fields?: string[] }\n sql?: SQLProtectionConfig\n onError?: (req: NextRequest, errors: ValidationError[]) => Response | Promise<Response>\n }\n): RouteHandler {\n return async (req: NextRequest): Promise<Response> => {\n const allErrors: ValidationError[] = []\n\n // 1. Content-Type validation\n if (config.contentType) {\n const ctResult = validateContentType(req, config.contentType)\n if (!ctResult.valid) {\n allErrors.push({\n field: 'Content-Type',\n code: 'invalid_content_type',\n message: ctResult.reason || 'Invalid Content-Type',\n })\n }\n }\n\n // 2. File validation (if multipart)\n let files: Map<string, FileInfo[]> | undefined\n if (config.files) {\n const fileResult = await validateFilesFromRequest(req, config.files)\n if (!fileResult.valid) {\n allErrors.push(...fileResult.errors.map(e => ({\n field: e.field || e.filename,\n code: e.code,\n message: e.message,\n })))\n } else {\n files = fileResult.files\n }\n }\n\n // Early return on content errors\n if (allErrors.length > 0) {\n const onError = config.onError || ((_, errors) => defaultValidationErrorResponse(errors))\n return onError(req, allErrors)\n }\n\n // 3. Schema validation\n let validated: ValidatedContext<TBody, TQuery, TParams> | undefined\n if (config.schema) {\n const schemaResult = await validateRequest<TBody, TQuery, TParams>(req, {\n body: config.schema.body as Schema<TBody> | CustomSchema | undefined,\n query: config.schema.query as Schema<TQuery> | CustomSchema | undefined,\n params: config.schema.params as Schema<TParams> | CustomSchema | undefined,\n routeParams: config.routeParams,\n })\n\n if (!schemaResult.success) {\n allErrors.push(...(schemaResult.errors || []))\n } else {\n validated = schemaResult.data\n }\n } else {\n validated = {\n body: {} as TBody,\n query: {} as TQuery,\n params: {} as TParams,\n }\n }\n\n // 4. SQL injection detection\n if (config.sql && validated?.body) {\n const sqlDetections = detectSQLInjectionInObject(validated.body, {\n fields: config.sql.fields,\n deep: config.sql.deep,\n customPatterns: config.sql.customPatterns,\n })\n\n if (sqlDetections.length > 0 && config.sql.mode !== 'detect') {\n allErrors.push(...sqlDetections.map(d => ({\n field: d.field,\n code: 'sql_injection',\n message: `Potential SQL injection detected: ${d.pattern}`,\n })))\n }\n }\n\n // 5. XSS detection\n if (config.xss?.enabled && validated?.body) {\n walkObject(validated.body, (value, path) => {\n if (config.xss?.fields && config.xss.fields.length > 0) {\n const fieldName = path.split('.').pop() || path\n if (!config.xss.fields.includes(fieldName)) {\n return value\n }\n }\n\n if (detectXSS(value)) {\n allErrors.push({\n field: path,\n code: 'xss_detected',\n message: 'Potentially malicious content detected',\n })\n }\n\n return value\n }, '')\n }\n\n // Return errors\n if (allErrors.length > 0) {\n const onError = config.onError || ((_, errors) => defaultValidationErrorResponse(errors))\n return onError(req, allErrors)\n }\n\n return handler(req, { validated: validated!, files })\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nextjs-secure",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Production-ready security middleware for Next.js 13+ App Router",
|
|
5
5
|
"author": "Alp Eren Gürle",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
"authentication",
|
|
22
22
|
"csrf",
|
|
23
23
|
"xss",
|
|
24
|
+
"validation",
|
|
25
|
+
"sanitization",
|
|
26
|
+
"sql-injection",
|
|
27
|
+
"audit",
|
|
28
|
+
"logging",
|
|
24
29
|
"api"
|
|
25
30
|
],
|
|
26
31
|
"type": "module",
|
|
@@ -77,6 +82,26 @@
|
|
|
77
82
|
"types": "./dist/headers.d.cts",
|
|
78
83
|
"default": "./dist/headers.cjs"
|
|
79
84
|
}
|
|
85
|
+
},
|
|
86
|
+
"./validation": {
|
|
87
|
+
"import": {
|
|
88
|
+
"types": "./dist/validation.d.ts",
|
|
89
|
+
"default": "./dist/validation.js"
|
|
90
|
+
},
|
|
91
|
+
"require": {
|
|
92
|
+
"types": "./dist/validation.d.cts",
|
|
93
|
+
"default": "./dist/validation.cjs"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"./audit": {
|
|
97
|
+
"import": {
|
|
98
|
+
"types": "./dist/audit.d.ts",
|
|
99
|
+
"default": "./dist/audit.js"
|
|
100
|
+
},
|
|
101
|
+
"require": {
|
|
102
|
+
"types": "./dist/audit.d.cts",
|
|
103
|
+
"default": "./dist/audit.cjs"
|
|
104
|
+
}
|
|
80
105
|
}
|
|
81
106
|
},
|
|
82
107
|
"files": [
|