@eggjs/security 4.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 +569 -0
- package/README.zh-CN.md +441 -0
- package/dist/commonjs/agent.d.ts +6 -0
- package/dist/commonjs/agent.js +14 -0
- package/dist/commonjs/app/extend/agent.d.ts +5 -0
- package/dist/commonjs/app/extend/agent.js +11 -0
- package/dist/commonjs/app/extend/application.d.ts +16 -0
- package/dist/commonjs/app/extend/application.js +35 -0
- package/dist/commonjs/app/extend/context.d.ts +68 -0
- package/dist/commonjs/app/extend/context.js +283 -0
- package/dist/commonjs/app/extend/helper.d.ts +12 -0
- package/dist/commonjs/app/extend/helper.js +10 -0
- package/dist/commonjs/app/extend/response.d.ts +41 -0
- package/dist/commonjs/app/extend/response.js +85 -0
- package/dist/commonjs/app/middleware/securities.d.ts +4 -0
- package/dist/commonjs/app/middleware/securities.js +55 -0
- package/dist/commonjs/app.d.ts +6 -0
- package/dist/commonjs/app.js +29 -0
- package/dist/commonjs/config/config.default.d.ts +871 -0
- package/dist/commonjs/config/config.default.js +357 -0
- package/dist/commonjs/config/config.local.d.ts +5 -0
- package/dist/commonjs/config/config.local.js +10 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +14 -0
- package/dist/commonjs/lib/extend/safe_curl.d.ts +16 -0
- package/dist/commonjs/lib/extend/safe_curl.js +28 -0
- package/dist/commonjs/lib/helper/cliFilter.d.ts +4 -0
- package/dist/commonjs/lib/helper/cliFilter.js +20 -0
- package/dist/commonjs/lib/helper/escape.d.ts +2 -0
- package/dist/commonjs/lib/helper/escape.js +8 -0
- package/dist/commonjs/lib/helper/escapeShellArg.d.ts +1 -0
- package/dist/commonjs/lib/helper/escapeShellArg.js +8 -0
- package/dist/commonjs/lib/helper/escapeShellCmd.d.ts +1 -0
- package/dist/commonjs/lib/helper/escapeShellCmd.js +17 -0
- package/dist/commonjs/lib/helper/index.d.ts +21 -0
- package/dist/commonjs/lib/helper/index.js +26 -0
- package/dist/commonjs/lib/helper/shtml.d.ts +2 -0
- package/dist/commonjs/lib/helper/shtml.js +76 -0
- package/dist/commonjs/lib/helper/sjs.d.ts +4 -0
- package/dist/commonjs/lib/helper/sjs.js +52 -0
- package/dist/commonjs/lib/helper/sjson.d.ts +1 -0
- package/dist/commonjs/lib/helper/sjson.js +45 -0
- package/dist/commonjs/lib/helper/spath.d.ts +5 -0
- package/dist/commonjs/lib/helper/spath.js +28 -0
- package/dist/commonjs/lib/helper/surl.d.ts +2 -0
- package/dist/commonjs/lib/helper/surl.js +33 -0
- package/dist/commonjs/lib/middlewares/csp.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/csp.js +68 -0
- package/dist/commonjs/lib/middlewares/csrf.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/csrf.js +42 -0
- package/dist/commonjs/lib/middlewares/dta.d.ts +3 -0
- package/dist/commonjs/lib/middlewares/dta.js +14 -0
- package/dist/commonjs/lib/middlewares/hsts.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/hsts.js +23 -0
- package/dist/commonjs/lib/middlewares/index.d.ts +13 -0
- package/dist/commonjs/lib/middlewares/index.js +28 -0
- package/dist/commonjs/lib/middlewares/methodnoallow.d.ts +3 -0
- package/dist/commonjs/lib/middlewares/methodnoallow.js +22 -0
- package/dist/commonjs/lib/middlewares/noopen.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/noopen.js +17 -0
- package/dist/commonjs/lib/middlewares/nosniff.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/nosniff.js +30 -0
- package/dist/commonjs/lib/middlewares/referrerPolicy.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/referrerPolicy.js +36 -0
- package/dist/commonjs/lib/middlewares/xframe.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/xframe.js +19 -0
- package/dist/commonjs/lib/middlewares/xssProtection.d.ts +4 -0
- package/dist/commonjs/lib/middlewares/xssProtection.js +16 -0
- package/dist/commonjs/lib/utils.d.ts +19 -0
- package/dist/commonjs/lib/utils.js +206 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/types.d.ts +10 -0
- package/dist/commonjs/types.js +5 -0
- package/dist/esm/agent.d.ts +6 -0
- package/dist/esm/agent.js +11 -0
- package/dist/esm/app/extend/agent.d.ts +5 -0
- package/dist/esm/app/extend/agent.js +8 -0
- package/dist/esm/app/extend/application.d.ts +16 -0
- package/dist/esm/app/extend/application.js +32 -0
- package/dist/esm/app/extend/context.d.ts +68 -0
- package/dist/esm/app/extend/context.js +244 -0
- package/dist/esm/app/extend/helper.d.ts +12 -0
- package/dist/esm/app/extend/helper.js +5 -0
- package/dist/esm/app/extend/response.d.ts +41 -0
- package/dist/esm/app/extend/response.js +82 -0
- package/dist/esm/app/middleware/securities.d.ts +4 -0
- package/dist/esm/app/middleware/securities.js +50 -0
- package/dist/esm/app.d.ts +6 -0
- package/dist/esm/app.js +26 -0
- package/dist/esm/config/config.default.d.ts +871 -0
- package/dist/esm/config/config.default.js +351 -0
- package/dist/esm/config/config.local.d.ts +5 -0
- package/dist/esm/config/config.local.js +8 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/lib/extend/safe_curl.d.ts +16 -0
- package/dist/esm/lib/extend/safe_curl.js +25 -0
- package/dist/esm/lib/helper/cliFilter.d.ts +4 -0
- package/dist/esm/lib/helper/cliFilter.js +17 -0
- package/dist/esm/lib/helper/escape.d.ts +2 -0
- package/dist/esm/lib/helper/escape.js +3 -0
- package/dist/esm/lib/helper/escapeShellArg.d.ts +1 -0
- package/dist/esm/lib/helper/escapeShellArg.js +5 -0
- package/dist/esm/lib/helper/escapeShellCmd.d.ts +1 -0
- package/dist/esm/lib/helper/escapeShellCmd.js +14 -0
- package/dist/esm/lib/helper/index.d.ts +21 -0
- package/dist/esm/lib/helper/index.js +21 -0
- package/dist/esm/lib/helper/shtml.d.ts +2 -0
- package/dist/esm/lib/helper/shtml.js +70 -0
- package/dist/esm/lib/helper/sjs.d.ts +4 -0
- package/dist/esm/lib/helper/sjs.js +49 -0
- package/dist/esm/lib/helper/sjson.d.ts +1 -0
- package/dist/esm/lib/helper/sjson.js +39 -0
- package/dist/esm/lib/helper/spath.d.ts +5 -0
- package/dist/esm/lib/helper/spath.js +25 -0
- package/dist/esm/lib/helper/surl.d.ts +2 -0
- package/dist/esm/lib/helper/surl.js +30 -0
- package/dist/esm/lib/middlewares/csp.d.ts +4 -0
- package/dist/esm/lib/middlewares/csp.js +63 -0
- package/dist/esm/lib/middlewares/csrf.d.ts +4 -0
- package/dist/esm/lib/middlewares/csrf.js +37 -0
- package/dist/esm/lib/middlewares/dta.d.ts +3 -0
- package/dist/esm/lib/middlewares/dta.js +12 -0
- package/dist/esm/lib/middlewares/hsts.d.ts +4 -0
- package/dist/esm/lib/middlewares/hsts.js +21 -0
- package/dist/esm/lib/middlewares/index.d.ts +13 -0
- package/dist/esm/lib/middlewares/index.js +23 -0
- package/dist/esm/lib/middlewares/methodnoallow.d.ts +3 -0
- package/dist/esm/lib/middlewares/methodnoallow.js +20 -0
- package/dist/esm/lib/middlewares/noopen.d.ts +4 -0
- package/dist/esm/lib/middlewares/noopen.js +15 -0
- package/dist/esm/lib/middlewares/nosniff.d.ts +4 -0
- package/dist/esm/lib/middlewares/nosniff.js +28 -0
- package/dist/esm/lib/middlewares/referrerPolicy.d.ts +4 -0
- package/dist/esm/lib/middlewares/referrerPolicy.js +34 -0
- package/dist/esm/lib/middlewares/xframe.d.ts +4 -0
- package/dist/esm/lib/middlewares/xframe.js +17 -0
- package/dist/esm/lib/middlewares/xssProtection.d.ts +4 -0
- package/dist/esm/lib/middlewares/xssProtection.js +14 -0
- package/dist/esm/lib/utils.d.ts +19 -0
- package/dist/esm/lib/utils.js +194 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/types.d.ts +10 -0
- package/dist/esm/types.js +3 -0
- package/dist/package.json +4 -0
- package/package.json +116 -0
- package/src/agent.ts +14 -0
- package/src/app/extend/agent.ts +14 -0
- package/src/app/extend/application.ts +51 -0
- package/src/app/extend/context.ts +282 -0
- package/src/app/extend/helper.ts +5 -0
- package/src/app/extend/response.ts +95 -0
- package/src/app/middleware/securities.ts +63 -0
- package/src/app.ts +31 -0
- package/src/config/config.default.ts +379 -0
- package/src/config/config.local.ts +9 -0
- package/src/index.ts +12 -0
- package/src/lib/extend/safe_curl.ts +35 -0
- package/src/lib/helper/cliFilter.ts +20 -0
- package/src/lib/helper/escape.ts +3 -0
- package/src/lib/helper/escapeShellArg.ts +4 -0
- package/src/lib/helper/escapeShellCmd.ts +16 -0
- package/src/lib/helper/index.ts +21 -0
- package/src/lib/helper/shtml.ts +77 -0
- package/src/lib/helper/sjs.ts +57 -0
- package/src/lib/helper/sjson.ts +35 -0
- package/src/lib/helper/spath.ts +27 -0
- package/src/lib/helper/surl.ts +35 -0
- package/src/lib/middlewares/csp.ts +70 -0
- package/src/lib/middlewares/csrf.ts +44 -0
- package/src/lib/middlewares/dta.ts +13 -0
- package/src/lib/middlewares/hsts.ts +24 -0
- package/src/lib/middlewares/index.ts +23 -0
- package/src/lib/middlewares/methodnoallow.ts +23 -0
- package/src/lib/middlewares/noopen.ts +18 -0
- package/src/lib/middlewares/nosniff.ts +32 -0
- package/src/lib/middlewares/referrerPolicy.ts +39 -0
- package/src/lib/middlewares/xframe.ts +20 -0
- package/src/lib/middlewares/xssProtection.ts +17 -0
- package/src/lib/utils.ts +208 -0
- package/src/types.ts +16 -0
- package/src/typings/index.d.ts +4 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape JavaScript to \xHH format
|
|
3
|
+
*/
|
|
4
|
+
// escape \x00-\x7f
|
|
5
|
+
// except 0-9,A-Z,a-z(\x2f-\x3a \x40-\x5b \x60-\x7b)
|
|
6
|
+
// eslint-disable-next-line
|
|
7
|
+
const MATCH_VULNERABLE_REGEXP = /[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]/;
|
|
8
|
+
// eslint-enable-next-line
|
|
9
|
+
const BASIC_ALPHABETS = new Set('abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''));
|
|
10
|
+
const map = {
|
|
11
|
+
'\t': '\\t',
|
|
12
|
+
'\n': '\\n',
|
|
13
|
+
'\r': '\\r',
|
|
14
|
+
};
|
|
15
|
+
export default function escapeJavaScript(text) {
|
|
16
|
+
const str = '' + text;
|
|
17
|
+
const match = MATCH_VULNERABLE_REGEXP.exec(str);
|
|
18
|
+
if (!match) {
|
|
19
|
+
return str;
|
|
20
|
+
}
|
|
21
|
+
let res = '';
|
|
22
|
+
let index = 0;
|
|
23
|
+
let lastIndex = 0;
|
|
24
|
+
let ascii;
|
|
25
|
+
for (index = match.index; index < str.length; index++) {
|
|
26
|
+
ascii = str[index];
|
|
27
|
+
if (BASIC_ALPHABETS.has(ascii)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
if (map[ascii] === undefined) {
|
|
32
|
+
const code = ascii.charCodeAt(0);
|
|
33
|
+
if (code > 127) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
map[ascii] = '\\x' + code.toString(16);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (lastIndex !== index) {
|
|
42
|
+
res += str.substring(lastIndex, index);
|
|
43
|
+
}
|
|
44
|
+
lastIndex = index + 1;
|
|
45
|
+
res += map[ascii];
|
|
46
|
+
}
|
|
47
|
+
return lastIndex !== index ? res + str.substring(lastIndex, index) : res;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2pzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9oZWxwZXIvc2pzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsbUJBQW1CO0FBQ25CLG9EQUFvRDtBQUVwRCwyQkFBMkI7QUFDM0IsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUN6RSwwQkFBMEI7QUFFMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0VBQWdFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFNUcsTUFBTSxHQUFHLEdBQTJCO0lBQ2xDLElBQUksRUFBRSxLQUFLO0lBQ1gsSUFBSSxFQUFFLEtBQUs7SUFDWCxJQUFJLEVBQUUsS0FBSztDQUNaLENBQUM7QUFFRixNQUFNLENBQUMsT0FBTyxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDbkQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksS0FBSyxDQUFDO0lBRVYsS0FBSyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3RELEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsU0FBUztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUNmLFNBQVM7Z0JBQ1gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxTQUFTLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN0QixHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzNFLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function jsonEscape(obj: any): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import sjs from './sjs.js';
|
|
2
|
+
/**
|
|
3
|
+
* escape json
|
|
4
|
+
* for output json in script
|
|
5
|
+
*/
|
|
6
|
+
function sanitizeKey(obj) {
|
|
7
|
+
if (typeof obj !== 'object')
|
|
8
|
+
return obj;
|
|
9
|
+
if (Array.isArray(obj))
|
|
10
|
+
return obj;
|
|
11
|
+
if (obj === null)
|
|
12
|
+
return null;
|
|
13
|
+
if (typeof obj === 'boolean')
|
|
14
|
+
return obj;
|
|
15
|
+
if (typeof obj === 'number')
|
|
16
|
+
return obj;
|
|
17
|
+
if (Buffer.isBuffer(obj))
|
|
18
|
+
return obj.toString();
|
|
19
|
+
for (const k in obj) {
|
|
20
|
+
const escapedK = sjs(k);
|
|
21
|
+
if (escapedK !== k) {
|
|
22
|
+
obj[escapedK] = sanitizeKey(obj[k]);
|
|
23
|
+
obj[k] = undefined;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
obj[k] = sanitizeKey(obj[k]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return obj;
|
|
30
|
+
}
|
|
31
|
+
export default function jsonEscape(obj) {
|
|
32
|
+
return JSON.stringify(sanitizeKey(obj), (_k, v) => {
|
|
33
|
+
if (typeof v === 'string') {
|
|
34
|
+
return sjs(v);
|
|
35
|
+
}
|
|
36
|
+
return v;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2pzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFM0I7OztHQUdHO0FBRUgsU0FBUyxXQUFXLENBQUMsR0FBUTtJQUMzQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDbkMsSUFBSSxHQUFHLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLElBQUksT0FBTyxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDckIsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxVQUFVLENBQUMsR0FBUTtJQUN6QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Inclusion
|
|
3
|
+
*/
|
|
4
|
+
export default function pathFilter(path) {
|
|
5
|
+
if (typeof path !== 'string')
|
|
6
|
+
return path;
|
|
7
|
+
const pathSource = path;
|
|
8
|
+
while (path.indexOf('%') !== -1) {
|
|
9
|
+
try {
|
|
10
|
+
path = decodeURIComponent(path);
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
14
|
+
// Not a PROD env, logging with a warning.
|
|
15
|
+
this.ctx.coreLogger.warn('[@eggjs/security/lib/helper/spath] : decode file path %j failed.', path);
|
|
16
|
+
}
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (path.indexOf('..') !== -1 || path[0] === '/') {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return pathSource;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUlILE1BQU0sQ0FBQyxPQUFPLFVBQVUsVUFBVSxDQUF5QixJQUFZO0lBQ3JFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztJQUV4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUMxQywwQ0FBMEM7Z0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIn0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const escapeMap = {
|
|
2
|
+
'"': '"',
|
|
3
|
+
'<': '<',
|
|
4
|
+
'>': '>',
|
|
5
|
+
'\'': ''',
|
|
6
|
+
};
|
|
7
|
+
export default function surl(val) {
|
|
8
|
+
// Just get the converted the protocolWhiteList in `Set` mode,
|
|
9
|
+
// Avoid conversions in `foreach`
|
|
10
|
+
const protocolWhiteListSet = this.app.config.security.__protocolWhiteListSet;
|
|
11
|
+
if (typeof val !== 'string') {
|
|
12
|
+
return val;
|
|
13
|
+
}
|
|
14
|
+
// only test on absolute path
|
|
15
|
+
if (val[0] !== '/') {
|
|
16
|
+
const arr = val.split('://', 2);
|
|
17
|
+
const protocol = arr.length > 1 ? arr[0].toLowerCase() : '';
|
|
18
|
+
if (protocol === '' || !protocolWhiteListSet.has(protocol)) {
|
|
19
|
+
if (this.app.config.env === 'local') {
|
|
20
|
+
this.ctx.coreLogger.warn('[@eggjs/security/surl] url: %j, protocol: %j, ' +
|
|
21
|
+
'protocol is empty or not in white list, convert to empty string', val, protocol);
|
|
22
|
+
}
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return val.replace(/["'<>]/g, ch => {
|
|
27
|
+
return escapeMap[ch];
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaGVscGVyL3N1cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxTQUFTLEdBQTJCO0lBQ3hDLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLE1BQU07SUFDWCxHQUFHLEVBQUUsTUFBTTtJQUNYLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxPQUFPLFVBQVUsSUFBSSxDQUF5QixHQUFXO0lBQzlELDhEQUE4RDtJQUM5RCxpQ0FBaUM7SUFDakMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXVCLENBQUM7SUFFOUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0RBQWdEO29CQUN2RSxpRUFBaUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2pDLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import extend from 'extend';
|
|
2
|
+
import { checkIfIgnore } from '../utils.js';
|
|
3
|
+
const HEADER = [
|
|
4
|
+
'x-content-security-policy',
|
|
5
|
+
'content-security-policy',
|
|
6
|
+
];
|
|
7
|
+
const REPORT_ONLY_HEADER = [
|
|
8
|
+
'x-content-security-policy-report-only',
|
|
9
|
+
'content-security-policy-report-only',
|
|
10
|
+
];
|
|
11
|
+
// Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
|
|
12
|
+
const MSIE_REGEXP = / MSIE /i;
|
|
13
|
+
export default (options) => {
|
|
14
|
+
return async function csp(ctx, next) {
|
|
15
|
+
await next();
|
|
16
|
+
const opts = {
|
|
17
|
+
...options,
|
|
18
|
+
...ctx.securityOptions.csp,
|
|
19
|
+
};
|
|
20
|
+
if (checkIfIgnore(opts, ctx))
|
|
21
|
+
return;
|
|
22
|
+
let finalHeader;
|
|
23
|
+
const matchedOption = extend(true, {}, opts.policy);
|
|
24
|
+
const bufArray = [];
|
|
25
|
+
const headers = opts.reportOnly ? REPORT_ONLY_HEADER : HEADER;
|
|
26
|
+
if (opts.supportIE && MSIE_REGEXP.test(ctx.get('user-agent'))) {
|
|
27
|
+
finalHeader = headers[0];
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
finalHeader = headers[1];
|
|
31
|
+
}
|
|
32
|
+
for (const key in matchedOption) {
|
|
33
|
+
const value = matchedOption[key];
|
|
34
|
+
// Other arrays are splitted into strings EXCEPT `sandbox`
|
|
35
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox
|
|
36
|
+
if (key === 'sandbox' && value === true) {
|
|
37
|
+
bufArray.push(key);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
let values = (Array.isArray(value) ? value : [value]);
|
|
41
|
+
if (key === 'script-src') {
|
|
42
|
+
const hasNonce = values.some(function (val) {
|
|
43
|
+
return val.indexOf('nonce-') !== -1;
|
|
44
|
+
});
|
|
45
|
+
if (!hasNonce) {
|
|
46
|
+
values.push('\'nonce-' + ctx.nonce + '\'');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
values = values.map(function (d) {
|
|
50
|
+
if (d.startsWith('.')) {
|
|
51
|
+
d = '*' + d;
|
|
52
|
+
}
|
|
53
|
+
return d;
|
|
54
|
+
});
|
|
55
|
+
bufArray.push(key + ' ' + values.join(' '));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const headerString = bufArray.join(';');
|
|
59
|
+
ctx.set(finalHeader, headerString);
|
|
60
|
+
ctx.set('x-csp-nonce', ctx.nonce);
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9jc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHNUMsTUFBTSxNQUFNLEdBQUc7SUFDYiwyQkFBMkI7SUFDM0IseUJBQXlCO0NBQzFCLENBQUM7QUFDRixNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLHVDQUF1QztJQUN2QyxxQ0FBcUM7Q0FDdEMsQ0FBQztBQUVGLHFEQUFxRDtBQUNyRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFFOUIsZUFBZSxDQUFDLE9BQThCLEVBQUUsRUFBRTtJQUNoRCxPQUFPLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBWSxFQUFFLElBQVU7UUFDaEQsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxPQUFPO1lBQ1YsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUc7U0FDM0IsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXJDLElBQUksV0FBVyxDQUFDO1FBQ2hCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsMERBQTBEO1lBQzFELDRGQUE0RjtZQUM1RixJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBRSxLQUFLLENBQUUsQ0FBYSxDQUFDO2dCQUNwRSxJQUFJLEdBQUcsS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFTLEdBQUc7d0JBQ3ZDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7b0JBQzdDLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFTLENBQUM7b0JBQzVCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN0QixDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDO29CQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUMsQ0FBQyxDQUFDO2dCQUNILFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import typeis from 'type-is';
|
|
3
|
+
import { checkIfIgnore } from '../utils.js';
|
|
4
|
+
const debug = debuglog('@eggjs/security/lib/middlewares/csrf');
|
|
5
|
+
export default (options) => {
|
|
6
|
+
return function csrf(ctx, next) {
|
|
7
|
+
if (checkIfIgnore(options, ctx)) {
|
|
8
|
+
return next();
|
|
9
|
+
}
|
|
10
|
+
// ensure csrf token exists
|
|
11
|
+
if (['any', 'all', 'ctoken'].includes(options.type)) {
|
|
12
|
+
ctx.ensureCsrfSecret();
|
|
13
|
+
}
|
|
14
|
+
// supported requests
|
|
15
|
+
const method = ctx.method;
|
|
16
|
+
let isSupported = false;
|
|
17
|
+
for (const eachRule of options.supportedRequests) {
|
|
18
|
+
if (eachRule.path.test(ctx.path)) {
|
|
19
|
+
if (eachRule.methods.includes(method)) {
|
|
20
|
+
isSupported = true;
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!isSupported) {
|
|
26
|
+
return next();
|
|
27
|
+
}
|
|
28
|
+
if (options.ignoreJSON && typeis.is(ctx.get('content-type'), 'json')) {
|
|
29
|
+
return next();
|
|
30
|
+
}
|
|
31
|
+
const body = ctx.request.body;
|
|
32
|
+
debug('%s %s, got %j', ctx.method, ctx.url, body);
|
|
33
|
+
ctx.assertCsrf();
|
|
34
|
+
return next();
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvY3NyZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBRS9ELGVBQWUsQ0FBQyxPQUErQixFQUFFLEVBQUU7SUFDakQsT0FBTyxTQUFTLElBQUksQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUMzQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RELEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUMxQixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEIsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ3RDLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ25CLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM5QixLQUFLLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isSafePath } from '../utils.js';
|
|
2
|
+
// https://en.wikipedia.org/wiki/Directory_traversal_attack
|
|
3
|
+
export default () => {
|
|
4
|
+
return function dta(ctx, next) {
|
|
5
|
+
const path = ctx.path;
|
|
6
|
+
if (!isSafePath(path, ctx)) {
|
|
7
|
+
ctx.throw(400);
|
|
8
|
+
}
|
|
9
|
+
return next();
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9kdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsZUFBZSxHQUFHLEVBQUU7SUFDbEIsT0FBTyxTQUFTLEdBQUcsQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUMxQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { checkIfIgnore } from '../utils.js';
|
|
2
|
+
// Set Strict-Transport-Security header
|
|
3
|
+
export default (options) => {
|
|
4
|
+
return async function hsts(ctx, next) {
|
|
5
|
+
await next();
|
|
6
|
+
const opts = {
|
|
7
|
+
...options,
|
|
8
|
+
...ctx.securityOptions.hsts,
|
|
9
|
+
};
|
|
10
|
+
if (checkIfIgnore(opts, ctx))
|
|
11
|
+
return;
|
|
12
|
+
let val = 'max-age=' + opts.maxAge;
|
|
13
|
+
// If opts.includeSubdomains is defined,
|
|
14
|
+
// the rule is also valid for all the sub domains of the website
|
|
15
|
+
if (opts.includeSubdomains) {
|
|
16
|
+
val += '; includeSubdomains';
|
|
17
|
+
}
|
|
18
|
+
ctx.set('strict-transport-security', val);
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvaHN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLHVDQUF1QztBQUN2QyxlQUFlLENBQUMsT0FBK0IsRUFBRSxFQUFFO0lBQ2pELE9BQU8sS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUNqRCxNQUFNLElBQUksRUFBRSxDQUFDO1FBRWIsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLE9BQU87WUFDVixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSTtTQUM1QixDQUFDO1FBQ0YsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFckMsSUFBSSxHQUFHLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbkMsd0NBQXdDO1FBQ3hDLGdFQUFnRTtRQUNoRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQztRQUMvQixDQUFDO1FBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
csp: (options: import("../../types.js").SecurityConfig["csp"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
3
|
+
csrf: (options: import("../../types.js").SecurityConfig["csrf"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
4
|
+
dta: () => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
5
|
+
hsts: (options: import("../../types.js").SecurityConfig["hsts"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
6
|
+
methodnoallow: () => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
7
|
+
noopen: (options: import("../../types.js").SecurityConfig["noopen"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
8
|
+
nosniff: (options: import("../../types.js").SecurityConfig["nosniff"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
9
|
+
referrerPolicy: (options: import("../../types.js").SecurityConfig["referrerPolicy"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
10
|
+
xframe: (options: import("../../types.js").SecurityConfig["xframe"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
11
|
+
xssProtection: (options: import("../../types.js").SecurityConfig["xssProtection"]) => (ctx: import("@eggjs/core").Context, next: import("egg").Next) => Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
export default _default;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import csp from './csp.js';
|
|
2
|
+
import csrf from './csrf.js';
|
|
3
|
+
import dta from './dta.js';
|
|
4
|
+
import hsts from './hsts.js';
|
|
5
|
+
import methodnoallow from './methodnoallow.js';
|
|
6
|
+
import noopen from './noopen.js';
|
|
7
|
+
import nosniff from './nosniff.js';
|
|
8
|
+
import referrerPolicy from './referrerPolicy.js';
|
|
9
|
+
import xframe from './xframe.js';
|
|
10
|
+
import xssProtection from './xssProtection.js';
|
|
11
|
+
export default {
|
|
12
|
+
csp,
|
|
13
|
+
csrf,
|
|
14
|
+
dta,
|
|
15
|
+
hsts,
|
|
16
|
+
methodnoallow,
|
|
17
|
+
noopen,
|
|
18
|
+
nosniff,
|
|
19
|
+
referrerPolicy,
|
|
20
|
+
xframe,
|
|
21
|
+
xssProtection,
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21pZGRsZXdhcmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUMzQixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sY0FBYyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUUvQyxlQUFlO0lBQ2IsR0FBRztJQUNILElBQUk7SUFDSixHQUFHO0lBQ0gsSUFBSTtJQUNKLGFBQWE7SUFDYixNQUFNO0lBQ04sT0FBTztJQUNQLGNBQWM7SUFDZCxNQUFNO0lBQ04sYUFBYTtDQUNkLENBQUMifQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { METHODS } from 'node:http';
|
|
2
|
+
const METHODS_NOT_ALLOWED = ['TRACE', 'TRACK'];
|
|
3
|
+
const safeHttpMethodsMap = {};
|
|
4
|
+
for (const method of METHODS) {
|
|
5
|
+
if (!METHODS_NOT_ALLOWED.includes(method)) {
|
|
6
|
+
safeHttpMethodsMap[method.toUpperCase()] = true;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
// https://www.owasp.org/index.php/Cross_Site_Tracing
|
|
10
|
+
// http://jsperf.com/find-by-map-with-find-by-array
|
|
11
|
+
export default () => {
|
|
12
|
+
return function notAllow(ctx, next) {
|
|
13
|
+
// ctx.method is upper case
|
|
14
|
+
if (!safeHttpMethodsMap[ctx.method]) {
|
|
15
|
+
ctx.throw(405);
|
|
16
|
+
}
|
|
17
|
+
return next();
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kbm9hbGxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbWV0aG9kbm9hbGxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3BDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBRSxPQUFPLEVBQUUsT0FBTyxDQUFFLENBQUM7QUFDakQsTUFBTSxrQkFBa0IsR0FBNEIsRUFBRSxDQUFDO0FBRXZELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxtREFBbUQ7QUFDbkQsZUFBZSxHQUFHLEVBQUU7SUFDbEIsT0FBTyxTQUFTLFFBQVEsQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUMvQywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { checkIfIgnore } from '../utils.js';
|
|
2
|
+
// @see http://blogs.msdn.com/b/ieinternals/archive/2009/06/30/internet-explorer-custom-http-headers.aspx
|
|
3
|
+
export default (options) => {
|
|
4
|
+
return async function noopen(ctx, next) {
|
|
5
|
+
await next();
|
|
6
|
+
const opts = {
|
|
7
|
+
...options,
|
|
8
|
+
...ctx.securityOptions.noopen,
|
|
9
|
+
};
|
|
10
|
+
if (checkIfIgnore(opts, ctx))
|
|
11
|
+
return;
|
|
12
|
+
ctx.set('x-download-options', 'noopen');
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcGVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9ub29wZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc1Qyx5R0FBeUc7QUFDekcsZUFBZSxDQUFDLE9BQWlDLEVBQUUsRUFBRTtJQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLENBQUMsR0FBWSxFQUFFLElBQVU7UUFDbkQsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxPQUFPO1lBQ1YsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU07U0FDOUIsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXJDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { checkIfIgnore } from '../utils.js';
|
|
2
|
+
// status codes for redirects
|
|
3
|
+
// @see https://github.com/jshttp/statuses/blob/master/index.js#L33
|
|
4
|
+
const RedirectStatus = {
|
|
5
|
+
300: true,
|
|
6
|
+
301: true,
|
|
7
|
+
302: true,
|
|
8
|
+
303: true,
|
|
9
|
+
305: true,
|
|
10
|
+
307: true,
|
|
11
|
+
308: true,
|
|
12
|
+
};
|
|
13
|
+
export default (options) => {
|
|
14
|
+
return async function nosniff(ctx, next) {
|
|
15
|
+
await next();
|
|
16
|
+
// ignore redirect response
|
|
17
|
+
if (RedirectStatus[ctx.status])
|
|
18
|
+
return;
|
|
19
|
+
const opts = {
|
|
20
|
+
...options,
|
|
21
|
+
...ctx.securityOptions.nosniff,
|
|
22
|
+
};
|
|
23
|
+
if (checkIfIgnore(opts, ctx))
|
|
24
|
+
return;
|
|
25
|
+
ctx.set('x-content-type-options', 'nosniff');
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9zbmlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbm9zbmlmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLDZCQUE2QjtBQUM3QixtRUFBbUU7QUFDbkUsTUFBTSxjQUFjLEdBQTRCO0lBQzlDLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0NBQ1YsQ0FBQztBQUVGLGVBQWUsQ0FBQyxPQUFrQyxFQUFFLEVBQUU7SUFDcEQsT0FBTyxLQUFLLFVBQVUsT0FBTyxDQUFDLEdBQVksRUFBRSxJQUFVO1FBQ3BELE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYiwyQkFBMkI7UUFDM0IsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFFdkMsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLE9BQU87WUFDVixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTztTQUMvQixDQUFDO1FBQ0YsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFckMsR0FBRyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { checkIfIgnore } from '../utils.js';
|
|
2
|
+
// https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy
|
|
3
|
+
const ALLOWED_POLICIES_ENUM = [
|
|
4
|
+
'no-referrer',
|
|
5
|
+
'no-referrer-when-downgrade',
|
|
6
|
+
'origin',
|
|
7
|
+
'origin-when-cross-origin',
|
|
8
|
+
'same-origin',
|
|
9
|
+
'strict-origin',
|
|
10
|
+
'strict-origin-when-cross-origin',
|
|
11
|
+
'unsafe-url',
|
|
12
|
+
'',
|
|
13
|
+
];
|
|
14
|
+
export default (options) => {
|
|
15
|
+
return async function referrerPolicy(ctx, next) {
|
|
16
|
+
await next();
|
|
17
|
+
const opts = {
|
|
18
|
+
...options,
|
|
19
|
+
// check refererPolicy for backward compatibility
|
|
20
|
+
// typo on the old version
|
|
21
|
+
// @see https://github.com/eggjs/security/blob/e3408408adec5f8d009d37f75126ed082481d0ac/lib/middlewares/referrerPolicy.js#L21C59-L21C72
|
|
22
|
+
...ctx.securityOptions.refererPolicy,
|
|
23
|
+
...ctx.securityOptions.referrerPolicy,
|
|
24
|
+
};
|
|
25
|
+
if (checkIfIgnore(opts, ctx))
|
|
26
|
+
return;
|
|
27
|
+
const policy = opts.value;
|
|
28
|
+
if (!ALLOWED_POLICIES_ENUM.includes(policy)) {
|
|
29
|
+
throw new Error('"' + policy + '" is not available.');
|
|
30
|
+
}
|
|
31
|
+
ctx.set('referrer-policy', policy);
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJyZXJQb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21pZGRsZXdhcmVzL3JlZmVycmVyUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHNUMsNEVBQTRFO0FBQzVFLE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsYUFBYTtJQUNiLDRCQUE0QjtJQUM1QixRQUFRO0lBQ1IsMEJBQTBCO0lBQzFCLGFBQWE7SUFDYixlQUFlO0lBQ2YsaUNBQWlDO0lBQ2pDLFlBQVk7SUFDWixFQUFFO0NBQ0gsQ0FBQztBQUVGLGVBQWUsQ0FBQyxPQUF5QyxFQUFFLEVBQUU7SUFDM0QsT0FBTyxLQUFLLFVBQVUsY0FBYyxDQUFDLEdBQVksRUFBRSxJQUFVO1FBQzNELE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLGlEQUFpRDtZQUNqRCwwQkFBMEI7WUFDMUIsdUlBQXVJO1lBQ3ZJLEdBQUksR0FBRyxDQUFDLGVBQXVCLENBQUMsYUFBYTtZQUM3QyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsY0FBYztTQUN0QyxDQUFDO1FBQ0YsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsTUFBTSxHQUFHLHFCQUFxQixDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { checkIfIgnore } from '../utils.js';
|
|
2
|
+
export default (options) => {
|
|
3
|
+
return async function xframe(ctx, next) {
|
|
4
|
+
await next();
|
|
5
|
+
const opts = {
|
|
6
|
+
...options,
|
|
7
|
+
...ctx.securityOptions.xframe,
|
|
8
|
+
};
|
|
9
|
+
if (checkIfIgnore(opts, ctx))
|
|
10
|
+
return;
|
|
11
|
+
// DENY, SAMEORIGIN, ALLOW-FROM
|
|
12
|
+
// https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options?redirectlocale=en-US&redirectslug=The_X-FRAME-OPTIONS_response_header
|
|
13
|
+
const value = opts.value || 'SAMEORIGIN';
|
|
14
|
+
ctx.set('x-frame-options', value);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGZyYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy94ZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc1QyxlQUFlLENBQUMsT0FBaUMsRUFBRSxFQUFFO0lBQ25ELE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUNuRCxNQUFNLElBQUksRUFBRSxDQUFDO1FBRWIsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLE9BQU87WUFDVixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTTtTQUM5QixDQUFDO1FBQ0YsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFckMsK0JBQStCO1FBQy9CLHNJQUFzSTtRQUN0SSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQztRQUN6QyxHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { checkIfIgnore } from '../utils.js';
|
|
2
|
+
export default (options) => {
|
|
3
|
+
return async function xssProtection(ctx, next) {
|
|
4
|
+
await next();
|
|
5
|
+
const opts = {
|
|
6
|
+
...options,
|
|
7
|
+
...ctx.securityOptions.xssProtection,
|
|
8
|
+
};
|
|
9
|
+
if (checkIfIgnore(opts, ctx))
|
|
10
|
+
return;
|
|
11
|
+
ctx.set('x-xss-protection', opts.value);
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHNzUHJvdGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMveHNzUHJvdGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLGVBQWUsQ0FBQyxPQUF3QyxFQUFFLEVBQUU7SUFDMUQsT0FBTyxLQUFLLFVBQVUsYUFBYSxDQUFDLEdBQVksRUFBRSxJQUFVO1FBQzFELE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxhQUFhO1NBQ3JDLENBQUM7UUFDRixJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Context } from '@eggjs/core';
|
|
2
|
+
import type { PathMatchingFun } from 'egg-path-matching';
|
|
3
|
+
import { SecurityConfig } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Check whether a domain is in the safe domain white list or not.
|
|
6
|
+
* @param {String} domain The inputted domain.
|
|
7
|
+
* @param {Array<string>} whiteList The white list for domain.
|
|
8
|
+
* @return {Boolean} If the `domain` is in the white list, return true; otherwise false.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isSafeDomain(domain: string, whiteList: string[]): boolean;
|
|
11
|
+
export declare function isSafePath(path: string, ctx: Context): boolean;
|
|
12
|
+
export declare function checkIfIgnore(opts: {
|
|
13
|
+
enable: boolean;
|
|
14
|
+
matching?: PathMatchingFun;
|
|
15
|
+
}, ctx: Context): boolean;
|
|
16
|
+
export declare function getCookieDomain(hostname: string): string;
|
|
17
|
+
export declare function merge(origin: Record<string, any>, opts?: Record<string, any>): Record<string, any>;
|
|
18
|
+
export declare function preprocessConfig(config: SecurityConfig): void;
|
|
19
|
+
export declare function getFromUrl(url: string, prop?: string): string | null;
|