@eggjs/security 5.0.0-beta.19 → 5.0.0-beta.21
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/dist/agent.d.ts +5 -9
- package/dist/agent.js +10 -14
- package/dist/app/extend/agent.d.ts +4 -8
- package/dist/app/extend/agent.js +8 -12
- package/dist/app/extend/application.d.ts +7 -11
- package/dist/app/extend/application.js +32 -32
- package/dist/app/extend/context.d.ts +52 -55
- package/dist/app/extend/context.js +241 -188
- package/dist/app/extend/helper.d.ts +10 -22
- package/dist/app/extend/helper.js +5 -7
- package/dist/app/extend/response.d.ts +34 -38
- package/dist/app/extend/response.js +82 -69
- package/dist/app/middleware/securities.d.ts +4 -8
- package/dist/app/middleware/securities.js +52 -38
- package/dist/app.d.ts +5 -9
- package/dist/app.js +24 -22
- package/dist/config/config.default.d.ts +784 -787
- package/dist/config/config.default.js +356 -156
- package/dist/config/config.local.d.ts +2 -5
- package/dist/config/config.local.js +8 -5
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -2
- package/dist/lib/extend/safe_curl.d.ts +9 -13
- package/dist/lib/extend/safe_curl.js +23 -17
- package/dist/lib/helper/cliFilter.d.ts +1 -4
- package/dist/lib/helper/cliFilter.js +15 -16
- package/dist/lib/helper/escape.d.ts +2 -2
- package/dist/lib/helper/escape.js +3 -7
- package/dist/lib/helper/escapeShellArg.d.ts +1 -4
- package/dist/lib/helper/escapeShellArg.js +4 -6
- package/dist/lib/helper/escapeShellCmd.d.ts +1 -4
- package/dist/lib/helper/escapeShellCmd.js +13 -14
- package/dist/lib/helper/index.d.ts +19 -22
- package/dist/lib/helper/index.js +15 -19
- package/dist/lib/helper/shtml.d.ts +2 -6
- package/dist/lib/helper/shtml.js +68 -52
- package/dist/lib/helper/sjs.d.ts +1 -4
- package/dist/lib/helper/sjs.js +44 -31
- package/dist/lib/helper/sjson.d.ts +1 -4
- package/dist/lib/helper/sjson.js +35 -28
- package/dist/lib/helper/spath.d.ts +5 -7
- package/dist/lib/helper/spath.js +24 -15
- package/dist/lib/helper/surl.d.ts +2 -6
- package/dist/lib/helper/surl.js +27 -22
- package/dist/lib/middlewares/csp.d.ts +3 -6
- package/dist/lib/middlewares/csp.js +54 -43
- package/dist/lib/middlewares/csrf.d.ts +3 -6
- package/dist/lib/middlewares/csrf.js +35 -31
- package/dist/lib/middlewares/dta.d.ts +2 -5
- package/dist/lib/middlewares/dta.js +10 -11
- package/dist/lib/middlewares/hsts.d.ts +3 -6
- package/dist/lib/middlewares/hsts.js +19 -17
- package/dist/lib/middlewares/index.d.ts +11 -16
- package/dist/lib/middlewares/index.js +22 -26
- package/dist/lib/middlewares/methodnoallow.d.ts +2 -5
- package/dist/lib/middlewares/methodnoallow.js +18 -13
- package/dist/lib/middlewares/noopen.d.ts +3 -6
- package/dist/lib/middlewares/noopen.js +13 -15
- package/dist/lib/middlewares/nosniff.d.ts +3 -6
- package/dist/lib/middlewares/nosniff.js +24 -23
- package/dist/lib/middlewares/referrerPolicy.d.ts +3 -6
- package/dist/lib/middlewares/referrerPolicy.js +31 -27
- package/dist/lib/middlewares/xframe.d.ts +3 -6
- package/dist/lib/middlewares/xframe.js +15 -16
- package/dist/lib/middlewares/xssProtection.d.ts +3 -6
- package/dist/lib/middlewares/xssProtection.js +12 -15
- package/dist/lib/utils.d.ts +12 -17
- package/dist/lib/utils.js +177 -112
- package/dist/types.d.ts +35 -37
- package/dist/types.js +2 -1
- package/package.json +6 -6
package/dist/lib/helper/surl.js
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
//#region src/lib/helper/surl.ts
|
|
2
1
|
const escapeMap = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
'"': '"',
|
|
3
|
+
'<': '<',
|
|
4
|
+
'>': '>',
|
|
5
|
+
"'": ''',
|
|
7
6
|
};
|
|
8
|
-
function surl(val) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
+
});
|
|
22
29
|
}
|
|
23
|
-
|
|
24
|
-
//#endregion
|
|
25
|
-
export { surl as default };
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaGVscGVyL3N1cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxTQUFTLEdBQTJCO0lBQ3hDLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLE1BQU07SUFDWCxHQUFHLEVBQUUsTUFBTTtJQUNYLEdBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxPQUFPLFVBQVUsSUFBSSxDQUF5QixHQUFXO0lBQzlELDhEQUE4RDtJQUM5RCxpQ0FBaUM7SUFDakMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXVCLENBQUM7SUFFOUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3RCLGdEQUFnRDtvQkFDOUMsaUVBQWlFLEVBQ25FLEdBQUcsRUFDSCxRQUFRLENBQ1QsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNqQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/csp.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { SecurityConfig } from '../../config/config.default.ts';
|
|
5
3
|
declare const _default: (options: SecurityConfig["csp"]) => MiddlewareFunc;
|
|
6
|
-
|
|
7
|
-
export { _default as default };
|
|
4
|
+
export default _default;
|
|
@@ -1,46 +1,57 @@
|
|
|
1
|
+
import extend from 'extend';
|
|
1
2
|
import { checkIfIgnore } from "../utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const HEADER = ["x-content-security-policy", "content-security-policy"];
|
|
6
|
-
const REPORT_ONLY_HEADER = ["x-content-security-policy-report-only", "content-security-policy-report-only"];
|
|
3
|
+
const HEADER = ['x-content-security-policy', 'content-security-policy'];
|
|
4
|
+
const REPORT_ONLY_HEADER = ['x-content-security-policy-report-only', 'content-security-policy-report-only'];
|
|
5
|
+
// Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
|
|
7
6
|
const MSIE_REGEXP = / MSIE /i;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
7
|
+
export default (options) => {
|
|
8
|
+
return async function csp(ctx, next) {
|
|
9
|
+
await next();
|
|
10
|
+
const opts = {
|
|
11
|
+
...options,
|
|
12
|
+
...ctx.securityOptions.csp,
|
|
13
|
+
};
|
|
14
|
+
if (checkIfIgnore(opts, ctx))
|
|
15
|
+
return;
|
|
16
|
+
let finalHeader;
|
|
17
|
+
const matchedOption = extend(true, {}, opts.policy);
|
|
18
|
+
const bufArray = [];
|
|
19
|
+
const headers = opts.reportOnly ? REPORT_ONLY_HEADER : HEADER;
|
|
20
|
+
if (opts.supportIE && MSIE_REGEXP.test(ctx.get('user-agent'))) {
|
|
21
|
+
finalHeader = headers[0];
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
finalHeader = headers[1];
|
|
25
|
+
}
|
|
26
|
+
for (const key in matchedOption) {
|
|
27
|
+
const value = matchedOption[key];
|
|
28
|
+
// Other arrays are splitted into strings EXCEPT `sandbox`
|
|
29
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox
|
|
30
|
+
if (key === 'sandbox' && value === true) {
|
|
31
|
+
bufArray.push(key);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
let values = (Array.isArray(value) ? value : [value]);
|
|
35
|
+
if (key === 'script-src') {
|
|
36
|
+
const hasNonce = values.some(function (val) {
|
|
37
|
+
return val.indexOf('nonce-') !== -1;
|
|
38
|
+
});
|
|
39
|
+
if (!hasNonce) {
|
|
40
|
+
values.push("'nonce-" + ctx.nonce + "'");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
values = values.map(function (d) {
|
|
44
|
+
if (d.startsWith('.')) {
|
|
45
|
+
d = '*' + d;
|
|
46
|
+
}
|
|
47
|
+
return d;
|
|
48
|
+
});
|
|
49
|
+
bufArray.push(key + ' ' + values.join(' '));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const headerString = bufArray.join(';');
|
|
53
|
+
ctx.set(finalHeader, headerString);
|
|
54
|
+
ctx.set('x-csp-nonce', ctx.nonce);
|
|
55
|
+
};
|
|
43
56
|
};
|
|
44
|
-
|
|
45
|
-
//#endregion
|
|
46
|
-
export { csp_default as default };
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9jc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHNUMsTUFBTSxNQUFNLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBQ3hFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyx1Q0FBdUMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0FBRTVHLHFEQUFxRDtBQUNyRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFFOUIsZUFBZSxDQUFDLE9BQThCLEVBQWtCLEVBQUU7SUFDaEUsT0FBTyxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQ2pDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHO1NBQzNCLENBQUM7UUFDRixJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxJQUFJLFdBQVcsQ0FBQztRQUNoQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRXBCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLDBEQUEwRDtZQUMxRCw0RkFBNEY7WUFDNUYsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQWEsQ0FBQztnQkFDbEUsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO3dCQUN4QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO29CQUM3QixJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxPQUFPLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/csrf.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { SecurityConfig } from '../../config/config.default.ts';
|
|
5
3
|
declare const _default: (options: SecurityConfig["csrf"]) => MiddlewareFunc;
|
|
6
|
-
|
|
7
|
-
export { _default as default };
|
|
4
|
+
export default _default;
|
|
@@ -1,33 +1,37 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import typeis from 'type-is';
|
|
1
3
|
import { checkIfIgnore } from "../utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
4
|
+
const debug = debuglog('egg/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
|
+
};
|
|
30
36
|
};
|
|
31
|
-
|
|
32
|
-
//#endregion
|
|
33
|
-
export { csrf_default as default };
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvY3NyZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3JDLE9BQU8sTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUU3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBRTVELGVBQWUsQ0FBQyxPQUErQixFQUFrQixFQUFFO0lBQ2pFLE9BQU8sU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDNUIsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLEtBQUssTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUN0QyxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDOUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { isSafePath } from "../utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
+
};
|
|
10
11
|
};
|
|
11
|
-
|
|
12
|
-
//#endregion
|
|
13
|
-
export { dta_default as default };
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9kdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsZUFBZSxHQUFtQixFQUFFO0lBQ2xDLE9BQU8sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/hsts.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { SecurityConfig } from '../../config/config.default.ts';
|
|
5
3
|
declare const _default: (options: SecurityConfig["hsts"]) => MiddlewareFunc;
|
|
6
|
-
|
|
7
|
-
export { _default as default };
|
|
4
|
+
export default _default;
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { checkIfIgnore } from "../utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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 = `${val}; includeSubdomains`;
|
|
17
|
+
}
|
|
18
|
+
ctx.set('strict-transport-security', val);
|
|
19
|
+
};
|
|
16
20
|
};
|
|
17
|
-
|
|
18
|
-
//#endregion
|
|
19
|
-
export { hsts_default as default };
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvaHN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLHVDQUF1QztBQUN2QyxlQUFlLENBQUMsT0FBK0IsRUFBa0IsRUFBRTtJQUNqRSxPQUFPLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDbEMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxPQUFPO1lBQ1YsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUk7U0FDNUIsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXJDLElBQUksR0FBRyxHQUFHLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLHdDQUF3QztRQUN4QyxnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLHFCQUFxQixDQUFDO1FBQ3BDLENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
import { SecurityConfig } from "../../config/config.default.js";
|
|
2
|
-
import * as egg0 from "egg";
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/index.d.ts
|
|
5
1
|
declare const _default: {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
2
|
+
csp: (options: import("../../config/config.default.ts").SecurityConfig["csp"]) => import("egg").MiddlewareFunc;
|
|
3
|
+
csrf: (options: import("../../config/config.default.ts").SecurityConfig["csrf"]) => import("egg").MiddlewareFunc;
|
|
4
|
+
dta: () => import("egg").MiddlewareFunc;
|
|
5
|
+
hsts: (options: import("../../config/config.default.ts").SecurityConfig["hsts"]) => import("egg").MiddlewareFunc;
|
|
6
|
+
methodnoallow: () => import("egg").MiddlewareFunc;
|
|
7
|
+
noopen: (options: import("../../config/config.default.ts").SecurityConfig["noopen"]) => import("egg").MiddlewareFunc;
|
|
8
|
+
nosniff: (options: import("../../config/config.default.ts").SecurityConfig["nosniff"]) => import("egg").MiddlewareFunc;
|
|
9
|
+
referrerPolicy: (options: import("../../config/config.default.ts").SecurityConfig["referrerPolicy"]) => import("egg").MiddlewareFunc;
|
|
10
|
+
xframe: (options: import("../../config/config.default.ts").SecurityConfig["xframe"]) => import("egg").MiddlewareFunc;
|
|
11
|
+
xssProtection: (options: import("../../config/config.default.ts").SecurityConfig["xssProtection"]) => import("egg").MiddlewareFunc;
|
|
16
12
|
};
|
|
17
|
-
|
|
18
|
-
export { _default as default };
|
|
13
|
+
export default _default;
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
xframe: xframe_default,
|
|
23
|
-
xssProtection: xssProtection_default
|
|
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,
|
|
24
22
|
};
|
|
25
|
-
|
|
26
|
-
//#endregion
|
|
27
|
-
export { middlewares_default as default };
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21pZGRsZXdhcmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUMzQixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sY0FBYyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUUvQyxlQUFlO0lBQ2IsR0FBRztJQUNILElBQUk7SUFDSixHQUFHO0lBQ0gsSUFBSTtJQUNKLGFBQWE7SUFDYixNQUFNO0lBQ04sT0FBTztJQUNQLGNBQWM7SUFDZCxNQUFNO0lBQ04sYUFBYTtDQUNkLENBQUMifQ==
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
import { METHODS } from
|
|
2
|
-
|
|
3
|
-
//#region src/lib/middlewares/methodnoallow.ts
|
|
4
|
-
const METHODS_NOT_ALLOWED = ["TRACE", "TRACK"];
|
|
1
|
+
import { METHODS } from 'node:http';
|
|
2
|
+
const METHODS_NOT_ALLOWED = ['TRACE', 'TRACK'];
|
|
5
3
|
const safeHttpMethodsMap = {};
|
|
6
|
-
for (const method of METHODS)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
+
};
|
|
12
19
|
};
|
|
13
|
-
|
|
14
|
-
//#endregion
|
|
15
|
-
export { methodnoallow_default as default };
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kbm9hbGxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbWV0aG9kbm9hbGxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXBDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDL0MsTUFBTSxrQkFBa0IsR0FBNEIsRUFBRSxDQUFDO0FBRXZELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxtREFBbUQ7QUFDbkQsZUFBZSxHQUFtQixFQUFFO0lBQ2xDLE9BQU8sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDaEMsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/noopen.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { SecurityConfig } from '../../config/config.default.ts';
|
|
5
3
|
declare const _default: (options: SecurityConfig["noopen"]) => MiddlewareFunc;
|
|
6
|
-
|
|
7
|
-
export { _default as default };
|
|
4
|
+
export default _default;
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { checkIfIgnore } from "../utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
14
|
};
|
|
15
|
-
|
|
16
|
-
//#endregion
|
|
17
|
-
export { noopen_default as default };
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcGVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9ub29wZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc1Qyx5R0FBeUc7QUFDekcsZUFBZSxDQUFDLE9BQWlDLEVBQWtCLEVBQUU7SUFDbkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQ3BDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNO1NBQzlCLENBQUM7UUFDRixJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxHQUFHLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/nosniff.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { SecurityConfig } from '../../config/config.default.ts';
|
|
5
3
|
declare const _default: (options: SecurityConfig["nosniff"]) => MiddlewareFunc;
|
|
6
|
-
|
|
7
|
-
export { _default as default };
|
|
4
|
+
export default _default;
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { checkIfIgnore } from "../utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// status codes for redirects
|
|
3
|
+
// @see https://github.com/jshttp/statuses/blob/master/index.js#L33
|
|
4
4
|
const RedirectStatus = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
300: true,
|
|
6
|
+
301: true,
|
|
7
|
+
302: true,
|
|
8
|
+
303: true,
|
|
9
|
+
305: true,
|
|
10
|
+
307: true,
|
|
11
|
+
308: true,
|
|
12
12
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
+
};
|
|
24
27
|
};
|
|
25
|
-
|
|
26
|
-
//#endregion
|
|
27
|
-
export { nosniff_default as default };
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9zbmlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbm9zbmlmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLDZCQUE2QjtBQUM3QixtRUFBbUU7QUFDbkUsTUFBTSxjQUFjLEdBQTRCO0lBQzlDLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0NBQ1YsQ0FBQztBQUVGLGVBQWUsQ0FBQyxPQUFrQyxFQUFrQixFQUFFO0lBQ3BFLE9BQU8sS0FBSyxVQUFVLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNyQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRWIsMkJBQTJCO1FBQzNCLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPO1FBRXZDLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxPQUFPO1lBQ1YsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU87U0FDL0IsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXJDLEdBQUcsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
//#region src/lib/middlewares/referrerPolicy.d.ts
|
|
1
|
+
import type { MiddlewareFunc } from 'egg';
|
|
2
|
+
import type { SecurityConfig } from '../../config/config.default.ts';
|
|
5
3
|
declare const _default: (options: SecurityConfig["referrerPolicy"]) => MiddlewareFunc;
|
|
6
|
-
|
|
7
|
-
export { _default as default };
|
|
4
|
+
export default _default;
|