nextjs-secure 0.6.0 → 0.7.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/bot/user-agent.ts","../src/middleware/bot/honeypot.ts","../src/middleware/bot/behavior.ts","../src/middleware/bot/captcha.ts","../src/middleware/bot/middleware.ts"],"names":["getClientIP","hasBody","getRequestBody"],"mappings":"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","file":"bot.cjs","sourcesContent":["/**\n * User-Agent Analysis for Bot Detection\n * @module nextjs-secure/bot\n */\n\nimport type {\n BotPattern,\n BotCategory,\n BotDetectionResult,\n UserAgentOptions,\n} from './types'\n\n// ============================================================================\n// Known Bot Patterns\n// ============================================================================\n\n/**\n * Comprehensive list of known bot patterns\n */\nexport const KNOWN_BOT_PATTERNS: BotPattern[] = [\n // Search Engines - Generally allowed\n {\n name: 'Googlebot',\n pattern: /Googlebot|Google-InspectionTool|Storebot-Google|GoogleOther/i,\n category: 'search_engine',\n allowed: true,\n description: 'Google search crawler',\n },\n {\n name: 'Bingbot',\n pattern: /bingbot|msnbot|BingPreview/i,\n category: 'search_engine',\n allowed: true,\n description: 'Microsoft Bing crawler',\n },\n {\n name: 'Yahoo Slurp',\n pattern: /Slurp/i,\n category: 'search_engine',\n allowed: true,\n description: 'Yahoo search crawler',\n },\n {\n name: 'DuckDuckBot',\n pattern: /DuckDuckBot|DuckDuckGo-Favicons-Bot/i,\n category: 'search_engine',\n allowed: true,\n description: 'DuckDuckGo crawler',\n },\n {\n name: 'Baiduspider',\n pattern: /Baiduspider/i,\n category: 'search_engine',\n allowed: true,\n description: 'Baidu search crawler',\n },\n {\n name: 'Yandex',\n pattern: /YandexBot|YandexImages|YandexMobileBot/i,\n category: 'search_engine',\n allowed: true,\n description: 'Yandex search crawler',\n },\n {\n name: 'Applebot',\n pattern: /Applebot/i,\n category: 'search_engine',\n allowed: true,\n description: 'Apple search crawler',\n },\n {\n name: 'Sogou',\n pattern: /Sogou/i,\n category: 'search_engine',\n allowed: true,\n description: 'Sogou search crawler',\n },\n {\n name: 'Exabot',\n pattern: /Exabot/i,\n category: 'search_engine',\n allowed: true,\n description: 'Exalead search crawler',\n },\n\n // Social Media - Generally allowed\n {\n name: 'Facebook',\n pattern: /facebookexternalhit|Facebot|facebookcatalog/i,\n category: 'social_media',\n allowed: true,\n description: 'Facebook crawler for link previews',\n },\n {\n name: 'Twitter',\n pattern: /Twitterbot/i,\n category: 'social_media',\n allowed: true,\n description: 'Twitter/X crawler for cards',\n },\n {\n name: 'LinkedIn',\n pattern: /LinkedInBot/i,\n category: 'social_media',\n allowed: true,\n description: 'LinkedIn crawler for previews',\n },\n {\n name: 'Pinterest',\n pattern: /Pinterest|Pinterestbot/i,\n category: 'social_media',\n allowed: true,\n description: 'Pinterest crawler',\n },\n {\n name: 'Slack',\n pattern: /Slackbot/i,\n category: 'social_media',\n allowed: true,\n description: 'Slack link preview bot',\n },\n {\n name: 'Discord',\n pattern: /Discordbot/i,\n category: 'social_media',\n allowed: true,\n description: 'Discord link preview bot',\n },\n {\n name: 'Telegram',\n pattern: /TelegramBot/i,\n category: 'social_media',\n allowed: true,\n description: 'Telegram link preview bot',\n },\n {\n name: 'WhatsApp',\n pattern: /WhatsApp/i,\n category: 'social_media',\n allowed: true,\n description: 'WhatsApp link preview',\n },\n {\n name: 'Snapchat',\n pattern: /Snapchat/i,\n category: 'social_media',\n allowed: true,\n description: 'Snapchat crawler',\n },\n\n // Monitoring - Generally allowed\n {\n name: 'UptimeRobot',\n pattern: /UptimeRobot/i,\n category: 'monitoring',\n allowed: true,\n description: 'UptimeRobot monitoring',\n },\n {\n name: 'Pingdom',\n pattern: /Pingdom/i,\n category: 'monitoring',\n allowed: true,\n description: 'Pingdom monitoring',\n },\n {\n name: 'StatusCake',\n pattern: /StatusCake/i,\n category: 'monitoring',\n allowed: true,\n description: 'StatusCake monitoring',\n },\n {\n name: 'Site24x7',\n pattern: /Site24x7/i,\n category: 'monitoring',\n allowed: true,\n description: 'Site24x7 monitoring',\n },\n {\n name: 'Datadog',\n pattern: /Datadog/i,\n category: 'monitoring',\n allowed: true,\n description: 'Datadog synthetic monitoring',\n },\n {\n name: 'New Relic',\n pattern: /NewRelicPinger/i,\n category: 'monitoring',\n allowed: true,\n description: 'New Relic synthetic monitoring',\n },\n {\n name: 'Checkly',\n pattern: /Checkly/i,\n category: 'monitoring',\n allowed: true,\n description: 'Checkly monitoring',\n },\n\n // SEO Tools - Usually allowed but can be blocked\n {\n name: 'Ahrefs',\n pattern: /AhrefsBot|AhrefsSiteAudit/i,\n category: 'seo',\n allowed: false,\n description: 'Ahrefs SEO crawler',\n },\n {\n name: 'Semrush',\n pattern: /SemrushBot/i,\n category: 'seo',\n allowed: false,\n description: 'Semrush SEO crawler',\n },\n {\n name: 'Moz',\n pattern: /rogerbot|DotBot/i,\n category: 'seo',\n allowed: false,\n description: 'Moz SEO crawler',\n },\n {\n name: 'Majestic',\n pattern: /MJ12bot/i,\n category: 'seo',\n allowed: false,\n description: 'Majestic SEO crawler',\n },\n {\n name: 'Screaming Frog',\n pattern: /Screaming Frog/i,\n category: 'seo',\n allowed: false,\n description: 'Screaming Frog SEO Spider',\n },\n\n // AI Crawlers - Configurable\n {\n name: 'GPTBot',\n pattern: /GPTBot/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'OpenAI GPT training crawler',\n },\n {\n name: 'ChatGPT-User',\n pattern: /ChatGPT-User/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'ChatGPT user browsing',\n },\n {\n name: 'Claude-Web',\n pattern: /Claude-Web|ClaudeBot|anthropic-ai/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'Anthropic Claude crawler',\n },\n {\n name: 'Bytespider',\n pattern: /Bytespider/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'ByteDance AI crawler',\n },\n {\n name: 'CCBot',\n pattern: /CCBot/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'Common Crawl bot',\n },\n {\n name: 'Google-Extended',\n pattern: /Google-Extended/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'Google AI training crawler',\n },\n {\n name: 'Cohere-ai',\n pattern: /cohere-ai/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'Cohere AI crawler',\n },\n {\n name: 'PerplexityBot',\n pattern: /PerplexityBot/i,\n category: 'ai_crawler',\n allowed: false,\n description: 'Perplexity AI crawler',\n },\n\n // Feed Readers - Generally allowed\n {\n name: 'Feedly',\n pattern: /Feedly/i,\n category: 'feed_reader',\n allowed: true,\n description: 'Feedly RSS reader',\n },\n {\n name: 'Feedbin',\n pattern: /Feedbin/i,\n category: 'feed_reader',\n allowed: true,\n description: 'Feedbin RSS reader',\n },\n {\n name: 'NewsBlur',\n pattern: /NewsBlur/i,\n category: 'feed_reader',\n allowed: true,\n description: 'NewsBlur RSS reader',\n },\n\n // Link Previews - Generally allowed\n {\n name: 'Embedly',\n pattern: /Embedly/i,\n category: 'preview',\n allowed: true,\n description: 'Embedly link preview',\n },\n {\n name: 'Iframely',\n pattern: /Iframely/i,\n category: 'preview',\n allowed: true,\n description: 'Iframely link preview',\n },\n\n // Security Scanners - Block by default\n {\n name: 'Nessus',\n pattern: /Nessus/i,\n category: 'security',\n allowed: false,\n description: 'Nessus vulnerability scanner',\n },\n {\n name: 'Nikto',\n pattern: /Nikto/i,\n category: 'security',\n allowed: false,\n description: 'Nikto web scanner',\n },\n {\n name: 'sqlmap',\n pattern: /sqlmap/i,\n category: 'security',\n allowed: false,\n description: 'sqlmap SQL injection tool',\n },\n {\n name: 'WPScan',\n pattern: /WPScan/i,\n category: 'security',\n allowed: false,\n description: 'WordPress vulnerability scanner',\n },\n {\n name: 'Acunetix',\n pattern: /Acunetix/i,\n category: 'security',\n allowed: false,\n description: 'Acunetix vulnerability scanner',\n },\n\n // Known Scrapers - Block\n {\n name: 'Scrapy',\n pattern: /Scrapy/i,\n category: 'scraper',\n allowed: false,\n description: 'Scrapy web scraper',\n },\n {\n name: 'HTTrack',\n pattern: /HTTrack/i,\n category: 'scraper',\n allowed: false,\n description: 'HTTrack website copier',\n },\n {\n name: 'WebCopier',\n pattern: /WebCopier/i,\n category: 'scraper',\n allowed: false,\n description: 'WebCopier tool',\n },\n {\n name: 'SiteSnagger',\n pattern: /SiteSnagger/i,\n category: 'scraper',\n allowed: false,\n description: 'SiteSnagger downloader',\n },\n\n // Spam Bots - Always block\n {\n name: 'Spam Bot',\n pattern: /spam|harvester|extractor|collect/i,\n category: 'spam',\n allowed: false,\n description: 'Generic spam bot pattern',\n },\n {\n name: 'Email Harvester',\n pattern: /email.*harvest|harvest.*email/i,\n category: 'spam',\n allowed: false,\n description: 'Email harvesting bot',\n },\n\n // Malicious - Always block\n {\n name: 'Malicious Generic',\n pattern: /masscan|ZmEu|morfeus|nmap/i,\n category: 'malicious',\n allowed: false,\n description: 'Known malicious tools',\n },\n {\n name: 'Vulnerability Scanner',\n pattern: /havij|w3af|webscarab/i,\n category: 'malicious',\n allowed: false,\n description: 'Vulnerability scanning tools',\n },\n\n // Generic Bot Pattern\n {\n name: 'Generic Bot',\n pattern: /bot|crawl|spider|scrape|fetch/i,\n category: 'unknown',\n allowed: false,\n description: 'Generic bot pattern',\n },\n {\n name: 'HTTP Library',\n pattern: /python-requests|python-urllib|curl|wget|axios|node-fetch|got\\//i,\n category: 'unknown',\n allowed: false,\n description: 'HTTP library user agent',\n },\n]\n\n/**\n * Default allowed bot categories\n */\nexport const DEFAULT_ALLOWED_CATEGORIES: BotCategory[] = [\n 'search_engine',\n 'social_media',\n 'monitoring',\n 'feed_reader',\n 'preview',\n]\n\n/**\n * Default allowed bot names\n */\nexport const DEFAULT_ALLOWED_BOTS: string[] = [\n 'Googlebot',\n 'Bingbot',\n 'Yahoo Slurp',\n 'DuckDuckBot',\n 'Applebot',\n 'Facebook',\n 'Twitter',\n 'LinkedIn',\n 'Slack',\n 'Discord',\n 'UptimeRobot',\n 'Pingdom',\n]\n\n// ============================================================================\n// User-Agent Analyzer\n// ============================================================================\n\n/**\n * Analyze a User-Agent string for bot patterns\n */\nexport function analyzeUserAgent(\n userAgent: string | null,\n options: UserAgentOptions = {}\n): BotDetectionResult {\n const {\n blockAllBots = false,\n allowCategories = DEFAULT_ALLOWED_CATEGORIES,\n allowList = DEFAULT_ALLOWED_BOTS,\n blockList = [],\n customPatterns = [],\n blockEmptyUA = true,\n blockSuspiciousUA = true,\n } = options\n\n // Empty User-Agent check\n if (!userAgent || userAgent.trim() === '') {\n return {\n isBot: blockEmptyUA,\n category: 'unknown',\n confidence: blockEmptyUA ? 0.9 : 0,\n reason: 'Empty User-Agent',\n userAgent: userAgent || '',\n }\n }\n\n // Combine built-in and custom patterns\n const allPatterns = [...customPatterns, ...KNOWN_BOT_PATTERNS]\n\n // First, check if it matches any known bot pattern\n // This takes priority over suspicious UA checks\n let matchedPattern: BotPattern | null = null\n for (const pattern of allPatterns) {\n if (pattern.pattern.test(userAgent)) {\n matchedPattern = pattern\n break\n }\n }\n\n // If no known pattern matched, check for suspicious UA\n if (!matchedPattern && blockSuspiciousUA && isSuspiciousUA(userAgent)) {\n return {\n isBot: true,\n category: 'unknown',\n confidence: 0.8,\n reason: 'Suspicious User-Agent pattern',\n userAgent,\n }\n }\n\n // If no pattern matched at all, it's likely a real browser\n if (!matchedPattern) {\n return {\n isBot: false,\n confidence: 0.1,\n reason: 'No bot pattern matched',\n userAgent,\n }\n }\n\n // We have a matched pattern, apply the rules\n\n // Check if explicitly blocked (highest priority)\n if (blockList.includes(matchedPattern.name)) {\n return {\n isBot: true,\n category: matchedPattern.category,\n name: matchedPattern.name,\n confidence: 0.95,\n reason: `Blocked bot: ${matchedPattern.name}`,\n userAgent,\n }\n }\n\n // Block all bots mode (takes priority over allow lists)\n if (blockAllBots) {\n return {\n isBot: true,\n category: matchedPattern.category,\n name: matchedPattern.name,\n confidence: 0.9,\n reason: `Bot blocked (blockAllBots mode): ${matchedPattern.name}`,\n userAgent,\n }\n }\n\n // Check if explicitly allowed\n if (allowList.includes(matchedPattern.name)) {\n return {\n isBot: true,\n category: matchedPattern.category,\n name: matchedPattern.name,\n confidence: 0.95,\n reason: `Allowed bot: ${matchedPattern.name}`,\n userAgent,\n }\n }\n\n // Check category allowlist\n if (allowCategories.includes(matchedPattern.category)) {\n return {\n isBot: true,\n category: matchedPattern.category,\n name: matchedPattern.name,\n confidence: 0.9,\n reason: `Allowed category: ${matchedPattern.category}`,\n userAgent,\n }\n }\n\n // Pattern's default behavior\n return {\n isBot: true,\n category: matchedPattern.category,\n name: matchedPattern.name,\n confidence: 0.85,\n reason: matchedPattern.allowed\n ? `Allowed bot: ${matchedPattern.name}`\n : `Blocked bot: ${matchedPattern.name}`,\n userAgent,\n }\n}\n\n/**\n * Check if User-Agent appears suspicious\n */\nexport function isSuspiciousUA(userAgent: string): boolean {\n // Too short\n if (userAgent.length < 10) {\n return true\n }\n\n // Only numbers or random characters\n if (/^[0-9a-f]{8,}$/i.test(userAgent)) {\n return true\n }\n\n // Missing typical browser indicators\n const hasBrowserIndicator = /Mozilla|Chrome|Safari|Firefox|Edge|Opera|MSIE|Trident/i.test(userAgent)\n const hasOSIndicator = /Windows|Mac|Linux|Android|iOS|iPhone|iPad/i.test(userAgent)\n\n // If it looks like a browser but missing OS, it's suspicious\n if (hasBrowserIndicator && !hasOSIndicator && userAgent.length < 50) {\n return true\n }\n\n // Very old or fake versions\n if (/Chrome\\/[0-4]\\./i.test(userAgent) || /Firefox\\/[0-3]\\./i.test(userAgent)) {\n return true\n }\n\n return false\n}\n\n/**\n * Check if a specific bot is allowed\n */\nexport function isBotAllowed(\n botName: string,\n options: UserAgentOptions = {}\n): boolean {\n const {\n blockAllBots = false,\n allowCategories = DEFAULT_ALLOWED_CATEGORIES,\n allowList = DEFAULT_ALLOWED_BOTS,\n blockList = [],\n } = options\n\n // Explicitly blocked (highest priority)\n if (blockList.includes(botName)) {\n return false\n }\n\n // Block all mode (takes priority over allow lists)\n if (blockAllBots) {\n return false\n }\n\n // Explicitly allowed\n if (allowList.includes(botName)) {\n return true\n }\n\n // Check category\n const pattern = KNOWN_BOT_PATTERNS.find(p => p.name === botName)\n if (pattern && allowCategories.includes(pattern.category)) {\n return true\n }\n\n // Default to pattern's setting\n return pattern?.allowed ?? false\n}\n\n/**\n * Get all known bot patterns for a category\n */\nexport function getBotsByCategory(category: BotCategory): BotPattern[] {\n return KNOWN_BOT_PATTERNS.filter(p => p.category === category)\n}\n\n/**\n * Create a custom bot pattern\n */\nexport function createBotPattern(\n name: string,\n pattern: RegExp | string,\n category: BotCategory,\n allowed: boolean = false,\n description?: string\n): BotPattern {\n return {\n name,\n pattern: typeof pattern === 'string' ? new RegExp(pattern, 'i') : pattern,\n category,\n allowed,\n description,\n }\n}\n","/**\n * Honeypot Protection for Bot Detection\n * @module nextjs-secure/bot\n */\n\nimport type { NextRequest } from 'next/server'\nimport type { HoneypotOptions, BotDetectionResult } from './types'\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/**\n * Default honeypot field names that look legitimate\n */\nexport const DEFAULT_HONEYPOT_FIELDS = [\n '_hp_email',\n '_hp_name',\n '_hp_website',\n '_hp_phone',\n '_hp_address',\n 'email_confirm',\n 'website_url',\n 'fax_number',\n]\n\n/**\n * Default honeypot options\n */\nexport const DEFAULT_HONEYPOT_OPTIONS: Required<Omit<HoneypotOptions, 'validate'>> & Pick<HoneypotOptions, 'validate'> = {\n fieldName: '_hp_email',\n additionalFields: [],\n checkIn: ['body', 'query'],\n validate: undefined,\n}\n\n// ============================================================================\n// Honeypot Detection\n// ============================================================================\n\n/**\n * Check for honeypot field values in request\n */\nexport async function checkHoneypot(\n req: NextRequest,\n options: HoneypotOptions = {}\n): Promise<BotDetectionResult> {\n const {\n fieldName = DEFAULT_HONEYPOT_OPTIONS.fieldName,\n additionalFields = DEFAULT_HONEYPOT_OPTIONS.additionalFields,\n checkIn = DEFAULT_HONEYPOT_OPTIONS.checkIn,\n validate,\n } = options\n\n const allFields = [fieldName, ...additionalFields]\n const filledFields: string[] = []\n\n // Check query parameters\n if (checkIn.includes('query')) {\n const url = new URL(req.url)\n for (const field of allFields) {\n const value = url.searchParams.get(field)\n if (value !== null && value !== '') {\n filledFields.push(`query:${field}`)\n }\n }\n }\n\n // Check request body (for POST/PUT/PATCH)\n if (checkIn.includes('body') && hasBody(req)) {\n try {\n const body = await getRequestBody(req)\n if (body && typeof body === 'object') {\n for (const field of allFields) {\n const value = (body as Record<string, unknown>)[field]\n if (value !== undefined && value !== null && value !== '') {\n // Custom validation if provided\n if (validate && !validate(value)) {\n continue\n }\n filledFields.push(`body:${field}`)\n }\n }\n }\n } catch {\n // Ignore body parsing errors\n }\n }\n\n // Check headers\n if (checkIn.includes('headers')) {\n for (const field of allFields) {\n const headerName = `x-${field.replace(/_/g, '-')}`\n const value = req.headers.get(headerName)\n if (value !== null && value !== '') {\n filledFields.push(`header:${headerName}`)\n }\n }\n }\n\n // Bot detected if any honeypot field is filled\n if (filledFields.length > 0) {\n return {\n isBot: true,\n category: 'spam',\n confidence: 0.95,\n reason: `Honeypot triggered: ${filledFields.join(', ')}`,\n ip: getClientIP(req),\n }\n }\n\n return {\n isBot: false,\n confidence: 0,\n reason: 'Honeypot check passed',\n }\n}\n\n// ============================================================================\n// Honeypot Middleware\n// ============================================================================\n\n/**\n * Create honeypot middleware\n */\nexport function withHoneypot<T = unknown>(\n handler: (req: NextRequest, ctx: T) => Response | Promise<Response>,\n options: HoneypotOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n return async (req: NextRequest, ctx: T): Promise<Response> => {\n const result = await checkHoneypot(req, options)\n\n if (result.isBot) {\n // Return 403 but make it look like a success to confuse bots\n return new Response(\n JSON.stringify({\n success: false,\n error: 'Request rejected',\n }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n\n return handler(req, ctx)\n }\n}\n\n// ============================================================================\n// Honeypot HTML Generator\n// ============================================================================\n\n/**\n * Generate honeypot field HTML\n * These fields should be hidden with CSS, not display:none\n * Bots often ignore display:none but fill visible fields\n */\nexport function generateHoneypotHTML(options: HoneypotOptions = {}): string {\n const {\n fieldName = DEFAULT_HONEYPOT_OPTIONS.fieldName,\n additionalFields = [],\n } = options\n\n const allFields = [fieldName, ...additionalFields]\n\n const fields = allFields.map(field => {\n // Use various hiding techniques that bots might not detect\n const style = getRandomHidingStyle()\n const labelText = humanizeFieldName(field)\n\n return `\n <div style=\"${style}\" aria-hidden=\"true\" tabindex=\"-1\">\n <label for=\"${field}\">${labelText}</label>\n <input\n type=\"text\"\n id=\"${field}\"\n name=\"${field}\"\n autocomplete=\"off\"\n tabindex=\"-1\"\n />\n </div>`\n }).join('\\n')\n\n return `<!-- Honeypot fields - Do not fill these -->\\n${fields}`\n}\n\n/**\n * Generate CSS for honeypot fields\n */\nexport function generateHoneypotCSS(options: HoneypotOptions = {}): string {\n const {\n fieldName = DEFAULT_HONEYPOT_OPTIONS.fieldName,\n additionalFields = [],\n } = options\n\n const allFields = [fieldName, ...additionalFields]\n const selectors = allFields.map(f => `#${f}`).join(', ')\n\n return `\n/* Honeypot field hiding */\n${selectors} {\n position: absolute !important;\n left: -9999px !important;\n top: -9999px !important;\n opacity: 0 !important;\n height: 0 !important;\n width: 0 !important;\n z-index: -1 !important;\n pointer-events: none !important;\n}\n`.trim()\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if request has a body\n */\nfunction hasBody(req: NextRequest): boolean {\n const method = req.method.toUpperCase()\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)\n}\n\n/**\n * Get request body (cached to avoid consuming stream)\n */\nasync function getRequestBody(req: NextRequest): Promise<unknown> {\n try {\n const contentType = req.headers.get('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const cloned = req.clone()\n return await cloned.json()\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const cloned = req.clone()\n const text = await cloned.text()\n return Object.fromEntries(new URLSearchParams(text))\n }\n\n if (contentType.includes('multipart/form-data')) {\n const cloned = req.clone()\n const formData = await cloned.formData()\n const obj: Record<string, unknown> = {}\n formData.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n }\n\n return null\n } catch {\n return null\n }\n}\n\n/**\n * Get client IP from request\n */\nfunction getClientIP(req: NextRequest): string {\n return (\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n req.headers.get('x-real-ip') ||\n req.headers.get('cf-connecting-ip') ||\n 'unknown'\n )\n}\n\n/**\n * Get random hiding style to make detection harder\n */\nfunction getRandomHidingStyle(): string {\n const styles = [\n 'position: absolute; left: -9999px; top: -9999px;',\n 'position: fixed; left: -100vw; visibility: hidden;',\n 'opacity: 0; height: 0; width: 0; overflow: hidden;',\n 'clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;',\n 'transform: scale(0); position: absolute;',\n ]\n return styles[Math.floor(Math.random() * styles.length)]\n}\n\n/**\n * Convert field name to human-readable label\n */\nfunction humanizeFieldName(field: string): string {\n return field\n .replace(/^_hp_/, '')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase())\n}\n","/**\n * Behavior Analysis for Bot Detection\n * @module nextjs-secure/bot\n */\n\nimport type { NextRequest } from 'next/server'\nimport type {\n BehaviorOptions,\n BehaviorStore,\n BehaviorAnalysisResult,\n RequestRecord,\n BotDetectionResult,\n} from './types'\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/**\n * Default behavior analysis options\n */\nexport const DEFAULT_BEHAVIOR_OPTIONS: Required<Omit<BehaviorOptions, 'store' | 'identifier'>> & Pick<BehaviorOptions, 'store' | 'identifier'> = {\n minRequestInterval: 100,\n maxRequestsPerSecond: 10,\n windowMs: 60000,\n store: undefined,\n identifier: undefined,\n patterns: {\n sequentialAccess: true,\n regularTiming: true,\n missingHeaders: true,\n },\n}\n\n// ============================================================================\n// In-Memory Behavior Store\n// ============================================================================\n\n/**\n * In-memory behavior tracking store with LRU eviction\n */\nexport class MemoryBehaviorStore implements BehaviorStore {\n private records: Map<string, RequestRecord[]> = new Map()\n private maxIdentifiers: number\n private accessOrder: string[] = []\n\n constructor(options: { maxIdentifiers?: number } = {}) {\n this.maxIdentifiers = options.maxIdentifiers || 10000\n }\n\n async record(identifier: string, timestamp: number, path: string): Promise<void> {\n // LRU eviction\n if (!this.records.has(identifier) && this.records.size >= this.maxIdentifiers) {\n const oldest = this.accessOrder.shift()\n if (oldest) {\n this.records.delete(oldest)\n }\n }\n\n // Update access order\n const idx = this.accessOrder.indexOf(identifier)\n if (idx > -1) {\n this.accessOrder.splice(idx, 1)\n }\n this.accessOrder.push(identifier)\n\n // Add record\n const records = this.records.get(identifier) || []\n records.push({ timestamp, path })\n this.records.set(identifier, records)\n }\n\n async getHistory(identifier: string, windowMs: number): Promise<RequestRecord[]> {\n const records = this.records.get(identifier) || []\n const cutoff = Date.now() - windowMs\n\n // Filter and cleanup old records\n const filtered = records.filter(r => r.timestamp > cutoff)\n if (filtered.length !== records.length) {\n this.records.set(identifier, filtered)\n }\n\n return filtered\n }\n\n async cleanup(maxAge: number): Promise<void> {\n const cutoff = Date.now() - maxAge\n\n for (const [identifier, records] of this.records.entries()) {\n const filtered = records.filter(r => r.timestamp > cutoff)\n if (filtered.length === 0) {\n this.records.delete(identifier)\n const idx = this.accessOrder.indexOf(identifier)\n if (idx > -1) {\n this.accessOrder.splice(idx, 1)\n }\n } else {\n this.records.set(identifier, filtered)\n }\n }\n }\n\n /**\n * Get store statistics\n */\n getStats(): { identifiers: number; totalRecords: number } {\n let totalRecords = 0\n for (const records of this.records.values()) {\n totalRecords += records.length\n }\n return {\n identifiers: this.records.size,\n totalRecords,\n }\n }\n\n /**\n * Clear all records\n */\n clear(): void {\n this.records.clear()\n this.accessOrder = []\n }\n}\n\n// ============================================================================\n// Behavior Analysis\n// ============================================================================\n\n/**\n * Analyze request behavior for bot patterns\n */\nexport async function analyzeBehavior(\n req: NextRequest,\n history: RequestRecord[],\n options: BehaviorOptions = {}\n): Promise<BehaviorAnalysisResult> {\n const {\n minRequestInterval = DEFAULT_BEHAVIOR_OPTIONS.minRequestInterval,\n maxRequestsPerSecond = DEFAULT_BEHAVIOR_OPTIONS.maxRequestsPerSecond,\n patterns = DEFAULT_BEHAVIOR_OPTIONS.patterns,\n } = options\n\n const reasons: string[] = []\n let score = 0\n\n const now = Date.now()\n const requestCount = history.length\n\n // Calculate intervals between requests\n const intervals: number[] = []\n for (let i = 1; i < history.length; i++) {\n intervals.push(history[i].timestamp - history[i - 1].timestamp)\n }\n\n // Average interval\n const avgInterval = intervals.length > 0\n ? intervals.reduce((a, b) => a + b, 0) / intervals.length\n : Infinity\n\n // 1. Check request rate\n const oneSecondAgo = now - 1000\n const requestsLastSecond = history.filter(r => r.timestamp > oneSecondAgo).length\n\n if (requestsLastSecond > maxRequestsPerSecond) {\n score += 0.3\n reasons.push(`High request rate: ${requestsLastSecond}/s (max: ${maxRequestsPerSecond})`)\n }\n\n // 2. Check minimum interval\n const hasRapidRequests = intervals.some(i => i < minRequestInterval)\n if (hasRapidRequests) {\n score += 0.25\n reasons.push(`Rapid requests detected: interval < ${minRequestInterval}ms`)\n }\n\n // 3. Check for regular timing (bots often have very consistent intervals)\n if (patterns?.regularTiming && intervals.length >= 5) {\n const variance = calculateVariance(intervals)\n const coefficientOfVariation = Math.sqrt(variance) / avgInterval\n\n // Very low variance indicates automated requests\n if (coefficientOfVariation < 0.1) {\n score += 0.2\n reasons.push('Suspiciously regular request timing')\n }\n }\n\n // 4. Check for sequential URL patterns\n if (patterns?.sequentialAccess && history.length >= 5) {\n const paths = history.map(r => r.path)\n if (isSequentialPattern(paths)) {\n score += 0.15\n reasons.push('Sequential URL access pattern detected')\n }\n }\n\n // 5. Check missing typical browser headers\n if (patterns?.missingHeaders) {\n const missingScore = checkMissingHeaders(req)\n if (missingScore > 0) {\n score += missingScore\n reasons.push('Missing typical browser headers')\n }\n }\n\n // Normalize score to 0-1 range\n score = Math.min(1, score)\n\n return {\n suspicious: score >= 0.5,\n score,\n reasons,\n requestCount,\n avgInterval,\n }\n}\n\n/**\n * Check behavior and return bot detection result\n */\nexport async function checkBehavior(\n req: NextRequest,\n options: BehaviorOptions = {}\n): Promise<BotDetectionResult> {\n const {\n store = new MemoryBehaviorStore(),\n windowMs = DEFAULT_BEHAVIOR_OPTIONS.windowMs,\n identifier: getIdentifier,\n } = options\n\n // Get identifier\n const identifier = getIdentifier\n ? await getIdentifier(req)\n : getClientIP(req)\n\n // Get history\n const history = await store.getHistory(identifier, windowMs)\n\n // Record current request\n const now = Date.now()\n const path = new URL(req.url).pathname\n await store.record(identifier, now, path)\n\n // Analyze behavior (with the new record included)\n const updatedHistory = [...history, { timestamp: now, path }]\n const analysis = await analyzeBehavior(req, updatedHistory, options)\n\n return {\n isBot: analysis.suspicious,\n confidence: analysis.score,\n reason: analysis.reasons.join('; ') || 'Behavior analysis passed',\n ip: identifier,\n }\n}\n\n// ============================================================================\n// Behavior Middleware\n// ============================================================================\n\n/**\n * Global behavior store instance\n */\nlet globalBehaviorStore: MemoryBehaviorStore | undefined\n\n/**\n * Get or create global behavior store\n */\nexport function getGlobalBehaviorStore(): MemoryBehaviorStore {\n if (!globalBehaviorStore) {\n globalBehaviorStore = new MemoryBehaviorStore()\n }\n return globalBehaviorStore\n}\n\n/**\n * Create behavior analysis middleware\n */\nexport function withBehaviorAnalysis<T = unknown>(\n handler: (req: NextRequest, ctx: T) => Response | Promise<Response>,\n options: BehaviorOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n // Use provided store or global store\n const store = options.store || getGlobalBehaviorStore()\n const mergedOptions = { ...options, store }\n\n return async (req: NextRequest, ctx: T): Promise<Response> => {\n const result = await checkBehavior(req, mergedOptions)\n\n if (result.isBot && result.confidence >= 0.5) {\n return new Response(\n JSON.stringify({\n error: 'Too Many Requests',\n message: 'Unusual request pattern detected',\n retryAfter: 60,\n }),\n {\n status: 429,\n headers: {\n 'Content-Type': 'application/json',\n 'Retry-After': '60',\n },\n }\n )\n }\n\n return handler(req, ctx)\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get client IP from request\n */\nfunction getClientIP(req: NextRequest): string {\n return (\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n req.headers.get('x-real-ip') ||\n req.headers.get('cf-connecting-ip') ||\n 'unknown'\n )\n}\n\n/**\n * Calculate variance of numbers\n */\nfunction calculateVariance(numbers: number[]): number {\n if (numbers.length === 0) return 0\n const mean = numbers.reduce((a, b) => a + b, 0) / numbers.length\n const squaredDiffs = numbers.map(n => Math.pow(n - mean, 2))\n return squaredDiffs.reduce((a, b) => a + b, 0) / numbers.length\n}\n\n/**\n * Detect sequential URL patterns\n */\nfunction isSequentialPattern(paths: string[]): boolean {\n // Check for numeric sequences in paths\n const numbers = paths.map(p => {\n const match = p.match(/(\\d+)/)\n return match ? parseInt(match[1], 10) : null\n }).filter((n): n is number => n !== null)\n\n if (numbers.length < 3) return false\n\n // Check if numbers are sequential\n let sequential = 0\n for (let i = 1; i < numbers.length; i++) {\n if (numbers[i] === numbers[i - 1] + 1) {\n sequential++\n }\n }\n\n return sequential >= numbers.length * 0.6\n}\n\n/**\n * Check for missing typical browser headers\n */\nfunction checkMissingHeaders(req: NextRequest): number {\n let score = 0\n\n // Typical browser headers\n const typicalHeaders = [\n 'accept',\n 'accept-language',\n 'accept-encoding',\n ]\n\n for (const header of typicalHeaders) {\n if (!req.headers.get(header)) {\n score += 0.05\n }\n }\n\n // Check for suspicious accept header\n const accept = req.headers.get('accept')\n if (accept && !accept.includes('text/html') && !accept.includes('application/json') && !accept.includes('*/*')) {\n score += 0.05\n }\n\n // Check for missing referer on non-entry pages\n const referer = req.headers.get('referer')\n const path = new URL(req.url).pathname\n if (!referer && path !== '/' && !path.includes('/api/')) {\n score += 0.03\n }\n\n return score\n}\n","/**\n * CAPTCHA Integration for Bot Detection\n * @module nextjs-secure/bot\n *\n * Supports:\n * - Google reCAPTCHA v2 & v3\n * - hCaptcha\n * - Cloudflare Turnstile\n */\n\nimport type { NextRequest } from 'next/server'\nimport type { CaptchaOptions, CaptchaResult, CaptchaProvider, BotDetectionResult } from './types'\n\n// ============================================================================\n// CAPTCHA Verification URLs\n// ============================================================================\n\nconst CAPTCHA_VERIFY_URLS: Record<CaptchaProvider, string> = {\n recaptcha: 'https://www.google.com/recaptcha/api/siteverify',\n hcaptcha: 'https://hcaptcha.com/siteverify',\n turnstile: 'https://challenges.cloudflare.com/turnstile/v0/siteverify',\n}\n\n/**\n * Default token field names per provider\n */\nconst DEFAULT_TOKEN_FIELDS: Record<CaptchaProvider, string> = {\n recaptcha: 'g-recaptcha-response',\n hcaptcha: 'h-captcha-response',\n turnstile: 'cf-turnstile-response',\n}\n\n// ============================================================================\n// CAPTCHA Verification\n// ============================================================================\n\n/**\n * Verify CAPTCHA token with provider\n */\nexport async function verifyCaptcha(\n token: string,\n options: CaptchaOptions\n): Promise<CaptchaResult> {\n const { provider, secretKey, action } = options\n\n const verifyUrl = CAPTCHA_VERIFY_URLS[provider]\n\n // Build form data\n const formData = new URLSearchParams()\n formData.append('secret', secretKey)\n formData.append('response', token)\n\n try {\n const response = await fetch(verifyUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formData.toString(),\n })\n\n if (!response.ok) {\n return {\n success: false,\n errorCodes: [`HTTP ${response.status}`],\n }\n }\n\n const data = await response.json()\n\n // Parse response based on provider\n return parseCaptchaResponse(data, provider, action)\n } catch (error) {\n return {\n success: false,\n errorCodes: ['verification-failed', String(error)],\n }\n }\n}\n\n/**\n * Parse CAPTCHA verification response\n */\nfunction parseCaptchaResponse(\n data: Record<string, unknown>,\n provider: CaptchaProvider,\n expectedAction?: string\n): CaptchaResult {\n switch (provider) {\n case 'recaptcha':\n return parseRecaptchaResponse(data, expectedAction)\n case 'hcaptcha':\n return parseHCaptchaResponse(data)\n case 'turnstile':\n return parseTurnstileResponse(data)\n default:\n return {\n success: false,\n errorCodes: ['unknown-provider'],\n }\n }\n}\n\n/**\n * Parse reCAPTCHA response\n */\nfunction parseRecaptchaResponse(\n data: Record<string, unknown>,\n expectedAction?: string\n): CaptchaResult {\n const result: CaptchaResult = {\n success: data.success === true,\n score: typeof data.score === 'number' ? data.score : undefined,\n action: typeof data.action === 'string' ? data.action : undefined,\n hostname: typeof data.hostname === 'string' ? data.hostname : undefined,\n challengeTs: typeof data.challenge_ts === 'string' ? data.challenge_ts : undefined,\n errorCodes: Array.isArray(data['error-codes']) ? data['error-codes'] as string[] : undefined,\n }\n\n // For reCAPTCHA v3, verify action matches if specified\n if (result.success && expectedAction && result.action !== expectedAction) {\n result.success = false\n result.errorCodes = ['action-mismatch']\n }\n\n return result\n}\n\n/**\n * Parse hCaptcha response\n */\nfunction parseHCaptchaResponse(data: Record<string, unknown>): CaptchaResult {\n return {\n success: data.success === true,\n hostname: typeof data.hostname === 'string' ? data.hostname : undefined,\n challengeTs: typeof data.challenge_ts === 'string' ? data.challenge_ts : undefined,\n errorCodes: Array.isArray(data['error-codes']) ? data['error-codes'] as string[] : undefined,\n }\n}\n\n/**\n * Parse Turnstile response\n */\nfunction parseTurnstileResponse(data: Record<string, unknown>): CaptchaResult {\n return {\n success: data.success === true,\n hostname: typeof data.hostname === 'string' ? data.hostname : undefined,\n challengeTs: typeof data.challenge_ts === 'string' ? data.challenge_ts : undefined,\n action: typeof data.action === 'string' ? data.action : undefined,\n errorCodes: Array.isArray(data['error-codes']) ? data['error-codes'] as string[] : undefined,\n }\n}\n\n// ============================================================================\n// CAPTCHA Token Extraction\n// ============================================================================\n\n/**\n * Extract CAPTCHA token from request\n */\nexport async function extractCaptchaToken(\n req: NextRequest,\n options: CaptchaOptions\n): Promise<string | null> {\n const { provider, tokenField } = options\n const fieldName = tokenField || DEFAULT_TOKEN_FIELDS[provider]\n\n // Try query parameters first\n const url = new URL(req.url)\n const queryToken = url.searchParams.get(fieldName)\n if (queryToken) {\n return queryToken\n }\n\n // Try request body\n if (hasBody(req)) {\n try {\n const body = await getRequestBody(req)\n if (body && typeof body === 'object') {\n const bodyToken = (body as Record<string, unknown>)[fieldName]\n if (typeof bodyToken === 'string') {\n return bodyToken\n }\n }\n } catch {\n // Ignore body parsing errors\n }\n }\n\n // Try headers\n const headerToken = req.headers.get(`x-${fieldName}`)\n if (headerToken) {\n return headerToken\n }\n\n return null\n}\n\n// ============================================================================\n// CAPTCHA Check\n// ============================================================================\n\n/**\n * Check CAPTCHA and return bot detection result\n */\nexport async function checkCaptcha(\n req: NextRequest,\n options: CaptchaOptions\n): Promise<BotDetectionResult> {\n const { threshold = 0.5, skip } = options\n\n // Check skip condition\n if (skip && await skip(req)) {\n return {\n isBot: false,\n confidence: 0,\n reason: 'CAPTCHA check skipped',\n }\n }\n\n // Extract token\n const token = await extractCaptchaToken(req, options)\n\n if (!token) {\n return {\n isBot: true,\n confidence: 0.9,\n reason: 'CAPTCHA token missing',\n ip: getClientIP(req),\n }\n }\n\n // Verify token\n const result = await verifyCaptcha(token, options)\n\n if (!result.success) {\n return {\n isBot: true,\n confidence: 0.95,\n reason: `CAPTCHA verification failed: ${result.errorCodes?.join(', ') || 'unknown'}`,\n ip: getClientIP(req),\n }\n }\n\n // For reCAPTCHA v3, check score threshold\n if (result.score !== undefined && result.score < threshold) {\n return {\n isBot: true,\n confidence: 1 - result.score,\n reason: `CAPTCHA score too low: ${result.score} (threshold: ${threshold})`,\n ip: getClientIP(req),\n }\n }\n\n return {\n isBot: false,\n confidence: result.score !== undefined ? 1 - result.score : 0.1,\n reason: 'CAPTCHA verification passed',\n }\n}\n\n// ============================================================================\n// CAPTCHA Middleware\n// ============================================================================\n\n/**\n * Create CAPTCHA verification middleware\n */\nexport function withCaptcha<T = unknown>(\n handler: (req: NextRequest, ctx: T) => Response | Promise<Response>,\n options: CaptchaOptions\n): (req: NextRequest, ctx: T) => Promise<Response> {\n return async (req: NextRequest, ctx: T): Promise<Response> => {\n const result = await checkCaptcha(req, options)\n\n if (result.isBot) {\n return new Response(\n JSON.stringify({\n error: 'CAPTCHA Required',\n message: result.reason,\n code: 'CAPTCHA_FAILED',\n }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n\n return handler(req, ctx)\n }\n}\n\n// ============================================================================\n// CAPTCHA HTML Generators\n// ============================================================================\n\n/**\n * Generate reCAPTCHA v2 checkbox HTML\n */\nexport function generateRecaptchaV2(siteKey: string, options: {\n theme?: 'light' | 'dark'\n size?: 'normal' | 'compact'\n} = {}): string {\n const { theme = 'light', size = 'normal' } = options\n\n return `\n<script src=\"https://www.google.com/recaptcha/api.js\" async defer></script>\n<div class=\"g-recaptcha\" data-sitekey=\"${siteKey}\" data-theme=\"${theme}\" data-size=\"${size}\"></div>\n`.trim()\n}\n\n/**\n * Generate reCAPTCHA v3 HTML\n */\nexport function generateRecaptchaV3(siteKey: string, action: string = 'submit'): string {\n return `\n<script src=\"https://www.google.com/recaptcha/api.js?render=${siteKey}\"></script>\n<script>\n function getRecaptchaToken() {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(() => {\n grecaptcha.execute('${siteKey}', { action: '${action}' })\n .then(resolve)\n .catch(reject);\n });\n });\n }\n</script>\n`.trim()\n}\n\n/**\n * Generate hCaptcha HTML\n */\nexport function generateHCaptcha(siteKey: string, options: {\n theme?: 'light' | 'dark'\n size?: 'normal' | 'compact'\n} = {}): string {\n const { theme = 'light', size = 'normal' } = options\n\n return `\n<script src=\"https://js.hcaptcha.com/1/api.js\" async defer></script>\n<div class=\"h-captcha\" data-sitekey=\"${siteKey}\" data-theme=\"${theme}\" data-size=\"${size}\"></div>\n`.trim()\n}\n\n/**\n * Generate Cloudflare Turnstile HTML\n */\nexport function generateTurnstile(siteKey: string, options: {\n theme?: 'light' | 'dark' | 'auto'\n size?: 'normal' | 'compact'\n} = {}): string {\n const { theme = 'auto', size = 'normal' } = options\n\n return `\n<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\" async defer></script>\n<div class=\"cf-turnstile\" data-sitekey=\"${siteKey}\" data-theme=\"${theme}\" data-size=\"${size}\"></div>\n`.trim()\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if request has a body\n */\nfunction hasBody(req: NextRequest): boolean {\n const method = req.method.toUpperCase()\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)\n}\n\n/**\n * Get request body\n */\nasync function getRequestBody(req: NextRequest): Promise<unknown> {\n try {\n const contentType = req.headers.get('content-type') || ''\n\n if (contentType.includes('application/json')) {\n const cloned = req.clone()\n return await cloned.json()\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const cloned = req.clone()\n const text = await cloned.text()\n return Object.fromEntries(new URLSearchParams(text))\n }\n\n if (contentType.includes('multipart/form-data')) {\n const cloned = req.clone()\n const formData = await cloned.formData()\n const obj: Record<string, unknown> = {}\n formData.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n }\n\n return null\n } catch {\n return null\n }\n}\n\n/**\n * Get client IP from request\n */\nfunction getClientIP(req: NextRequest): string {\n return (\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n req.headers.get('x-real-ip') ||\n req.headers.get('cf-connecting-ip') ||\n 'unknown'\n )\n}\n","/**\n * Bot Protection Middleware\n * @module nextjs-secure/bot\n *\n * Combined bot detection middleware that integrates:\n * - User-Agent analysis\n * - Honeypot fields\n * - Behavior analysis\n * - CAPTCHA verification\n */\n\nimport type { NextRequest } from 'next/server'\nimport type {\n BotProtectionOptions,\n BotDetectionResult,\n BotContext,\n UserAgentOptions,\n HoneypotOptions,\n BehaviorOptions,\n CaptchaOptions,\n} from './types'\nimport { analyzeUserAgent, DEFAULT_ALLOWED_CATEGORIES, DEFAULT_ALLOWED_BOTS } from './user-agent'\nimport { checkHoneypot } from './honeypot'\nimport { checkBehavior, getGlobalBehaviorStore } from './behavior'\nimport { checkCaptcha } from './captcha'\n\n// ============================================================================\n// Default Bot Response\n// ============================================================================\n\n/**\n * Default response when bot is detected\n */\nfunction defaultBotResponse(result: BotDetectionResult): Response {\n return new Response(\n JSON.stringify({\n error: 'Forbidden',\n message: result.reason || 'Request blocked',\n code: 'BOT_DETECTED',\n category: result.category,\n }),\n {\n status: 403,\n headers: {\n 'Content-Type': 'application/json',\n 'X-Bot-Detection': 'true',\n },\n }\n )\n}\n\n// ============================================================================\n// Combined Bot Detection\n// ============================================================================\n\n/**\n * Run all enabled bot detection checks\n */\nexport async function detectBot(\n req: NextRequest,\n options: BotProtectionOptions = {}\n): Promise<BotDetectionResult> {\n const results: BotDetectionResult[] = []\n\n // 1. User-Agent analysis\n if (options.userAgent !== false) {\n const uaOptions: UserAgentOptions = options.userAgent === true ? {} : (options.userAgent || {})\n const userAgent = req.headers.get('user-agent')\n const uaResult = analyzeUserAgent(userAgent, uaOptions)\n\n // Only add if detected as bot AND not allowed\n if (uaResult.isBot && !isAllowedBot(uaResult, uaOptions)) {\n results.push(uaResult)\n }\n }\n\n // 2. Honeypot check (only for POST/PUT/PATCH)\n if (options.honeypot !== false && hasBody(req)) {\n const hpOptions: HoneypotOptions = options.honeypot === true ? {} : (options.honeypot || {})\n const hpResult = await checkHoneypot(req, hpOptions)\n if (hpResult.isBot) {\n results.push(hpResult)\n }\n }\n\n // 3. Behavior analysis\n if (options.behavior !== false) {\n const behaviorOptions: BehaviorOptions = options.behavior === true ? {} : (options.behavior || {})\n // Use global store if not provided\n if (!behaviorOptions.store) {\n behaviorOptions.store = getGlobalBehaviorStore()\n }\n const behaviorResult = await checkBehavior(req, behaviorOptions)\n if (behaviorResult.isBot) {\n results.push(behaviorResult)\n }\n }\n\n // 4. CAPTCHA verification (only if configured)\n if (options.captcha) {\n const captchaResult = await checkCaptcha(req, options.captcha)\n if (captchaResult.isBot) {\n results.push(captchaResult)\n }\n }\n\n // Combine results\n if (results.length === 0) {\n return {\n isBot: false,\n confidence: 0,\n reason: 'All checks passed',\n ip: getClientIP(req),\n userAgent: req.headers.get('user-agent') || undefined,\n }\n }\n\n // Find highest confidence result\n const highestConfidence = results.reduce((prev, curr) =>\n curr.confidence > prev.confidence ? curr : prev\n )\n\n // Combine all reasons\n const allReasons = results.map(r => r.reason).filter(Boolean).join('; ')\n\n return {\n isBot: true,\n category: highestConfidence.category,\n name: highestConfidence.name,\n confidence: highestConfidence.confidence,\n reason: allReasons,\n ip: getClientIP(req),\n userAgent: req.headers.get('user-agent') || undefined,\n }\n}\n\n/**\n * Check if a detected bot is allowed\n */\nfunction isAllowedBot(result: BotDetectionResult, options: UserAgentOptions): boolean {\n const {\n allowCategories = DEFAULT_ALLOWED_CATEGORIES,\n allowList = DEFAULT_ALLOWED_BOTS,\n blockList = [],\n blockAllBots = false,\n } = options\n\n // Explicitly blocked\n if (result.name && blockList.includes(result.name)) {\n return false\n }\n\n // Block all mode\n if (blockAllBots) {\n return false\n }\n\n // Explicitly allowed by name\n if (result.name && allowList.includes(result.name)) {\n return true\n }\n\n // Allowed by category\n if (result.category && allowCategories.includes(result.category)) {\n return true\n }\n\n return false\n}\n\n// ============================================================================\n// Main Bot Protection Middleware\n// ============================================================================\n\n/**\n * Create bot protection middleware\n *\n * @example\n * ```typescript\n * import { withBotProtection } from 'nextjs-secure/bot'\n *\n * export const POST = withBotProtection(handler, {\n * userAgent: {\n * blockAllBots: false,\n * allowList: ['Googlebot', 'Bingbot'],\n * },\n * honeypot: {\n * fieldName: '_hp_email',\n * },\n * behavior: {\n * maxRequestsPerSecond: 10,\n * },\n * })\n * ```\n */\nexport function withBotProtection<T = unknown>(\n handler: (req: NextRequest, ctx: T & BotContext) => Response | Promise<Response>,\n options: BotProtectionOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n const {\n skip,\n onBot,\n log,\n mode = 'block',\n } = options\n\n return async (req: NextRequest, ctx: T): Promise<Response> => {\n // Check skip condition\n if (skip && await skip(req)) {\n return handler(req, { ...ctx, bot: undefined })\n }\n\n // Run bot detection\n const result = await detectBot(req, options)\n\n // Log if enabled\n if (log) {\n if (typeof log === 'function') {\n log(result)\n } else if (result.isBot) {\n console.log('[Bot Detection]', JSON.stringify(result))\n }\n }\n\n // Handle bot detection\n if (result.isBot) {\n if (mode === 'block') {\n // Custom response handler\n if (onBot) {\n return onBot(req, result)\n }\n return defaultBotResponse(result)\n }\n // Detect mode - continue but add bot info to context\n }\n\n // Add bot info to context and continue\n const extendedCtx: T & BotContext = {\n ...ctx,\n bot: result,\n }\n\n return handler(req, extendedCtx)\n }\n}\n\n// ============================================================================\n// Convenience Middleware Functions\n// ============================================================================\n\n/**\n * User-Agent only bot protection\n */\nexport function withUserAgentProtection<T = unknown>(\n handler: (req: NextRequest, ctx: T & BotContext) => Response | Promise<Response>,\n options: UserAgentOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n return withBotProtection(handler, {\n userAgent: options,\n honeypot: false,\n behavior: false,\n })\n}\n\n/**\n * Honeypot only protection\n */\nexport function withHoneypotProtection<T = unknown>(\n handler: (req: NextRequest, ctx: T & BotContext) => Response | Promise<Response>,\n options: HoneypotOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n return withBotProtection(handler, {\n userAgent: false,\n honeypot: options,\n behavior: false,\n })\n}\n\n/**\n * Behavior analysis only protection\n */\nexport function withBehaviorProtection<T = unknown>(\n handler: (req: NextRequest, ctx: T & BotContext) => Response | Promise<Response>,\n options: BehaviorOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n return withBotProtection(handler, {\n userAgent: false,\n honeypot: false,\n behavior: options,\n })\n}\n\n/**\n * CAPTCHA only protection\n */\nexport function withCaptchaProtection<T = unknown>(\n handler: (req: NextRequest, ctx: T & BotContext) => Response | Promise<Response>,\n options: CaptchaOptions\n): (req: NextRequest, ctx: T) => Promise<Response> {\n return withBotProtection(handler, {\n userAgent: false,\n honeypot: false,\n behavior: false,\n captcha: options,\n })\n}\n\n// ============================================================================\n// Preset Configurations\n// ============================================================================\n\n/**\n * Preset bot protection configurations\n */\nexport const BOT_PROTECTION_PRESETS = {\n /**\n * Relaxed - Only blocks obvious bots\n */\n relaxed: {\n userAgent: {\n blockAllBots: false,\n allowCategories: ['search_engine', 'social_media', 'monitoring', 'feed_reader', 'preview', 'seo'],\n },\n honeypot: false,\n behavior: false,\n } as BotProtectionOptions,\n\n /**\n * Standard - Good balance of protection\n */\n standard: {\n userAgent: {\n blockAllBots: false,\n allowCategories: ['search_engine', 'social_media', 'monitoring'],\n },\n honeypot: true,\n behavior: {\n maxRequestsPerSecond: 10,\n },\n } as BotProtectionOptions,\n\n /**\n * Strict - Maximum protection\n */\n strict: {\n userAgent: {\n blockAllBots: false,\n allowCategories: ['search_engine'],\n blockEmptyUA: true,\n blockSuspiciousUA: true,\n },\n honeypot: {\n additionalFields: ['_hp_name', '_hp_phone'],\n },\n behavior: {\n maxRequestsPerSecond: 5,\n minRequestInterval: 200,\n },\n } as BotProtectionOptions,\n\n /**\n * API - For API endpoints\n */\n api: {\n userAgent: {\n blockAllBots: true,\n blockEmptyUA: true,\n },\n honeypot: false,\n behavior: {\n maxRequestsPerSecond: 20,\n },\n } as BotProtectionOptions,\n} as const\n\n/**\n * Create bot protection with preset\n */\nexport function withBotProtectionPreset<T = unknown>(\n handler: (req: NextRequest, ctx: T & BotContext) => Response | Promise<Response>,\n preset: keyof typeof BOT_PROTECTION_PRESETS,\n overrides: BotProtectionOptions = {}\n): (req: NextRequest, ctx: T) => Promise<Response> {\n const presetOptions = BOT_PROTECTION_PRESETS[preset]\n const mergedOptions = { ...presetOptions, ...overrides }\n return withBotProtection(handler, mergedOptions)\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if request has a body\n */\nfunction hasBody(req: NextRequest): boolean {\n const method = req.method.toUpperCase()\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)\n}\n\n/**\n * Get client IP from request\n */\nfunction getClientIP(req: NextRequest): string {\n return (\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n req.headers.get('x-real-ip') ||\n req.headers.get('cf-connecting-ip') ||\n 'unknown'\n )\n}\n"]}