ai-appshield 1.0.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/LICENSE +21 -0
- package/README.md +222 -0
- package/browser/shield.min.js +19 -0
- package/dist/browser/BotDetector.d.ts +9 -0
- package/dist/browser/BotDetector.d.ts.map +1 -0
- package/dist/browser/BotDetector.js +99 -0
- package/dist/browser/BotDetector.js.map +1 -0
- package/dist/browser/ContentProtector.d.ts +27 -0
- package/dist/browser/ContentProtector.d.ts.map +1 -0
- package/dist/browser/ContentProtector.js +136 -0
- package/dist/browser/ContentProtector.js.map +1 -0
- package/dist/browser/DevToolsGuard.d.ts +16 -0
- package/dist/browser/DevToolsGuard.d.ts.map +1 -0
- package/dist/browser/DevToolsGuard.js +89 -0
- package/dist/browser/DevToolsGuard.js.map +1 -0
- package/dist/browser/Fingerprint.d.ts +30 -0
- package/dist/browser/Fingerprint.d.ts.map +1 -0
- package/dist/browser/Fingerprint.js +143 -0
- package/dist/browser/Fingerprint.js.map +1 -0
- package/dist/browser/Shield.d.ts +35 -0
- package/dist/browser/Shield.d.ts.map +1 -0
- package/dist/browser/Shield.js +177 -0
- package/dist/browser/Shield.js.map +1 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +11 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +269 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +65 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +21 -0
- package/dist/core/config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/server/BotAnalyzer.d.ts +24 -0
- package/dist/server/BotAnalyzer.d.ts.map +1 -0
- package/dist/server/BotAnalyzer.js +124 -0
- package/dist/server/BotAnalyzer.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +28 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +63 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/utils/obfuscate.d.ts +21 -0
- package/dist/utils/obfuscate.d.ts.map +1 -0
- package/dist/utils/obfuscate.js +59 -0
- package/dist/utils/obfuscate.js.map +1 -0
- package/dist/utils/signatures.d.ts +13 -0
- package/dist/utils/signatures.d.ts.map +1 -0
- package/dist/utils/signatures.js +87 -0
- package/dist/utils/signatures.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DevToolsGuard = void 0;
|
|
4
|
+
class DevToolsGuard {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.intervalId = null;
|
|
7
|
+
this.options = {
|
|
8
|
+
checkInterval: options.checkInterval ?? 1000,
|
|
9
|
+
threshold: options.threshold ?? 160,
|
|
10
|
+
onDetected: options.onDetected ?? (() => { }),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
start() {
|
|
14
|
+
if (typeof window === 'undefined')
|
|
15
|
+
return;
|
|
16
|
+
// Method 1: Window size differential
|
|
17
|
+
this.intervalId = setInterval(() => {
|
|
18
|
+
const widthDiff = window.outerWidth - window.innerWidth;
|
|
19
|
+
const heightDiff = window.outerHeight - window.innerHeight;
|
|
20
|
+
if (widthDiff > this.options.threshold || heightDiff > this.options.threshold) {
|
|
21
|
+
this.options.onDetected({
|
|
22
|
+
type: 'devtools_open',
|
|
23
|
+
severity: 'high',
|
|
24
|
+
message: 'Developer tools detected via window size differential',
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
metadata: { widthDiff, heightDiff },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}, this.options.checkInterval);
|
|
30
|
+
// Method 2: Debugger timing trap
|
|
31
|
+
this.setupDebuggerTrap();
|
|
32
|
+
// Method 3: Console detection via toString override
|
|
33
|
+
this.setupConsoleDetection();
|
|
34
|
+
}
|
|
35
|
+
stop() {
|
|
36
|
+
if (this.intervalId) {
|
|
37
|
+
clearInterval(this.intervalId);
|
|
38
|
+
this.intervalId = null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
setupDebuggerTrap() {
|
|
42
|
+
if (typeof window === 'undefined')
|
|
43
|
+
return;
|
|
44
|
+
setInterval(() => {
|
|
45
|
+
const start = performance.now();
|
|
46
|
+
// eslint-disable-next-line no-debugger
|
|
47
|
+
const fn = new Function('debugger');
|
|
48
|
+
try {
|
|
49
|
+
fn();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// ignore
|
|
53
|
+
}
|
|
54
|
+
const elapsed = performance.now() - start;
|
|
55
|
+
if (elapsed > 100) {
|
|
56
|
+
this.options.onDetected({
|
|
57
|
+
type: 'devtools_open',
|
|
58
|
+
severity: 'high',
|
|
59
|
+
message: 'Developer tools detected via debugger timing',
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
metadata: { elapsed },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}, 3000);
|
|
65
|
+
}
|
|
66
|
+
setupConsoleDetection() {
|
|
67
|
+
if (typeof window === 'undefined')
|
|
68
|
+
return;
|
|
69
|
+
const element = new Image();
|
|
70
|
+
Object.defineProperty(element, 'id', {
|
|
71
|
+
get: () => {
|
|
72
|
+
this.options.onDetected({
|
|
73
|
+
type: 'devtools_open',
|
|
74
|
+
severity: 'medium',
|
|
75
|
+
message: 'Developer tools detected via console inspection',
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
});
|
|
78
|
+
return '';
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
// Periodically log the trap element
|
|
82
|
+
setInterval(() => {
|
|
83
|
+
// Trigger getter if devtools console is open
|
|
84
|
+
void element.id;
|
|
85
|
+
}, 2000);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.DevToolsGuard = DevToolsGuard;
|
|
89
|
+
//# sourceMappingURL=DevToolsGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevToolsGuard.js","sourceRoot":"","sources":["../../src/browser/DevToolsGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ThreatEvent } from '../core/config';
|
|
2
|
+
export interface FingerprintData {
|
|
3
|
+
hash: string;
|
|
4
|
+
userAgent: string;
|
|
5
|
+
language: string;
|
|
6
|
+
platform: string;
|
|
7
|
+
screenResolution: string;
|
|
8
|
+
timezone: string;
|
|
9
|
+
colorDepth: number;
|
|
10
|
+
hardwareConcurrency: number;
|
|
11
|
+
canvas: string;
|
|
12
|
+
webgl: string;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function collectFingerprint(): FingerprintData;
|
|
16
|
+
export interface HoneypotOptions {
|
|
17
|
+
containerSelector?: string;
|
|
18
|
+
onTriggered?: (event: ThreatEvent) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare class Honeypot {
|
|
21
|
+
private fieldName;
|
|
22
|
+
private options;
|
|
23
|
+
constructor(options?: HoneypotOptions);
|
|
24
|
+
/** Inject a hidden honeypot field into the page */
|
|
25
|
+
inject(): string;
|
|
26
|
+
/** Validate form submission — returns true if honeypot was triggered (bot) */
|
|
27
|
+
validate(formData: FormData | Record<string, string>): boolean;
|
|
28
|
+
getFieldName(): string;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=Fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Fingerprint.d.ts","sourceRoot":"","sources":["../../src/browser/Fingerprint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CA+BpD;AA0CD,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,GAAE,eAAoB;IAQzC,mDAAmD;IACnD,MAAM,IAAI,MAAM;IAyChB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAmB9D,YAAY,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Honeypot = void 0;
|
|
4
|
+
exports.collectFingerprint = collectFingerprint;
|
|
5
|
+
const obfuscate_1 = require("../utils/obfuscate");
|
|
6
|
+
const obfuscate_2 = require("../utils/obfuscate");
|
|
7
|
+
function collectFingerprint() {
|
|
8
|
+
const nav = typeof navigator !== 'undefined' ? navigator : {};
|
|
9
|
+
const screen = typeof globalThis.screen !== 'undefined' ? globalThis.screen : {};
|
|
10
|
+
const components = [
|
|
11
|
+
nav.userAgent ?? '',
|
|
12
|
+
nav.language ?? '',
|
|
13
|
+
nav.platform ?? '',
|
|
14
|
+
`${screen.width ?? 0}x${screen.height ?? 0}`,
|
|
15
|
+
Intl.DateTimeFormat().resolvedOptions().timeZone ?? '',
|
|
16
|
+
String(screen.colorDepth ?? 0),
|
|
17
|
+
String(nav.hardwareConcurrency ?? 0),
|
|
18
|
+
getCanvasFingerprint(),
|
|
19
|
+
getWebGLFingerprint(),
|
|
20
|
+
];
|
|
21
|
+
const raw = components.join('|');
|
|
22
|
+
return {
|
|
23
|
+
hash: (0, obfuscate_1.simpleHash)(raw),
|
|
24
|
+
userAgent: nav.userAgent ?? '',
|
|
25
|
+
language: nav.language ?? '',
|
|
26
|
+
platform: nav.platform ?? '',
|
|
27
|
+
screenResolution: `${screen.width ?? 0}x${screen.height ?? 0}`,
|
|
28
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone ?? '',
|
|
29
|
+
colorDepth: screen.colorDepth ?? 0,
|
|
30
|
+
hardwareConcurrency: nav.hardwareConcurrency ?? 0,
|
|
31
|
+
canvas: getCanvasFingerprint(),
|
|
32
|
+
webgl: getWebGLFingerprint(),
|
|
33
|
+
timestamp: Date.now(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getCanvasFingerprint() {
|
|
37
|
+
if (typeof document === 'undefined')
|
|
38
|
+
return '';
|
|
39
|
+
try {
|
|
40
|
+
const canvas = document.createElement('canvas');
|
|
41
|
+
const ctx = canvas.getContext('2d');
|
|
42
|
+
if (!ctx)
|
|
43
|
+
return '';
|
|
44
|
+
ctx.textBaseline = 'top';
|
|
45
|
+
ctx.font = '14px Arial';
|
|
46
|
+
ctx.fillStyle = '#f60';
|
|
47
|
+
ctx.fillRect(125, 1, 62, 20);
|
|
48
|
+
ctx.fillStyle = '#069';
|
|
49
|
+
ctx.fillText('ai-appshield', 2, 15);
|
|
50
|
+
ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';
|
|
51
|
+
ctx.fillText('fingerprint', 4, 17);
|
|
52
|
+
return (0, obfuscate_1.simpleHash)(canvas.toDataURL());
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getWebGLFingerprint() {
|
|
59
|
+
if (typeof document === 'undefined')
|
|
60
|
+
return '';
|
|
61
|
+
try {
|
|
62
|
+
const canvas = document.createElement('canvas');
|
|
63
|
+
const gl = canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl');
|
|
64
|
+
if (!gl || !(gl instanceof WebGLRenderingContext))
|
|
65
|
+
return '';
|
|
66
|
+
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
|
|
67
|
+
if (!debugInfo)
|
|
68
|
+
return '';
|
|
69
|
+
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
|
|
70
|
+
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
|
71
|
+
return (0, obfuscate_1.simpleHash)(`${vendor}|${renderer}`);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
class Honeypot {
|
|
78
|
+
constructor(options = {}) {
|
|
79
|
+
this.fieldName = (0, obfuscate_2.generateHoneypotName)();
|
|
80
|
+
this.options = {
|
|
81
|
+
containerSelector: options.containerSelector ?? 'body',
|
|
82
|
+
onTriggered: options.onTriggered ?? (() => { }),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Inject a hidden honeypot field into the page */
|
|
86
|
+
inject() {
|
|
87
|
+
if (typeof document === 'undefined')
|
|
88
|
+
return this.fieldName;
|
|
89
|
+
const container = document.querySelector(this.options.containerSelector) ?? document.body;
|
|
90
|
+
const input = document.createElement('input');
|
|
91
|
+
input.type = 'text';
|
|
92
|
+
input.name = this.fieldName;
|
|
93
|
+
input.id = this.fieldName;
|
|
94
|
+
input.setAttribute('autocomplete', 'off');
|
|
95
|
+
input.setAttribute('tabindex', '-1');
|
|
96
|
+
input.setAttribute('aria-hidden', 'true');
|
|
97
|
+
input.style.cssText =
|
|
98
|
+
'position:absolute;left:-9999px;top:-9999px;opacity:0;height:0;width:0;z-index:-1;pointer-events:none;';
|
|
99
|
+
// Also add a hidden link trap for scrapers
|
|
100
|
+
const link = document.createElement('a');
|
|
101
|
+
link.href = '/api/internal-data-export';
|
|
102
|
+
link.textContent = 'Admin Data Export';
|
|
103
|
+
link.style.cssText = 'position:absolute;left:-9999px;opacity:0;font-size:0;';
|
|
104
|
+
link.setAttribute('data-honeypot', 'true');
|
|
105
|
+
container.appendChild(input);
|
|
106
|
+
container.appendChild(link);
|
|
107
|
+
// Monitor if honeypot gets filled (bot behavior)
|
|
108
|
+
input.addEventListener('input', () => {
|
|
109
|
+
if (input.value.length > 0) {
|
|
110
|
+
this.options.onTriggered({
|
|
111
|
+
type: 'honeypot_triggered',
|
|
112
|
+
severity: 'critical',
|
|
113
|
+
message: `Honeypot field "${this.fieldName}" was filled`,
|
|
114
|
+
timestamp: Date.now(),
|
|
115
|
+
metadata: { fieldName: this.fieldName, value: input.value },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return this.fieldName;
|
|
120
|
+
}
|
|
121
|
+
/** Validate form submission — returns true if honeypot was triggered (bot) */
|
|
122
|
+
validate(formData) {
|
|
123
|
+
const value = formData instanceof FormData
|
|
124
|
+
? formData.get(this.fieldName)
|
|
125
|
+
: formData[this.fieldName];
|
|
126
|
+
if (value && String(value).length > 0) {
|
|
127
|
+
this.options.onTriggered({
|
|
128
|
+
type: 'honeypot_triggered',
|
|
129
|
+
severity: 'critical',
|
|
130
|
+
message: `Honeypot triggered on validation`,
|
|
131
|
+
timestamp: Date.now(),
|
|
132
|
+
metadata: { fieldName: this.fieldName },
|
|
133
|
+
});
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
getFieldName() {
|
|
139
|
+
return this.fieldName;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.Honeypot = Honeypot;
|
|
143
|
+
//# sourceMappingURL=Fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Fingerprint.js","sourceRoot":"","sources":["../../src/browser/Fingerprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ShieldConfig, type ThreatEvent } from '../core/config';
|
|
2
|
+
export declare class Shield {
|
|
3
|
+
private config;
|
|
4
|
+
private devToolsGuard;
|
|
5
|
+
private contentProtector;
|
|
6
|
+
private honeypot;
|
|
7
|
+
private active;
|
|
8
|
+
private threats;
|
|
9
|
+
constructor(config?: ShieldConfig);
|
|
10
|
+
/** Initialize all enabled protection layers */
|
|
11
|
+
activate(): this;
|
|
12
|
+
/** Tear down all protection layers */
|
|
13
|
+
deactivate(): this;
|
|
14
|
+
/** Get collected threat events */
|
|
15
|
+
getThreats(): ThreatEvent[];
|
|
16
|
+
/** Get current browser fingerprint */
|
|
17
|
+
getFingerprint(): import("./Fingerprint").FingerprintData;
|
|
18
|
+
/** Get honeypot field name (for form integration) */
|
|
19
|
+
getHoneypotFieldName(): string | null;
|
|
20
|
+
/** Manually run bot detection check */
|
|
21
|
+
checkBot(): import("./BotDetector").BotDetectionResult;
|
|
22
|
+
private runBotDetection;
|
|
23
|
+
private handleThreat;
|
|
24
|
+
private blockPage;
|
|
25
|
+
private reportThreat;
|
|
26
|
+
private sendFingerprint;
|
|
27
|
+
private log;
|
|
28
|
+
}
|
|
29
|
+
/** Quick-start: create and activate shield with one call */
|
|
30
|
+
export declare function protect(config?: ShieldConfig): Shield;
|
|
31
|
+
export { detectBot, createBotThreatEvent } from './BotDetector';
|
|
32
|
+
export { DevToolsGuard } from './DevToolsGuard';
|
|
33
|
+
export { ContentProtector } from './ContentProtector';
|
|
34
|
+
export { Honeypot, collectFingerprint } from './Fingerprint';
|
|
35
|
+
//# sourceMappingURL=Shield.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Shield.d.ts","sourceRoot":"","sources":["../../src/browser/Shield.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAqB;gBAExB,MAAM,GAAE,YAAiB;IAIrC,+CAA+C;IAC/C,QAAQ,IAAI,IAAI;IA6ChB,sCAAsC;IACtC,UAAU,IAAI,IAAI;IAQlB,kCAAkC;IAClC,UAAU,IAAI,WAAW,EAAE;IAI3B,sCAAsC;IACtC,cAAc;IAId,qDAAqD;IACrD,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAIrC,uCAAuC;IACvC,QAAQ;IAIR,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;IAyBpB,OAAO,CAAC,SAAS;YAQH,YAAY;YAYZ,eAAe;IAkB7B,OAAO,CAAC,GAAG;CAKZ;AAED,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAIrD;AAED,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectFingerprint = exports.Honeypot = exports.ContentProtector = exports.DevToolsGuard = exports.createBotThreatEvent = exports.detectBot = exports.Shield = void 0;
|
|
4
|
+
exports.protect = protect;
|
|
5
|
+
const config_1 = require("../core/config");
|
|
6
|
+
const BotDetector_1 = require("./BotDetector");
|
|
7
|
+
const DevToolsGuard_1 = require("./DevToolsGuard");
|
|
8
|
+
const ContentProtector_1 = require("./ContentProtector");
|
|
9
|
+
const Fingerprint_1 = require("./Fingerprint");
|
|
10
|
+
class Shield {
|
|
11
|
+
constructor(config = {}) {
|
|
12
|
+
this.devToolsGuard = null;
|
|
13
|
+
this.contentProtector = null;
|
|
14
|
+
this.honeypot = null;
|
|
15
|
+
this.active = false;
|
|
16
|
+
this.threats = [];
|
|
17
|
+
this.config = { ...config_1.DEFAULT_SHIELD_CONFIG, ...config };
|
|
18
|
+
}
|
|
19
|
+
/** Initialize all enabled protection layers */
|
|
20
|
+
activate() {
|
|
21
|
+
if (this.active)
|
|
22
|
+
return this;
|
|
23
|
+
if (typeof window === 'undefined') {
|
|
24
|
+
console.warn('[ai-appshield] Browser environment required for client-side protection');
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
this.active = true;
|
|
28
|
+
this.log('Activating ai-appshield protection...');
|
|
29
|
+
if (this.config.botDetection) {
|
|
30
|
+
this.runBotDetection();
|
|
31
|
+
}
|
|
32
|
+
if (this.config.devToolsGuard) {
|
|
33
|
+
this.devToolsGuard = new DevToolsGuard_1.DevToolsGuard({
|
|
34
|
+
onDetected: (event) => this.handleThreat(event),
|
|
35
|
+
});
|
|
36
|
+
this.devToolsGuard.start();
|
|
37
|
+
}
|
|
38
|
+
if (this.config.contentProtection || this.config.obfuscateContent) {
|
|
39
|
+
this.contentProtector = new ContentProtector_1.ContentProtector({
|
|
40
|
+
selector: this.config.protectSelector,
|
|
41
|
+
obfuscateElements: this.config.obfuscateContent,
|
|
42
|
+
onScrapeAttempt: (event) => this.handleThreat(event),
|
|
43
|
+
});
|
|
44
|
+
this.contentProtector.activate();
|
|
45
|
+
}
|
|
46
|
+
if (this.config.honeypot) {
|
|
47
|
+
this.honeypot = new Fingerprint_1.Honeypot({
|
|
48
|
+
onTriggered: (event) => this.handleThreat(event),
|
|
49
|
+
});
|
|
50
|
+
this.honeypot.inject();
|
|
51
|
+
}
|
|
52
|
+
if (this.config.fingerprint) {
|
|
53
|
+
this.sendFingerprint();
|
|
54
|
+
}
|
|
55
|
+
this.log('ai-appshield protection active');
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/** Tear down all protection layers */
|
|
59
|
+
deactivate() {
|
|
60
|
+
this.devToolsGuard?.stop();
|
|
61
|
+
this.contentProtector?.deactivate();
|
|
62
|
+
this.active = false;
|
|
63
|
+
this.log('ai-appshield protection deactivated');
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
/** Get collected threat events */
|
|
67
|
+
getThreats() {
|
|
68
|
+
return [...this.threats];
|
|
69
|
+
}
|
|
70
|
+
/** Get current browser fingerprint */
|
|
71
|
+
getFingerprint() {
|
|
72
|
+
return (0, Fingerprint_1.collectFingerprint)();
|
|
73
|
+
}
|
|
74
|
+
/** Get honeypot field name (for form integration) */
|
|
75
|
+
getHoneypotFieldName() {
|
|
76
|
+
return this.honeypot?.getFieldName() ?? null;
|
|
77
|
+
}
|
|
78
|
+
/** Manually run bot detection check */
|
|
79
|
+
checkBot() {
|
|
80
|
+
return (0, BotDetector_1.detectBot)();
|
|
81
|
+
}
|
|
82
|
+
runBotDetection() {
|
|
83
|
+
const result = (0, BotDetector_1.detectBot)();
|
|
84
|
+
if (result.isBot) {
|
|
85
|
+
this.handleThreat((0, BotDetector_1.createBotThreatEvent)(result));
|
|
86
|
+
}
|
|
87
|
+
// Re-check periodically
|
|
88
|
+
setInterval(() => {
|
|
89
|
+
const recheck = (0, BotDetector_1.detectBot)();
|
|
90
|
+
if (recheck.isBot) {
|
|
91
|
+
this.handleThreat((0, BotDetector_1.createBotThreatEvent)(recheck));
|
|
92
|
+
}
|
|
93
|
+
}, 5000);
|
|
94
|
+
}
|
|
95
|
+
handleThreat(event) {
|
|
96
|
+
this.threats.push(event);
|
|
97
|
+
this.log(`Threat detected: ${event.type} — ${event.message}`);
|
|
98
|
+
this.config.onThreatDetected?.(event);
|
|
99
|
+
if (this.config.reportEndpoint) {
|
|
100
|
+
this.reportThreat(event);
|
|
101
|
+
}
|
|
102
|
+
switch (this.config.threatAction) {
|
|
103
|
+
case 'block':
|
|
104
|
+
this.blockPage();
|
|
105
|
+
break;
|
|
106
|
+
case 'redirect':
|
|
107
|
+
if (this.config.redirectUrl) {
|
|
108
|
+
window.location.href = this.config.redirectUrl;
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case 'warn':
|
|
112
|
+
default:
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
blockPage() {
|
|
117
|
+
if (typeof document === 'undefined')
|
|
118
|
+
return;
|
|
119
|
+
document.body.innerHTML =
|
|
120
|
+
'<div style="display:flex;align-items:center;justify-content:center;height:100vh;font-family:sans-serif;color:#333;">' +
|
|
121
|
+
'<div style="text-align:center;"><h1>Access Denied</h1><p>Automated access is not permitted.</p></div></div>';
|
|
122
|
+
throw new Error('[ai-appshield] Access blocked');
|
|
123
|
+
}
|
|
124
|
+
async reportThreat(event) {
|
|
125
|
+
try {
|
|
126
|
+
await fetch(this.config.reportEndpoint, {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: { 'Content-Type': 'application/json' },
|
|
129
|
+
body: JSON.stringify(event),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
this.log('Failed to report threat to server');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async sendFingerprint() {
|
|
137
|
+
const fp = (0, Fingerprint_1.collectFingerprint)();
|
|
138
|
+
if (this.config.reportEndpoint) {
|
|
139
|
+
try {
|
|
140
|
+
await fetch(this.config.reportEndpoint, {
|
|
141
|
+
method: 'POST',
|
|
142
|
+
headers: {
|
|
143
|
+
'Content-Type': 'application/json',
|
|
144
|
+
'X-Ai-Appshield-Fingerprint': fp.hash,
|
|
145
|
+
},
|
|
146
|
+
body: JSON.stringify({ type: 'fingerprint', data: fp }),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
this.log('Failed to send fingerprint');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
log(message) {
|
|
155
|
+
if (this.config.debug) {
|
|
156
|
+
console.log(`[ai-appshield] ${message}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.Shield = Shield;
|
|
161
|
+
/** Quick-start: create and activate shield with one call */
|
|
162
|
+
function protect(config) {
|
|
163
|
+
const shield = new Shield(config);
|
|
164
|
+
shield.activate();
|
|
165
|
+
return shield;
|
|
166
|
+
}
|
|
167
|
+
var BotDetector_2 = require("./BotDetector");
|
|
168
|
+
Object.defineProperty(exports, "detectBot", { enumerable: true, get: function () { return BotDetector_2.detectBot; } });
|
|
169
|
+
Object.defineProperty(exports, "createBotThreatEvent", { enumerable: true, get: function () { return BotDetector_2.createBotThreatEvent; } });
|
|
170
|
+
var DevToolsGuard_2 = require("./DevToolsGuard");
|
|
171
|
+
Object.defineProperty(exports, "DevToolsGuard", { enumerable: true, get: function () { return DevToolsGuard_2.DevToolsGuard; } });
|
|
172
|
+
var ContentProtector_2 = require("./ContentProtector");
|
|
173
|
+
Object.defineProperty(exports, "ContentProtector", { enumerable: true, get: function () { return ContentProtector_2.ContentProtector; } });
|
|
174
|
+
var Fingerprint_2 = require("./Fingerprint");
|
|
175
|
+
Object.defineProperty(exports, "Honeypot", { enumerable: true, get: function () { return Fingerprint_2.Honeypot; } });
|
|
176
|
+
Object.defineProperty(exports, "collectFingerprint", { enumerable: true, get: function () { return Fingerprint_2.collectFingerprint; } });
|
|
177
|
+
//# sourceMappingURL=Shield.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Shield.js","sourceRoot":"","sources":["../../src/browser/Shield.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.obfuscateText = exports.decodeContent = exports.encodeContent = exports.protect = exports.Shield = void 0;
|
|
4
|
+
var Shield_1 = require("./Shield");
|
|
5
|
+
Object.defineProperty(exports, "Shield", { enumerable: true, get: function () { return Shield_1.Shield; } });
|
|
6
|
+
Object.defineProperty(exports, "protect", { enumerable: true, get: function () { return Shield_1.protect; } });
|
|
7
|
+
var obfuscate_1 = require("../utils/obfuscate");
|
|
8
|
+
Object.defineProperty(exports, "encodeContent", { enumerable: true, get: function () { return obfuscate_1.encodeContent; } });
|
|
9
|
+
Object.defineProperty(exports, "decodeContent", { enumerable: true, get: function () { return obfuscate_1.decodeContent; } });
|
|
10
|
+
Object.defineProperty(exports, "obfuscateText", { enumerable: true, get: function () { return obfuscate_1.obfuscateText; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;AAAlC,gGAAA,MAAM,OAAA;AAAE,iGAAA,OAAO,OAAA;AAExB,gDAAiF;AAAxE,0GAAA,aAAa,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,0GAAA,aAAa,OAAA"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|