@zudojs/security 0.0.1

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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/body/body.core.d.ts +51 -0
  4. package/dist/body/body.core.d.ts.map +1 -0
  5. package/dist/body/body.core.js +120 -0
  6. package/dist/body/body.core.js.map +1 -0
  7. package/dist/body/index.d.ts +5 -0
  8. package/dist/body/index.d.ts.map +1 -0
  9. package/dist/body/index.js +5 -0
  10. package/dist/body/index.js.map +1 -0
  11. package/dist/cookie/cookie.core.d.ts +58 -0
  12. package/dist/cookie/cookie.core.d.ts.map +1 -0
  13. package/dist/cookie/cookie.core.js +163 -0
  14. package/dist/cookie/cookie.core.js.map +1 -0
  15. package/dist/cookie/index.d.ts +5 -0
  16. package/dist/cookie/index.d.ts.map +1 -0
  17. package/dist/cookie/index.js +5 -0
  18. package/dist/cookie/index.js.map +1 -0
  19. package/dist/cors/cors.core.d.ts +58 -0
  20. package/dist/cors/cors.core.d.ts.map +1 -0
  21. package/dist/cors/cors.core.js +131 -0
  22. package/dist/cors/cors.core.js.map +1 -0
  23. package/dist/cors/cors.namespace.d.ts +15 -0
  24. package/dist/cors/cors.namespace.d.ts.map +1 -0
  25. package/dist/cors/cors.namespace.js +14 -0
  26. package/dist/cors/cors.namespace.js.map +1 -0
  27. package/dist/cors/index.d.ts +6 -0
  28. package/dist/cors/index.d.ts.map +1 -0
  29. package/dist/cors/index.js +5 -0
  30. package/dist/cors/index.js.map +1 -0
  31. package/dist/csrf/csrf.core.d.ts +56 -0
  32. package/dist/csrf/csrf.core.d.ts.map +1 -0
  33. package/dist/csrf/csrf.core.js +149 -0
  34. package/dist/csrf/csrf.core.js.map +1 -0
  35. package/dist/csrf/index.d.ts +5 -0
  36. package/dist/csrf/index.d.ts.map +1 -0
  37. package/dist/csrf/index.js +5 -0
  38. package/dist/csrf/index.js.map +1 -0
  39. package/dist/header/header.core.d.ts +47 -0
  40. package/dist/header/header.core.d.ts.map +1 -0
  41. package/dist/header/header.core.js +158 -0
  42. package/dist/header/header.core.js.map +1 -0
  43. package/dist/header/index.d.ts +5 -0
  44. package/dist/header/index.d.ts.map +1 -0
  45. package/dist/header/index.js +5 -0
  46. package/dist/header/index.js.map +1 -0
  47. package/dist/headers/headers.core.d.ts +48 -0
  48. package/dist/headers/headers.core.d.ts.map +1 -0
  49. package/dist/headers/headers.core.js +124 -0
  50. package/dist/headers/headers.core.js.map +1 -0
  51. package/dist/headers/index.d.ts +6 -0
  52. package/dist/headers/index.d.ts.map +1 -0
  53. package/dist/headers/index.js +6 -0
  54. package/dist/headers/index.js.map +1 -0
  55. package/dist/index.d.ts +44 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +50 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/input/index.d.ts +5 -0
  60. package/dist/input/index.d.ts.map +1 -0
  61. package/dist/input/index.js +5 -0
  62. package/dist/input/index.js.map +1 -0
  63. package/dist/input/input.core.d.ts +73 -0
  64. package/dist/input/input.core.d.ts.map +1 -0
  65. package/dist/input/input.core.js +182 -0
  66. package/dist/input/input.core.js.map +1 -0
  67. package/dist/rateLimit/index.d.ts +5 -0
  68. package/dist/rateLimit/index.d.ts.map +1 -0
  69. package/dist/rateLimit/index.js +5 -0
  70. package/dist/rateLimit/index.js.map +1 -0
  71. package/dist/rateLimit/rateLimit.core.d.ts +51 -0
  72. package/dist/rateLimit/rateLimit.core.d.ts.map +1 -0
  73. package/dist/rateLimit/rateLimit.core.js +175 -0
  74. package/dist/rateLimit/rateLimit.core.js.map +1 -0
  75. package/dist/rateLimit/rateLimit.namespace.d.ts +13 -0
  76. package/dist/rateLimit/rateLimit.namespace.d.ts.map +1 -0
  77. package/dist/rateLimit/rateLimit.namespace.js +13 -0
  78. package/dist/rateLimit/rateLimit.namespace.js.map +1 -0
  79. package/dist/types/index.d.ts +8 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +7 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/types/security.type.d.ts +203 -0
  84. package/dist/types/security.type.d.ts.map +1 -0
  85. package/dist/types/security.type.js +31 -0
  86. package/dist/types/security.type.js.map +1 -0
  87. package/dist/url/index.d.ts +5 -0
  88. package/dist/url/index.d.ts.map +1 -0
  89. package/dist/url/index.js +5 -0
  90. package/dist/url/index.js.map +1 -0
  91. package/dist/url/url.core.d.ts +38 -0
  92. package/dist/url/url.core.d.ts.map +1 -0
  93. package/dist/url/url.core.js +187 -0
  94. package/dist/url/url.core.js.map +1 -0
  95. package/package.json +53 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Zudojs Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # @zudojs/security
2
+
3
+ Security primitives for input validation, header security, CORS, CSRF protection, rate limiting, and security headers.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @zudojs/security
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { createRateLimiter, cors, securityHeaders } from "@zudojs/security";
15
+
16
+ const limiter = createRateLimiter({ windowMs: 60000, max: 100 });
17
+
18
+ app.use(limiter);
19
+ app.use(cors({ origin: "https://example.com" }));
20
+ app.use(securityHeaders());
21
+ ```
22
+
23
+ ## Features
24
+
25
+ - Input validation and sanitization
26
+ - CORS configuration
27
+ - CSRF token generation and validation
28
+ - Rate limiting with sliding window
29
+ - Security headers (CSP, HSTS, X-Frame-Options, etc.)
30
+ - URL normalization and SSRF protection
31
+
32
+ ## Use Cases
33
+
34
+ - Securing HTTP endpoints
35
+ - Preventing injection attacks
36
+ - Rate limiting public APIs
37
+ - Compliance with security headers standards
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @zudojs/security — Body Validation
3
+ *
4
+ * Validates request body size and content type against configurable limits.
5
+ */
6
+ import type { BodyLimitConfig, BodyLimitPresets } from "../types/security.type.js";
7
+ /** Default body limits for common use cases. */
8
+ export declare const DEFAULT_BODY_LIMITS: BodyLimitPresets;
9
+ /**
10
+ * Validates the Content-Length header value.
11
+ *
12
+ * @param contentLength - The Content-Length header value.
13
+ * @returns An error message if invalid, or undefined.
14
+ */
15
+ export declare function validateContentLength(contentLength: string | undefined): string | undefined;
16
+ /**
17
+ * Validates that a body size is within the allowed limit.
18
+ *
19
+ * @param actualSize - The actual body size in bytes.
20
+ * @param maxSize - The maximum allowed size in bytes.
21
+ * @param contentType - Optional content type for context in error messages.
22
+ * @returns An error message if too large, or undefined.
23
+ */
24
+ export declare function validateBodySize(actualSize: number, maxSize?: number, contentType?: string): string | undefined;
25
+ /**
26
+ * Gets the appropriate body limit for a given content type.
27
+ *
28
+ * @param contentType - The Content-Type header value.
29
+ * @param presetLimits - Optional custom preset limits.
30
+ * @returns The maximum body size in bytes.
31
+ */
32
+ export declare function getBodyLimitForContentType(contentType: string | undefined, presetLimits?: Partial<BodyLimitPresets>): number;
33
+ /**
34
+ * Validates a body limit configuration.
35
+ *
36
+ * @param config - The body limit configuration to validate.
37
+ * @returns An error message if invalid, or undefined.
38
+ */
39
+ export declare function validateBodyLimitConfig(config: BodyLimitConfig): string | undefined;
40
+ /**
41
+ * Creates a body size checker function for use in middleware.
42
+ *
43
+ * @param maxSize - The maximum body size in bytes.
44
+ * @param contentType - Optional content type to check against.
45
+ * @returns A function that checks if a size is within limits.
46
+ */
47
+ export declare function createBodySizeChecker(maxSize: number, contentType?: string): (size: number) => {
48
+ allowed: boolean;
49
+ error?: string;
50
+ };
51
+ //# sourceMappingURL=body.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.core.d.ts","sourceRoot":"","sources":["../../src/body/body.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAEnC,gDAAgD;AAChD,eAAO,MAAM,mBAAmB,EAAE,gBASjC,CAAC;AAKF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAoBpB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CASpB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACvC,MAAM,CA8BR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GACtB,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,CAAC,IAAI,EAAE,MAAM,KAAK;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAQxD"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * @zudojs/security — Body Validation
3
+ *
4
+ * Validates request body size and content type against configurable limits.
5
+ */
6
+ /** Default body limits for common use cases. */
7
+ export const DEFAULT_BODY_LIMITS = {
8
+ /** JSON API: 1MB */
9
+ json: 1_048_576,
10
+ /** Authentication endpoints: 256KB */
11
+ auth: 262_144,
12
+ /** File upload: 100MB */
13
+ upload: 104_857_600,
14
+ /** Webhook payloads: 2MB */
15
+ webhook: 2_097_152,
16
+ };
17
+ /** Default maximum body size (1MB). */
18
+ const DEFAULT_MAX_BODY_SIZE = 1_048_576;
19
+ /**
20
+ * Validates the Content-Length header value.
21
+ *
22
+ * @param contentLength - The Content-Length header value.
23
+ * @returns An error message if invalid, or undefined.
24
+ */
25
+ export function validateContentLength(contentLength) {
26
+ if (contentLength === undefined) {
27
+ return undefined; // No Content-Length is fine (chunked transfer)
28
+ }
29
+ const parsed = parseInt(contentLength, 10);
30
+ if (isNaN(parsed)) {
31
+ return `Content-Length is not a valid number: ${contentLength}`;
32
+ }
33
+ if (parsed < 0) {
34
+ return `Content-Length cannot be negative: ${parsed}`;
35
+ }
36
+ if (!Number.isSafeInteger(parsed)) {
37
+ return `Content-Length is not a safe integer: ${contentLength}`;
38
+ }
39
+ return undefined;
40
+ }
41
+ /**
42
+ * Validates that a body size is within the allowed limit.
43
+ *
44
+ * @param actualSize - The actual body size in bytes.
45
+ * @param maxSize - The maximum allowed size in bytes.
46
+ * @param contentType - Optional content type for context in error messages.
47
+ * @returns An error message if too large, or undefined.
48
+ */
49
+ export function validateBodySize(actualSize, maxSize, contentType) {
50
+ const limit = maxSize ?? DEFAULT_MAX_BODY_SIZE;
51
+ if (actualSize > limit) {
52
+ const context = contentType ? ` for ${contentType}` : "";
53
+ return `Body size ${actualSize} bytes exceeds maximum ${limit} bytes${context}`;
54
+ }
55
+ return undefined;
56
+ }
57
+ /**
58
+ * Gets the appropriate body limit for a given content type.
59
+ *
60
+ * @param contentType - The Content-Type header value.
61
+ * @param presetLimits - Optional custom preset limits.
62
+ * @returns The maximum body size in bytes.
63
+ */
64
+ export function getBodyLimitForContentType(contentType, presetLimits) {
65
+ const limits = { ...DEFAULT_BODY_LIMITS, ...presetLimits };
66
+ if (!contentType) {
67
+ return limits.json;
68
+ }
69
+ const type = contentType.toLowerCase();
70
+ if (type.includes("json")) {
71
+ return limits.json;
72
+ }
73
+ if (type.includes("x-www-form-urlencoded") || type.includes("multipart")) {
74
+ // Check if it's likely an auth form
75
+ if (type.includes("login") || type.includes("auth")) {
76
+ return limits.auth;
77
+ }
78
+ return limits.upload;
79
+ }
80
+ if (type.includes("octet-stream")) {
81
+ return limits.upload;
82
+ }
83
+ if (type.includes("xml")) {
84
+ return limits.webhook;
85
+ }
86
+ return limits.json;
87
+ }
88
+ /**
89
+ * Validates a body limit configuration.
90
+ *
91
+ * @param config - The body limit configuration to validate.
92
+ * @returns An error message if invalid, or undefined.
93
+ */
94
+ export function validateBodyLimitConfig(config) {
95
+ if (config.maxSize <= 0) {
96
+ return `Body limit maxSize must be positive, got: ${config.maxSize}`;
97
+ }
98
+ if (config.maxSize > 1_073_741_824) {
99
+ // 1GB
100
+ return `Body limit maxSize ${config.maxSize} exceeds maximum allowed (1GB)`;
101
+ }
102
+ return undefined;
103
+ }
104
+ /**
105
+ * Creates a body size checker function for use in middleware.
106
+ *
107
+ * @param maxSize - The maximum body size in bytes.
108
+ * @param contentType - Optional content type to check against.
109
+ * @returns A function that checks if a size is within limits.
110
+ */
111
+ export function createBodySizeChecker(maxSize, contentType) {
112
+ return (size) => {
113
+ const error = validateBodySize(size, maxSize, contentType);
114
+ return {
115
+ allowed: error === undefined,
116
+ error,
117
+ };
118
+ };
119
+ }
120
+ //# sourceMappingURL=body.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.core.js","sourceRoot":"","sources":["../../src/body/body.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @zudojs/security — Body Validation Barrel
3
+ */
4
+ export { DEFAULT_BODY_LIMITS, validateContentLength, validateBodySize, getBodyLimitForContentType, validateBodyLimitConfig, createBodySizeChecker, } from "./body.core.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/body/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @zudojs/security — Body Validation Barrel
3
+ */
4
+ export { DEFAULT_BODY_LIMITS, validateContentLength, validateBodySize, getBodyLimitForContentType, validateBodyLimitConfig, createBodySizeChecker, } from "./body.core.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/body/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @zudojs/security — Cookie Security
3
+ *
4
+ * Parses, validates, and serializes HTTP cookies with security best practices.
5
+ */
6
+ import type { CookieSecurityConfig, ParsedCookie } from "../types/security.type.js";
7
+ /**
8
+ * Parses a raw cookie header string into individual cookies.
9
+ *
10
+ * @param cookieHeader - The raw Cookie header value.
11
+ * @param config - Optional security configuration.
12
+ * @returns Array of parsed cookies, or error messages.
13
+ */
14
+ export declare function parseCookieHeader(cookieHeader: string, config?: CookieSecurityConfig): {
15
+ cookies: ParsedCookie[];
16
+ errors: string[];
17
+ };
18
+ /**
19
+ * Serializes a parsed cookie into a Set-Cookie header value.
20
+ *
21
+ * @param cookie - The cookie to serialize.
22
+ * @param config - Optional security configuration for defaults.
23
+ * @returns The serialized Set-Cookie header value.
24
+ */
25
+ export declare function serializeCookie(cookie: ParsedCookie, config?: CookieSecurityConfig): string;
26
+ /**
27
+ * Creates a Set-Cookie header value with secure defaults.
28
+ *
29
+ * @param name - Cookie name.
30
+ * @param value - Cookie value.
31
+ * @param options - Optional cookie attributes.
32
+ * @param config - Optional security configuration.
33
+ * @returns The serialized Set-Cookie header value.
34
+ */
35
+ export declare function createSecureCookie(name: string, value: string, options?: Partial<Omit<ParsedCookie, "name" | "value">>, config?: CookieSecurityConfig): string;
36
+ /**
37
+ * Validates a cookie name for safety.
38
+ *
39
+ * @param name - The cookie name to validate.
40
+ * @returns An error message if invalid, or undefined.
41
+ */
42
+ export declare function validateCookieName(name: string): string | undefined;
43
+ /**
44
+ * Validates a cookie value for safety.
45
+ *
46
+ * @param value - The cookie value to validate.
47
+ * @returns An error message if invalid, or undefined.
48
+ */
49
+ export declare function validateCookieValue(value: string): string | undefined;
50
+ /**
51
+ * Strips security-sensitive cookies from a cookie header.
52
+ *
53
+ * @param cookieHeader - The raw Cookie header.
54
+ * @param sensitiveNames - Names of cookies to strip (case-insensitive).
55
+ * @returns The cleaned cookie header.
56
+ */
57
+ export declare function stripSensitiveCookies(cookieHeader: string, sensitiveNames?: readonly string[]): string;
58
+ //# sourceMappingURL=cookie.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.core.d.ts","sourceRoot":"","sources":["../../src/cookie/cookie.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACb,MAAM,2BAA2B,CAAC;AAWnC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,oBAAoB,GAC5B;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAqD/C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,MAAM,CAwCR;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACvD,MAAM,CAAC,EAAE,oBAAoB,GAC5B,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAenE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYrE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,cAAc,GAAE,SAAS,MAAM,EAAwC,GACtE,MAAM,CAaR"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @zudojs/security — Cookie Security
3
+ *
4
+ * Parses, validates, and serializes HTTP cookies with security best practices.
5
+ */
6
+ /** Maximum cookie header size (4KB). */
7
+ const MAX_COOKIE_HEADER_SIZE = 4096;
8
+ /** Maximum number of cookies. */
9
+ const MAX_COOKIE_COUNT = 50;
10
+ /** Maximum individual cookie size. */
11
+ const MAX_COOKIE_SIZE = 1024;
12
+ /**
13
+ * Parses a raw cookie header string into individual cookies.
14
+ *
15
+ * @param cookieHeader - The raw Cookie header value.
16
+ * @param config - Optional security configuration.
17
+ * @returns Array of parsed cookies, or error messages.
18
+ */
19
+ export function parseCookieHeader(cookieHeader, config) {
20
+ const errors = [];
21
+ const maxSize = config?.maxSize ?? MAX_COOKIE_SIZE;
22
+ const maxCount = config?.maxCount ?? MAX_COOKIE_COUNT;
23
+ // Check total header size
24
+ if (Buffer.byteLength(cookieHeader, "utf8") > MAX_COOKIE_HEADER_SIZE) {
25
+ errors.push(`Cookie header size exceeds maximum ${MAX_COOKIE_HEADER_SIZE} bytes`);
26
+ return { cookies: [], errors };
27
+ }
28
+ // Split by semicolons
29
+ const parts = cookieHeader.split(";");
30
+ if (parts.length > maxCount) {
31
+ errors.push(`Too many cookies: ${parts.length} exceeds maximum ${maxCount}`);
32
+ }
33
+ const cookies = [];
34
+ for (let i = 0; i < Math.min(parts.length, maxCount); i++) {
35
+ const part = parts[i]?.trim();
36
+ if (!part)
37
+ continue;
38
+ const eqIndex = part.indexOf("=");
39
+ if (eqIndex === -1) {
40
+ errors.push(`Cookie ${i}: missing equals sign in "${part}"`);
41
+ continue;
42
+ }
43
+ const name = part.slice(0, eqIndex).trim();
44
+ const value = part.slice(eqIndex + 1).trim();
45
+ if (name.length === 0) {
46
+ errors.push(`Cookie ${i}: empty cookie name`);
47
+ continue;
48
+ }
49
+ if (Buffer.byteLength(value, "utf8") > maxSize) {
50
+ errors.push(`Cookie "${name}" value size exceeds maximum ${maxSize} bytes`);
51
+ continue;
52
+ }
53
+ cookies.push({ name, value });
54
+ }
55
+ return { cookies, errors };
56
+ }
57
+ /**
58
+ * Serializes a parsed cookie into a Set-Cookie header value.
59
+ *
60
+ * @param cookie - The cookie to serialize.
61
+ * @param config - Optional security configuration for defaults.
62
+ * @returns The serialized Set-Cookie header value.
63
+ */
64
+ export function serializeCookie(cookie, config) {
65
+ const parts = [`${cookie.name}=${cookie.value}`];
66
+ if (cookie.path) {
67
+ parts.push(`Path=${cookie.path}`);
68
+ }
69
+ if (cookie.domain) {
70
+ parts.push(`Domain=${cookie.domain}`);
71
+ }
72
+ if (cookie.maxAge !== undefined) {
73
+ parts.push(`Max-Age=${cookie.maxAge}`);
74
+ }
75
+ if (cookie.expires) {
76
+ parts.push(`Expires=${cookie.expires.toUTCString()}`);
77
+ }
78
+ // Apply security defaults from config
79
+ const secure = cookie.secure ?? config?.secure ?? true;
80
+ if (secure) {
81
+ parts.push("Secure");
82
+ }
83
+ const httpOnly = cookie.httpOnly ?? config?.httpOnly ?? true;
84
+ if (httpOnly) {
85
+ parts.push("HttpOnly");
86
+ }
87
+ const sameSite = cookie.sameSite ?? config?.sameSite ?? "lax";
88
+ parts.push(`SameSite=${sameSite.charAt(0).toUpperCase() + sameSite.slice(1)}`);
89
+ if (cookie.partitioned) {
90
+ parts.push("Partitioned");
91
+ }
92
+ return parts.join("; ");
93
+ }
94
+ /**
95
+ * Creates a Set-Cookie header value with secure defaults.
96
+ *
97
+ * @param name - Cookie name.
98
+ * @param value - Cookie value.
99
+ * @param options - Optional cookie attributes.
100
+ * @param config - Optional security configuration.
101
+ * @returns The serialized Set-Cookie header value.
102
+ */
103
+ export function createSecureCookie(name, value, options, config) {
104
+ return serializeCookie({ name, value, ...options }, config);
105
+ }
106
+ /**
107
+ * Validates a cookie name for safety.
108
+ *
109
+ * @param name - The cookie name to validate.
110
+ * @returns An error message if invalid, or undefined.
111
+ */
112
+ export function validateCookieName(name) {
113
+ if (name.length === 0) {
114
+ return "Cookie name cannot be empty";
115
+ }
116
+ if (name.length > 256) {
117
+ return `Cookie name exceeds maximum length of 256: ${name.length}`;
118
+ }
119
+ // RFC 6265: cookie name cannot contain certain characters
120
+ if (/[\s,;=]/.test(name)) {
121
+ return `Cookie name contains invalid characters: ${name}`;
122
+ }
123
+ return undefined;
124
+ }
125
+ /**
126
+ * Validates a cookie value for safety.
127
+ *
128
+ * @param value - The cookie value to validate.
129
+ * @returns An error message if invalid, or undefined.
130
+ */
131
+ export function validateCookieValue(value) {
132
+ // Check for semicolons (used as delimiter)
133
+ if (value.includes(";")) {
134
+ return "Cookie value cannot contain semicolons";
135
+ }
136
+ // Check for control characters
137
+ if (/[\x00-\x1F\x7F]/.test(value)) {
138
+ return "Cookie value contains control characters";
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * Strips security-sensitive cookies from a cookie header.
144
+ *
145
+ * @param cookieHeader - The raw Cookie header.
146
+ * @param sensitiveNames - Names of cookies to strip (case-insensitive).
147
+ * @returns The cleaned cookie header.
148
+ */
149
+ export function stripSensitiveCookies(cookieHeader, sensitiveNames = ["session", "token", "auth", "jwt"]) {
150
+ const lowerSensitive = sensitiveNames.map((n) => n.toLowerCase());
151
+ return cookieHeader
152
+ .split(";")
153
+ .map((pair) => pair.trim())
154
+ .filter((pair) => {
155
+ const eqIndex = pair.indexOf("=");
156
+ if (eqIndex === -1)
157
+ return false;
158
+ const name = pair.slice(0, eqIndex).trim().toLowerCase();
159
+ return !lowerSensitive.includes(name);
160
+ })
161
+ .join("; ");
162
+ }
163
+ //# sourceMappingURL=cookie.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.core.js","sourceRoot":"","sources":["../../src/cookie/cookie.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @zudojs/security — Cookie Security Barrel
3
+ */
4
+ export { parseCookieHeader, serializeCookie, createSecureCookie, validateCookieName, validateCookieValue, stripSensitiveCookies, } from "./cookie.core.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cookie/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @zudojs/security — Cookie Security Barrel
3
+ */
4
+ export { parseCookieHeader, serializeCookie, createSecureCookie, validateCookieName, validateCookieValue, stripSensitiveCookies, } from "./cookie.core.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cookie/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @zudojs/security — CORS
3
+ *
4
+ * Validates and generates CORS headers for cross-origin requests.
5
+ */
6
+ import type { CorsConfig } from "../types/security.type.js";
7
+ /**
8
+ * CORS headers that should be set on responses.
9
+ */
10
+ export interface CorsHeaders {
11
+ "Access-Control-Allow-Origin"?: string;
12
+ "Access-Control-Allow-Methods"?: string;
13
+ "Access-Control-Allow-Headers"?: string;
14
+ "Access-Control-Expose-Headers"?: string;
15
+ "Access-Control-Allow-Credentials"?: string;
16
+ "Access-Control-Max-Age"?: string;
17
+ }
18
+ /**
19
+ * Checks if a request origin is allowed.
20
+ *
21
+ * @param origin - The request Origin header value.
22
+ * @param config - CORS configuration.
23
+ * @returns The allowed origin value, or undefined if not allowed.
24
+ */
25
+ export declare function isOriginAllowed(origin: string | undefined, config: CorsConfig): string | undefined;
26
+ /**
27
+ * Generates CORS headers for a preflight request.
28
+ *
29
+ * @param requestOrigin - The request Origin header.
30
+ * @param config - CORS configuration.
31
+ * @returns CORS headers to set on the response.
32
+ */
33
+ export declare function generatePreflightHeaders(requestOrigin: string | undefined, config: CorsConfig): CorsHeaders;
34
+ /**
35
+ * Generates CORS headers for a simple request.
36
+ *
37
+ * @param requestOrigin - The request Origin header.
38
+ * @param config - CORS configuration.
39
+ * @returns CORS headers to set on the response.
40
+ */
41
+ export declare function generateSimpleHeaders(requestOrigin: string | undefined, config: CorsConfig): CorsHeaders;
42
+ /**
43
+ * Validates that a requested method is allowed.
44
+ *
45
+ * @param method - The HTTP method from Access-Control-Request-Method.
46
+ * @param config - CORS configuration.
47
+ * @returns True if the method is allowed.
48
+ */
49
+ export declare function isMethodAllowed(method: string, config: CorsConfig): boolean;
50
+ /**
51
+ * Validates that all requested headers are allowed.
52
+ *
53
+ * @param headers - Headers from Access-Control-Request-Headers.
54
+ * @param config - CORS configuration.
55
+ * @returns An array of disallowed headers, or empty array if all allowed.
56
+ */
57
+ export declare function getDisallowedHeaders(headers: string[], config: CorsConfig): string[];
58
+ //# sourceMappingURL=cors.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.core.d.ts","sourceRoot":"","sources":["../../src/cors/cors.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAc5D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,UAAU,GACjB,MAAM,GAAG,SAAS,CA2CpB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,MAAM,EAAE,UAAU,GACjB,WAAW,CA0Bb;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,MAAM,EAAE,UAAU,GACjB,WAAW,CAkBb;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAG3E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,UAAU,GACjB,MAAM,EAAE,CAQV"}