@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.
- package/LICENSE +21 -0
- package/README.md +37 -0
- package/dist/body/body.core.d.ts +51 -0
- package/dist/body/body.core.d.ts.map +1 -0
- package/dist/body/body.core.js +120 -0
- package/dist/body/body.core.js.map +1 -0
- package/dist/body/index.d.ts +5 -0
- package/dist/body/index.d.ts.map +1 -0
- package/dist/body/index.js +5 -0
- package/dist/body/index.js.map +1 -0
- package/dist/cookie/cookie.core.d.ts +58 -0
- package/dist/cookie/cookie.core.d.ts.map +1 -0
- package/dist/cookie/cookie.core.js +163 -0
- package/dist/cookie/cookie.core.js.map +1 -0
- package/dist/cookie/index.d.ts +5 -0
- package/dist/cookie/index.d.ts.map +1 -0
- package/dist/cookie/index.js +5 -0
- package/dist/cookie/index.js.map +1 -0
- package/dist/cors/cors.core.d.ts +58 -0
- package/dist/cors/cors.core.d.ts.map +1 -0
- package/dist/cors/cors.core.js +131 -0
- package/dist/cors/cors.core.js.map +1 -0
- package/dist/cors/cors.namespace.d.ts +15 -0
- package/dist/cors/cors.namespace.d.ts.map +1 -0
- package/dist/cors/cors.namespace.js +14 -0
- package/dist/cors/cors.namespace.js.map +1 -0
- package/dist/cors/index.d.ts +6 -0
- package/dist/cors/index.d.ts.map +1 -0
- package/dist/cors/index.js +5 -0
- package/dist/cors/index.js.map +1 -0
- package/dist/csrf/csrf.core.d.ts +56 -0
- package/dist/csrf/csrf.core.d.ts.map +1 -0
- package/dist/csrf/csrf.core.js +149 -0
- package/dist/csrf/csrf.core.js.map +1 -0
- package/dist/csrf/index.d.ts +5 -0
- package/dist/csrf/index.d.ts.map +1 -0
- package/dist/csrf/index.js +5 -0
- package/dist/csrf/index.js.map +1 -0
- package/dist/header/header.core.d.ts +47 -0
- package/dist/header/header.core.d.ts.map +1 -0
- package/dist/header/header.core.js +158 -0
- package/dist/header/header.core.js.map +1 -0
- package/dist/header/index.d.ts +5 -0
- package/dist/header/index.d.ts.map +1 -0
- package/dist/header/index.js +5 -0
- package/dist/header/index.js.map +1 -0
- package/dist/headers/headers.core.d.ts +48 -0
- package/dist/headers/headers.core.d.ts.map +1 -0
- package/dist/headers/headers.core.js +124 -0
- package/dist/headers/headers.core.js.map +1 -0
- package/dist/headers/index.d.ts +6 -0
- package/dist/headers/index.d.ts.map +1 -0
- package/dist/headers/index.js +6 -0
- package/dist/headers/index.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/input/index.d.ts +5 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +5 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/input.core.d.ts +73 -0
- package/dist/input/input.core.d.ts.map +1 -0
- package/dist/input/input.core.js +182 -0
- package/dist/input/input.core.js.map +1 -0
- package/dist/rateLimit/index.d.ts +5 -0
- package/dist/rateLimit/index.d.ts.map +1 -0
- package/dist/rateLimit/index.js +5 -0
- package/dist/rateLimit/index.js.map +1 -0
- package/dist/rateLimit/rateLimit.core.d.ts +51 -0
- package/dist/rateLimit/rateLimit.core.d.ts.map +1 -0
- package/dist/rateLimit/rateLimit.core.js +175 -0
- package/dist/rateLimit/rateLimit.core.js.map +1 -0
- package/dist/rateLimit/rateLimit.namespace.d.ts +13 -0
- package/dist/rateLimit/rateLimit.namespace.d.ts.map +1 -0
- package/dist/rateLimit/rateLimit.namespace.js +13 -0
- package/dist/rateLimit/rateLimit.namespace.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/security.type.d.ts +203 -0
- package/dist/types/security.type.d.ts.map +1 -0
- package/dist/types/security.type.js +31 -0
- package/dist/types/security.type.js.map +1 -0
- package/dist/url/index.d.ts +5 -0
- package/dist/url/index.d.ts.map +1 -0
- package/dist/url/index.js +5 -0
- package/dist/url/index.js.map +1 -0
- package/dist/url/url.core.d.ts +38 -0
- package/dist/url/url.core.d.ts.map +1 -0
- package/dist/url/url.core.js +187 -0
- package/dist/url/url.core.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/security — URL Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates and normalizes URLs, prevents path traversal attacks,
|
|
5
|
+
* and ensures request targets are safe.
|
|
6
|
+
*/
|
|
7
|
+
/** Default maximum URL length. */
|
|
8
|
+
const DEFAULT_MAX_URL_LENGTH = 2048;
|
|
9
|
+
/** Default allowed protocols. */
|
|
10
|
+
const DEFAULT_ALLOWED_PROTOCOLS = ["http:", "https:"];
|
|
11
|
+
/**
|
|
12
|
+
* Path traversal patterns that indicate directory traversal attacks.
|
|
13
|
+
*/
|
|
14
|
+
const TRAVERSAL_PATTERNS = [
|
|
15
|
+
/\.\./, // Simple ..
|
|
16
|
+
/%2e%2e/i, // URL-encoded ..
|
|
17
|
+
/%252e%252e/i, // Double-encoded ..
|
|
18
|
+
/\.\.%2f/i, // Mixed encoding
|
|
19
|
+
/\.\.%5c/i, // Mixed encoding with backslash
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Null byte patterns.
|
|
23
|
+
*/
|
|
24
|
+
const NULL_BYTE_PATTERNS = [
|
|
25
|
+
/\x00/, // Actual null byte
|
|
26
|
+
/%00/i, // URL-encoded null byte
|
|
27
|
+
/%2500/i, // Double-encoded null byte
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Invalid percent-encoding patterns.
|
|
31
|
+
*/
|
|
32
|
+
const INVALID_PERCENT_ENCODING = /%[^0-9a-fA-F]|%(?:[0-9a-fA-F][^0-9a-fA-F])/;
|
|
33
|
+
/**
|
|
34
|
+
* Validates a URL against security configuration.
|
|
35
|
+
*
|
|
36
|
+
* @param url - The URL string to validate.
|
|
37
|
+
* @param config - Optional validation configuration.
|
|
38
|
+
* @returns Validation result.
|
|
39
|
+
*/
|
|
40
|
+
export function validateUrl(url, config) {
|
|
41
|
+
const errors = [];
|
|
42
|
+
const allowedProtocols = config?.allowedProtocols ?? DEFAULT_ALLOWED_PROTOCOLS;
|
|
43
|
+
const maxLength = config?.maxLength ?? DEFAULT_MAX_URL_LENGTH;
|
|
44
|
+
// Check length
|
|
45
|
+
if (url.length > maxLength) {
|
|
46
|
+
errors.push(`URL length ${url.length} exceeds maximum ${maxLength}`);
|
|
47
|
+
}
|
|
48
|
+
// Check for null bytes
|
|
49
|
+
for (const pattern of NULL_BYTE_PATTERNS) {
|
|
50
|
+
if (pattern.test(url)) {
|
|
51
|
+
errors.push("URL contains null bytes");
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Check for invalid percent encoding
|
|
56
|
+
if (INVALID_PERCENT_ENCODING.test(url)) {
|
|
57
|
+
errors.push("URL contains invalid percent encoding");
|
|
58
|
+
}
|
|
59
|
+
// Try to parse as URL
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = new URL(url);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
errors.push("URL is malformed");
|
|
66
|
+
return { valid: false, errors };
|
|
67
|
+
}
|
|
68
|
+
// Check protocol
|
|
69
|
+
if (!allowedProtocols.includes(parsed.protocol)) {
|
|
70
|
+
errors.push(`Protocol "${parsed.protocol}" is not allowed (allowed: ${allowedProtocols.join(", ")})`);
|
|
71
|
+
}
|
|
72
|
+
// Check for path traversal (check raw URL, not normalized pathname)
|
|
73
|
+
if (config?.blockTraversal !== false) {
|
|
74
|
+
// Extract raw path from URL before normalization
|
|
75
|
+
const rawPath = url.split("?")[0]?.split("#")[0] ?? "";
|
|
76
|
+
for (const pattern of TRAVERSAL_PATTERNS) {
|
|
77
|
+
if (pattern.test(rawPath)) {
|
|
78
|
+
errors.push("URL contains path traversal attempts");
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
valid: errors.length === 0,
|
|
85
|
+
errors,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Normalizes a URL path by resolving . and .. segments.
|
|
90
|
+
*
|
|
91
|
+
* @param pathname - The path to normalize.
|
|
92
|
+
* @returns The normalized path.
|
|
93
|
+
*/
|
|
94
|
+
export function normalizePath(pathname) {
|
|
95
|
+
// Split into segments
|
|
96
|
+
const segments = pathname.split("/");
|
|
97
|
+
const normalized = [];
|
|
98
|
+
for (const segment of segments) {
|
|
99
|
+
if (segment === "." || segment === "") {
|
|
100
|
+
// Skip current directory references and empty segments
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (segment === "..") {
|
|
104
|
+
// Go up one level if possible
|
|
105
|
+
normalized.pop();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
normalized.push(segment);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return "/" + normalized.join("/");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validates a request target (URI path + query).
|
|
115
|
+
*
|
|
116
|
+
* @param target - The request target (e.g., "/users?page=1").
|
|
117
|
+
* @param config - Optional validation configuration.
|
|
118
|
+
* @returns Validation result.
|
|
119
|
+
*/
|
|
120
|
+
export function validateRequestTarget(target, config) {
|
|
121
|
+
const errors = [];
|
|
122
|
+
// Check for null bytes
|
|
123
|
+
for (const pattern of NULL_BYTE_PATTERNS) {
|
|
124
|
+
if (pattern.test(target)) {
|
|
125
|
+
errors.push("Request target contains null bytes");
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Check for path traversal
|
|
130
|
+
if (config?.blockTraversal !== false) {
|
|
131
|
+
for (const pattern of TRAVERSAL_PATTERNS) {
|
|
132
|
+
if (pattern.test(target)) {
|
|
133
|
+
errors.push("Request target contains path traversal attempts");
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Check for control characters (except tab)
|
|
139
|
+
if (/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/.test(target)) {
|
|
140
|
+
errors.push("Request target contains control characters");
|
|
141
|
+
}
|
|
142
|
+
// Normalize if requested
|
|
143
|
+
let normalized;
|
|
144
|
+
if (config?.normalizePaths) {
|
|
145
|
+
const [path, ...queryParts] = target.split("?");
|
|
146
|
+
const query = queryParts.join("?");
|
|
147
|
+
normalized = normalizePath(path ?? "");
|
|
148
|
+
if (query) {
|
|
149
|
+
normalized += "?" + query;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
valid: errors.length === 0,
|
|
154
|
+
normalized,
|
|
155
|
+
errors,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Checks if a URL is safe to follow (not pointing to internal resources).
|
|
160
|
+
*
|
|
161
|
+
* @param url - The URL to check.
|
|
162
|
+
* @returns True if the URL appears safe.
|
|
163
|
+
*/
|
|
164
|
+
export function isSafeUrl(url) {
|
|
165
|
+
try {
|
|
166
|
+
const parsed = new URL(url);
|
|
167
|
+
// Block file:// protocol
|
|
168
|
+
if (parsed.protocol === "file:") {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
// Block internal network ranges (basic check)
|
|
172
|
+
const hostname = parsed.hostname;
|
|
173
|
+
if (hostname === "localhost" ||
|
|
174
|
+
hostname === "127.0.0.1" ||
|
|
175
|
+
hostname === "::1" ||
|
|
176
|
+
hostname.startsWith("192.168.") ||
|
|
177
|
+
hostname.startsWith("10.") ||
|
|
178
|
+
hostname.startsWith("172.")) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=url.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.core.js","sourceRoot":"","sources":["../../src/url/url.core.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zudojs/security",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Security primitives for input validation, header security, CORS, CSRF protection, rate limiting, and security headers.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@zudojs/errors": "0.0.1",
|
|
21
|
+
"@zudojs/constants": "0.0.1"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"typescript": "7.0.2",
|
|
25
|
+
"vitest": "^4.1.11",
|
|
26
|
+
"@types/node": "^26.4.1"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=24.0.0"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"zudojs",
|
|
36
|
+
"security",
|
|
37
|
+
"cors",
|
|
38
|
+
"csrf",
|
|
39
|
+
"rate-limiting"
|
|
40
|
+
],
|
|
41
|
+
"homepage": "https://github.com/oyinlola-tech/zudo#readme",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/oyinlola-tech/zudo"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc -p tsconfig.json",
|
|
48
|
+
"clean": "rm -rf dist",
|
|
49
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest"
|
|
52
|
+
}
|
|
53
|
+
}
|