@arcis/node 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -211
- package/dist/core/index.d.mts +4 -4
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +13 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +13 -2
- package/dist/core/index.mjs.map +1 -1
- package/dist/{headers-DBQedhrb.d.mts → encode-CrQCGlBq.d.mts} +202 -2
- package/dist/{headers-BJq2OA0i.d.ts → encode-jl9sOwmA.d.ts} +202 -2
- package/dist/{index-BvcFpoR3.d.ts → index-BAhgn9V2.d.ts} +96 -2
- package/dist/{index-iCOw8Fcg.d.ts → index-BGNKspqH.d.ts} +1 -1
- package/dist/{index-CslcoZUN.d.mts → index-Cd02z-0j.d.mts} +1 -1
- package/dist/{index-CCcPuTBo.d.mts → index-DgJtWMSj.d.mts} +96 -2
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +647 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +629 -9
- package/dist/index.mjs.map +1 -1
- package/dist/logging/index.d.mts +1 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +12 -1
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/index.mjs +12 -1
- package/dist/logging/index.mjs.map +1 -1
- package/dist/middleware/index.d.mts +2 -2
- package/dist/middleware/index.d.ts +2 -2
- package/dist/middleware/index.js +168 -6
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/index.mjs +165 -7
- package/dist/middleware/index.mjs.map +1 -1
- package/dist/sanitizers/index.d.mts +2 -2
- package/dist/sanitizers/index.d.ts +2 -2
- package/dist/sanitizers/index.js +403 -3
- package/dist/sanitizers/index.js.map +1 -1
- package/dist/sanitizers/index.mjs +388 -4
- package/dist/sanitizers/index.mjs.map +1 -1
- package/dist/stores/index.d.mts +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/index.mjs.map +1 -1
- package/dist/{types-BOdL3ZWo.d.mts → types-BOkx5YJc.d.mts} +17 -2
- package/dist/{types-BOdL3ZWo.d.ts → types-BOkx5YJc.d.ts} +17 -2
- package/dist/validation/index.d.mts +2 -2
- package/dist/validation/index.d.ts +2 -2
- package/dist/validation/index.js +105 -3
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/index.mjs +105 -3
- package/dist/validation/index.mjs.map +1 -1
- package/package.json +114 -114
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as ArcisOptions, o as ArcisMiddlewareStack, A as ArcisFunction, e as RateLimitOptions, h as RateLimiterMiddleware, H as HeaderOptions, E as ErrorHandlerOptions } from './types-
|
|
1
|
+
import { b as ArcisOptions, o as ArcisMiddlewareStack, A as ArcisFunction, e as RateLimitOptions, h as RateLimiterMiddleware, H as HeaderOptions, E as ErrorHandlerOptions } from './types-BOkx5YJc.mjs';
|
|
2
2
|
import { RequestHandler, Request, Response, NextFunction } from 'express';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -435,4 +435,98 @@ declare function detectBot(req: Request): BotDetectionResult;
|
|
|
435
435
|
*/
|
|
436
436
|
declare function botProtection(options?: BotProtectionOptions): RequestHandler;
|
|
437
437
|
|
|
438
|
-
|
|
438
|
+
/**
|
|
439
|
+
* @module @arcis/node/middleware/csrf
|
|
440
|
+
* CSRF (Cross-Site Request Forgery) protection middleware
|
|
441
|
+
*
|
|
442
|
+
* Implements the double-submit cookie pattern:
|
|
443
|
+
* 1. Server sets a CSRF token in a cookie
|
|
444
|
+
* 2. Client must send the same token in a header or form field
|
|
445
|
+
* 3. Middleware rejects requests where cookie token !== header/field token
|
|
446
|
+
*
|
|
447
|
+
* This works because an attacker's cross-origin form submission will include
|
|
448
|
+
* the cookie automatically, but cannot read it (same-origin policy) to set
|
|
449
|
+
* the matching header.
|
|
450
|
+
*/
|
|
451
|
+
|
|
452
|
+
/** CSRF protection configuration */
|
|
453
|
+
interface CsrfOptions {
|
|
454
|
+
/** Cookie name for the CSRF token. Default: '_csrf' */
|
|
455
|
+
cookieName?: string;
|
|
456
|
+
/** Header name to check for the token. Default: 'x-csrf-token' */
|
|
457
|
+
headerName?: string;
|
|
458
|
+
/** Form field name to check for the token. Default: '_csrf' */
|
|
459
|
+
fieldName?: string;
|
|
460
|
+
/** Token byte length (hex-encoded = 2x chars). Default: 32 */
|
|
461
|
+
tokenLength?: number;
|
|
462
|
+
/** HTTP methods to protect. Default: ['POST', 'PUT', 'PATCH', 'DELETE'] */
|
|
463
|
+
protectedMethods?: string[];
|
|
464
|
+
/** Paths to exclude from CSRF checks (e.g., webhook endpoints) */
|
|
465
|
+
excludePaths?: string[];
|
|
466
|
+
/** Cookie options */
|
|
467
|
+
cookie?: {
|
|
468
|
+
/** Cookie path. Default: '/' */
|
|
469
|
+
path?: string;
|
|
470
|
+
/** HttpOnly — set false so client JS can read it for headers. Default: false */
|
|
471
|
+
httpOnly?: boolean;
|
|
472
|
+
/** Secure flag (HTTPS only). Default: true in production */
|
|
473
|
+
secure?: boolean;
|
|
474
|
+
/** SameSite attribute. Default: 'Lax' */
|
|
475
|
+
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
476
|
+
/** Cookie domain */
|
|
477
|
+
domain?: string;
|
|
478
|
+
};
|
|
479
|
+
/** Custom error handler when CSRF validation fails */
|
|
480
|
+
onError?: (req: Request, res: Response, next: NextFunction) => void;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Generate a cryptographically random CSRF token.
|
|
484
|
+
*
|
|
485
|
+
* @param length - Byte length (output is hex, so 2x chars). Default: 32
|
|
486
|
+
* @returns Hex-encoded random token
|
|
487
|
+
*
|
|
488
|
+
* @example
|
|
489
|
+
* const token = generateCsrfToken(); // 64 hex chars
|
|
490
|
+
*/
|
|
491
|
+
declare function generateCsrfToken(length?: number): string;
|
|
492
|
+
/**
|
|
493
|
+
* Validate that two CSRF tokens match using constant-time comparison.
|
|
494
|
+
*
|
|
495
|
+
* @param cookieToken - Token from the cookie
|
|
496
|
+
* @param requestToken - Token from the header or form field
|
|
497
|
+
* @returns true if tokens match
|
|
498
|
+
*/
|
|
499
|
+
declare function validateCsrfToken(cookieToken: string, requestToken: string): boolean;
|
|
500
|
+
/**
|
|
501
|
+
* Create CSRF protection middleware using double-submit cookie pattern.
|
|
502
|
+
*
|
|
503
|
+
* For safe methods (GET, HEAD, OPTIONS), sets a CSRF token cookie if not present.
|
|
504
|
+
* For unsafe methods (POST, PUT, PATCH, DELETE), validates the token.
|
|
505
|
+
*
|
|
506
|
+
* @param options - CSRF configuration
|
|
507
|
+
* @returns Express middleware
|
|
508
|
+
*
|
|
509
|
+
* @example
|
|
510
|
+
* // Basic usage
|
|
511
|
+
* app.use(csrfProtection());
|
|
512
|
+
*
|
|
513
|
+
* @example
|
|
514
|
+
* // Exclude webhook paths
|
|
515
|
+
* app.use(csrfProtection({
|
|
516
|
+
* excludePaths: ['/api/webhooks/stripe', '/api/webhooks/github']
|
|
517
|
+
* }));
|
|
518
|
+
*
|
|
519
|
+
* @example
|
|
520
|
+
* // Client-side: read cookie + set header
|
|
521
|
+
* const token = document.cookie.match(/_csrf=([^;]+)/)?.[1];
|
|
522
|
+
* fetch('/api/data', {
|
|
523
|
+
* method: 'POST',
|
|
524
|
+
* headers: { 'X-CSRF-Token': token },
|
|
525
|
+
* credentials: 'same-origin'
|
|
526
|
+
* });
|
|
527
|
+
*/
|
|
528
|
+
declare function csrfProtection(options?: CsrfOptions): RequestHandler;
|
|
529
|
+
/** Alias for csrfProtection */
|
|
530
|
+
declare const createCsrf: typeof csrfProtection;
|
|
531
|
+
|
|
532
|
+
export { validateCsrfToken as A, type BotCategory as B, type CorsOptions as C, type SecureCookieOptions as S, type TokenBucketMiddleware as T, type BotDetectionResult as a, type BotProtectionOptions as b, type CsrfOptions as c, type SlidingWindowMiddleware as d, type SlidingWindowOptions as e, type TokenBucketOptions as f, arcis as g, arcisWithMethods as h, botProtection as i, createCors as j, createCsrf as k, createErrorHandler as l, createHeaders as m, createRateLimiter as n, createSecureCookies as o, createSlidingWindowLimiter as p, createTokenBucketLimiter as q, csrfProtection as r, detectBot as s, enforceSecureCookie as t, errorHandler as u, generateCsrfToken as v, rateLimit as w, safeCors as x, secureCookieDefaults as y, securityHeaders as z };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, S as SecureCookieOptions,
|
|
2
|
-
export { c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as
|
|
3
|
-
export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-
|
|
1
|
+
export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, c as CsrfOptions, S as SecureCookieOptions, d as SlidingWindowMiddleware, e as SlidingWindowOptions, T as TokenBucketMiddleware, f as TokenBucketOptions, g as arcis, h as arcisFunction, i as botProtection, j as createCors, k as createCsrf, l as createErrorHandler, m as createHeaders, n as createRateLimiter, o as createSecureCookies, p as createSlidingWindowLimiter, q as createTokenBucketLimiter, r as csrfProtection, h as default, s as detectBot, t as enforceSecureCookie, u as errorHandler, v as generateCsrfToken, w as rateLimit, x as safeCors, y as secureCookieDefaults, z as securityHeaders, A as validateCsrfToken } from './index-DgJtWMSj.mjs';
|
|
2
|
+
export { P as PiiMatch, K as PiiRedactOptions, L as PiiScanOptions, M as PiiType, c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as detectJsonpInjection, e as detectNoSqlInjection, f as detectPathTraversal, g as detectPii, h as detectPrototypePollution, i as detectSql, j as detectSsti, k as detectXss, l as detectXxe, m as encodeForAttribute, n as encodeForCss, o as encodeForHtml, p as encodeForJs, q as encodeForUrl, t as isDangerousNoSqlKey, u as isDangerousProtoKey, v as redactObjectPii, w as redactPii, x as sanitizeCommand, y as sanitizeHeaderValue, z as sanitizeHeaders, A as sanitizeJsonpCallback, B as sanitizeObject, C as sanitizePath, D as sanitizeSql, E as sanitizeSsti, F as sanitizeString, G as sanitizeXss, H as sanitizeXxe, I as scanObjectPii, J as scanPii } from './encode-CrQCGlBq.mjs';
|
|
3
|
+
export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-Cd02z-0j.mjs';
|
|
4
4
|
import { IncomingMessage } from 'http';
|
|
5
5
|
export { createRedactor, createSafeLogger, safeLog } from './logging/index.mjs';
|
|
6
6
|
export { MemoryStore, RedisClientLike, RedisStore, RedisStoreOptions, createRedisStore } from './stores/index.mjs';
|
|
7
|
-
export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-
|
|
7
|
+
export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-BOkx5YJc.mjs';
|
|
8
8
|
export { ArcisError, ArcisValidationError, BLOCKED, ERRORS, HEADERS, INPUT, InputTooLargeError, RATE_LIMIT, REDACTION, RateLimitError, SanitizationError, SecurityThreatError, VALIDATION } from './core/index.mjs';
|
|
9
9
|
import 'express';
|
|
10
10
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, S as SecureCookieOptions,
|
|
2
|
-
export { c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as
|
|
3
|
-
export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-
|
|
1
|
+
export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, c as CsrfOptions, S as SecureCookieOptions, d as SlidingWindowMiddleware, e as SlidingWindowOptions, T as TokenBucketMiddleware, f as TokenBucketOptions, g as arcis, h as arcisFunction, i as botProtection, j as createCors, k as createCsrf, l as createErrorHandler, m as createHeaders, n as createRateLimiter, o as createSecureCookies, p as createSlidingWindowLimiter, q as createTokenBucketLimiter, r as csrfProtection, h as default, s as detectBot, t as enforceSecureCookie, u as errorHandler, v as generateCsrfToken, w as rateLimit, x as safeCors, y as secureCookieDefaults, z as securityHeaders, A as validateCsrfToken } from './index-BAhgn9V2.js';
|
|
2
|
+
export { P as PiiMatch, K as PiiRedactOptions, L as PiiScanOptions, M as PiiType, c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as detectJsonpInjection, e as detectNoSqlInjection, f as detectPathTraversal, g as detectPii, h as detectPrototypePollution, i as detectSql, j as detectSsti, k as detectXss, l as detectXxe, m as encodeForAttribute, n as encodeForCss, o as encodeForHtml, p as encodeForJs, q as encodeForUrl, t as isDangerousNoSqlKey, u as isDangerousProtoKey, v as redactObjectPii, w as redactPii, x as sanitizeCommand, y as sanitizeHeaderValue, z as sanitizeHeaders, A as sanitizeJsonpCallback, B as sanitizeObject, C as sanitizePath, D as sanitizeSql, E as sanitizeSsti, F as sanitizeString, G as sanitizeXss, H as sanitizeXxe, I as scanObjectPii, J as scanPii } from './encode-jl9sOwmA.js';
|
|
3
|
+
export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-BGNKspqH.js';
|
|
4
4
|
import { IncomingMessage } from 'http';
|
|
5
5
|
export { createRedactor, createSafeLogger, safeLog } from './logging/index.js';
|
|
6
6
|
export { MemoryStore, RedisClientLike, RedisStore, RedisStoreOptions, createRedisStore } from './stores/index.js';
|
|
7
|
-
export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-
|
|
7
|
+
export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-BOkx5YJc.js';
|
|
8
8
|
export { ArcisError, ArcisValidationError, BLOCKED, ERRORS, HEADERS, INPUT, InputTooLargeError, RATE_LIMIT, REDACTION, RateLimitError, SanitizationError, SecurityThreatError, VALIDATION } from './core/index.js';
|
|
9
9
|
import 'express';
|
|
10
10
|
|