@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.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +569 -0
  3. package/README.zh-CN.md +441 -0
  4. package/dist/commonjs/agent.d.ts +6 -0
  5. package/dist/commonjs/agent.js +14 -0
  6. package/dist/commonjs/app/extend/agent.d.ts +5 -0
  7. package/dist/commonjs/app/extend/agent.js +11 -0
  8. package/dist/commonjs/app/extend/application.d.ts +16 -0
  9. package/dist/commonjs/app/extend/application.js +35 -0
  10. package/dist/commonjs/app/extend/context.d.ts +68 -0
  11. package/dist/commonjs/app/extend/context.js +283 -0
  12. package/dist/commonjs/app/extend/helper.d.ts +12 -0
  13. package/dist/commonjs/app/extend/helper.js +10 -0
  14. package/dist/commonjs/app/extend/response.d.ts +41 -0
  15. package/dist/commonjs/app/extend/response.js +85 -0
  16. package/dist/commonjs/app/middleware/securities.d.ts +4 -0
  17. package/dist/commonjs/app/middleware/securities.js +55 -0
  18. package/dist/commonjs/app.d.ts +6 -0
  19. package/dist/commonjs/app.js +29 -0
  20. package/dist/commonjs/config/config.default.d.ts +871 -0
  21. package/dist/commonjs/config/config.default.js +357 -0
  22. package/dist/commonjs/config/config.local.d.ts +5 -0
  23. package/dist/commonjs/config/config.local.js +10 -0
  24. package/dist/commonjs/index.d.ts +1 -0
  25. package/dist/commonjs/index.js +14 -0
  26. package/dist/commonjs/lib/extend/safe_curl.d.ts +16 -0
  27. package/dist/commonjs/lib/extend/safe_curl.js +28 -0
  28. package/dist/commonjs/lib/helper/cliFilter.d.ts +4 -0
  29. package/dist/commonjs/lib/helper/cliFilter.js +20 -0
  30. package/dist/commonjs/lib/helper/escape.d.ts +2 -0
  31. package/dist/commonjs/lib/helper/escape.js +8 -0
  32. package/dist/commonjs/lib/helper/escapeShellArg.d.ts +1 -0
  33. package/dist/commonjs/lib/helper/escapeShellArg.js +8 -0
  34. package/dist/commonjs/lib/helper/escapeShellCmd.d.ts +1 -0
  35. package/dist/commonjs/lib/helper/escapeShellCmd.js +17 -0
  36. package/dist/commonjs/lib/helper/index.d.ts +21 -0
  37. package/dist/commonjs/lib/helper/index.js +26 -0
  38. package/dist/commonjs/lib/helper/shtml.d.ts +2 -0
  39. package/dist/commonjs/lib/helper/shtml.js +76 -0
  40. package/dist/commonjs/lib/helper/sjs.d.ts +4 -0
  41. package/dist/commonjs/lib/helper/sjs.js +52 -0
  42. package/dist/commonjs/lib/helper/sjson.d.ts +1 -0
  43. package/dist/commonjs/lib/helper/sjson.js +45 -0
  44. package/dist/commonjs/lib/helper/spath.d.ts +5 -0
  45. package/dist/commonjs/lib/helper/spath.js +28 -0
  46. package/dist/commonjs/lib/helper/surl.d.ts +2 -0
  47. package/dist/commonjs/lib/helper/surl.js +33 -0
  48. package/dist/commonjs/lib/middlewares/csp.d.ts +4 -0
  49. package/dist/commonjs/lib/middlewares/csp.js +68 -0
  50. package/dist/commonjs/lib/middlewares/csrf.d.ts +4 -0
  51. package/dist/commonjs/lib/middlewares/csrf.js +42 -0
  52. package/dist/commonjs/lib/middlewares/dta.d.ts +3 -0
  53. package/dist/commonjs/lib/middlewares/dta.js +14 -0
  54. package/dist/commonjs/lib/middlewares/hsts.d.ts +4 -0
  55. package/dist/commonjs/lib/middlewares/hsts.js +23 -0
  56. package/dist/commonjs/lib/middlewares/index.d.ts +13 -0
  57. package/dist/commonjs/lib/middlewares/index.js +28 -0
  58. package/dist/commonjs/lib/middlewares/methodnoallow.d.ts +3 -0
  59. package/dist/commonjs/lib/middlewares/methodnoallow.js +22 -0
  60. package/dist/commonjs/lib/middlewares/noopen.d.ts +4 -0
  61. package/dist/commonjs/lib/middlewares/noopen.js +17 -0
  62. package/dist/commonjs/lib/middlewares/nosniff.d.ts +4 -0
  63. package/dist/commonjs/lib/middlewares/nosniff.js +30 -0
  64. package/dist/commonjs/lib/middlewares/referrerPolicy.d.ts +4 -0
  65. package/dist/commonjs/lib/middlewares/referrerPolicy.js +36 -0
  66. package/dist/commonjs/lib/middlewares/xframe.d.ts +4 -0
  67. package/dist/commonjs/lib/middlewares/xframe.js +19 -0
  68. package/dist/commonjs/lib/middlewares/xssProtection.d.ts +4 -0
  69. package/dist/commonjs/lib/middlewares/xssProtection.js +16 -0
  70. package/dist/commonjs/lib/utils.d.ts +19 -0
  71. package/dist/commonjs/lib/utils.js +206 -0
  72. package/dist/commonjs/package.json +3 -0
  73. package/dist/commonjs/types.d.ts +10 -0
  74. package/dist/commonjs/types.js +5 -0
  75. package/dist/esm/agent.d.ts +6 -0
  76. package/dist/esm/agent.js +11 -0
  77. package/dist/esm/app/extend/agent.d.ts +5 -0
  78. package/dist/esm/app/extend/agent.js +8 -0
  79. package/dist/esm/app/extend/application.d.ts +16 -0
  80. package/dist/esm/app/extend/application.js +32 -0
  81. package/dist/esm/app/extend/context.d.ts +68 -0
  82. package/dist/esm/app/extend/context.js +244 -0
  83. package/dist/esm/app/extend/helper.d.ts +12 -0
  84. package/dist/esm/app/extend/helper.js +5 -0
  85. package/dist/esm/app/extend/response.d.ts +41 -0
  86. package/dist/esm/app/extend/response.js +82 -0
  87. package/dist/esm/app/middleware/securities.d.ts +4 -0
  88. package/dist/esm/app/middleware/securities.js +50 -0
  89. package/dist/esm/app.d.ts +6 -0
  90. package/dist/esm/app.js +26 -0
  91. package/dist/esm/config/config.default.d.ts +871 -0
  92. package/dist/esm/config/config.default.js +351 -0
  93. package/dist/esm/config/config.local.d.ts +5 -0
  94. package/dist/esm/config/config.local.js +8 -0
  95. package/dist/esm/index.d.ts +1 -0
  96. package/dist/esm/index.js +12 -0
  97. package/dist/esm/lib/extend/safe_curl.d.ts +16 -0
  98. package/dist/esm/lib/extend/safe_curl.js +25 -0
  99. package/dist/esm/lib/helper/cliFilter.d.ts +4 -0
  100. package/dist/esm/lib/helper/cliFilter.js +17 -0
  101. package/dist/esm/lib/helper/escape.d.ts +2 -0
  102. package/dist/esm/lib/helper/escape.js +3 -0
  103. package/dist/esm/lib/helper/escapeShellArg.d.ts +1 -0
  104. package/dist/esm/lib/helper/escapeShellArg.js +5 -0
  105. package/dist/esm/lib/helper/escapeShellCmd.d.ts +1 -0
  106. package/dist/esm/lib/helper/escapeShellCmd.js +14 -0
  107. package/dist/esm/lib/helper/index.d.ts +21 -0
  108. package/dist/esm/lib/helper/index.js +21 -0
  109. package/dist/esm/lib/helper/shtml.d.ts +2 -0
  110. package/dist/esm/lib/helper/shtml.js +70 -0
  111. package/dist/esm/lib/helper/sjs.d.ts +4 -0
  112. package/dist/esm/lib/helper/sjs.js +49 -0
  113. package/dist/esm/lib/helper/sjson.d.ts +1 -0
  114. package/dist/esm/lib/helper/sjson.js +39 -0
  115. package/dist/esm/lib/helper/spath.d.ts +5 -0
  116. package/dist/esm/lib/helper/spath.js +25 -0
  117. package/dist/esm/lib/helper/surl.d.ts +2 -0
  118. package/dist/esm/lib/helper/surl.js +30 -0
  119. package/dist/esm/lib/middlewares/csp.d.ts +4 -0
  120. package/dist/esm/lib/middlewares/csp.js +63 -0
  121. package/dist/esm/lib/middlewares/csrf.d.ts +4 -0
  122. package/dist/esm/lib/middlewares/csrf.js +37 -0
  123. package/dist/esm/lib/middlewares/dta.d.ts +3 -0
  124. package/dist/esm/lib/middlewares/dta.js +12 -0
  125. package/dist/esm/lib/middlewares/hsts.d.ts +4 -0
  126. package/dist/esm/lib/middlewares/hsts.js +21 -0
  127. package/dist/esm/lib/middlewares/index.d.ts +13 -0
  128. package/dist/esm/lib/middlewares/index.js +23 -0
  129. package/dist/esm/lib/middlewares/methodnoallow.d.ts +3 -0
  130. package/dist/esm/lib/middlewares/methodnoallow.js +20 -0
  131. package/dist/esm/lib/middlewares/noopen.d.ts +4 -0
  132. package/dist/esm/lib/middlewares/noopen.js +15 -0
  133. package/dist/esm/lib/middlewares/nosniff.d.ts +4 -0
  134. package/dist/esm/lib/middlewares/nosniff.js +28 -0
  135. package/dist/esm/lib/middlewares/referrerPolicy.d.ts +4 -0
  136. package/dist/esm/lib/middlewares/referrerPolicy.js +34 -0
  137. package/dist/esm/lib/middlewares/xframe.d.ts +4 -0
  138. package/dist/esm/lib/middlewares/xframe.js +17 -0
  139. package/dist/esm/lib/middlewares/xssProtection.d.ts +4 -0
  140. package/dist/esm/lib/middlewares/xssProtection.js +14 -0
  141. package/dist/esm/lib/utils.d.ts +19 -0
  142. package/dist/esm/lib/utils.js +194 -0
  143. package/dist/esm/package.json +3 -0
  144. package/dist/esm/types.d.ts +10 -0
  145. package/dist/esm/types.js +3 -0
  146. package/dist/package.json +4 -0
  147. package/package.json +116 -0
  148. package/src/agent.ts +14 -0
  149. package/src/app/extend/agent.ts +14 -0
  150. package/src/app/extend/application.ts +51 -0
  151. package/src/app/extend/context.ts +282 -0
  152. package/src/app/extend/helper.ts +5 -0
  153. package/src/app/extend/response.ts +95 -0
  154. package/src/app/middleware/securities.ts +63 -0
  155. package/src/app.ts +31 -0
  156. package/src/config/config.default.ts +379 -0
  157. package/src/config/config.local.ts +9 -0
  158. package/src/index.ts +12 -0
  159. package/src/lib/extend/safe_curl.ts +35 -0
  160. package/src/lib/helper/cliFilter.ts +20 -0
  161. package/src/lib/helper/escape.ts +3 -0
  162. package/src/lib/helper/escapeShellArg.ts +4 -0
  163. package/src/lib/helper/escapeShellCmd.ts +16 -0
  164. package/src/lib/helper/index.ts +21 -0
  165. package/src/lib/helper/shtml.ts +77 -0
  166. package/src/lib/helper/sjs.ts +57 -0
  167. package/src/lib/helper/sjson.ts +35 -0
  168. package/src/lib/helper/spath.ts +27 -0
  169. package/src/lib/helper/surl.ts +35 -0
  170. package/src/lib/middlewares/csp.ts +70 -0
  171. package/src/lib/middlewares/csrf.ts +44 -0
  172. package/src/lib/middlewares/dta.ts +13 -0
  173. package/src/lib/middlewares/hsts.ts +24 -0
  174. package/src/lib/middlewares/index.ts +23 -0
  175. package/src/lib/middlewares/methodnoallow.ts +23 -0
  176. package/src/lib/middlewares/noopen.ts +18 -0
  177. package/src/lib/middlewares/nosniff.ts +32 -0
  178. package/src/lib/middlewares/referrerPolicy.ts +39 -0
  179. package/src/lib/middlewares/xframe.ts +20 -0
  180. package/src/lib/middlewares/xssProtection.ts +17 -0
  181. package/src/lib/utils.ts +208 -0
  182. package/src/types.ts +16 -0
  183. package/src/typings/index.d.ts +4 -0
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = shtml;
7
+ const xss_1 = __importDefault(require("xss"));
8
+ const utils_js_1 = require("../utils.js");
9
+ const BUILD_IN_ON_TAG_ATTR = Symbol('buildInOnTagAttr');
10
+ // default rule: https://github.com/leizongmin/js-xss/blob/master/lib/default.js
11
+ // add domain filter based on xss module
12
+ // custom options http://jsxss.com/zh/options.html
13
+ // eg: support a tag,filter attributes except for title : whiteList: {a: ['title']}
14
+ function shtml(val) {
15
+ if (typeof val !== 'string') {
16
+ return val;
17
+ }
18
+ const securityOptions = this.ctx.securityOptions;
19
+ let buildInOnTagAttrHandler;
20
+ const shtmlConfig = {
21
+ ...this.app.config.helper.shtml,
22
+ ...securityOptions.shtml,
23
+ [BUILD_IN_ON_TAG_ATTR]: buildInOnTagAttrHandler,
24
+ };
25
+ const domainWhiteList = this.app.config.security.domainWhiteList;
26
+ const app = this.app;
27
+ // filter href and src attribute if not in domain white list
28
+ if (!shtmlConfig[BUILD_IN_ON_TAG_ATTR]) {
29
+ shtmlConfig[BUILD_IN_ON_TAG_ATTR] = (_tag, name, value, isWhiteAttr) => {
30
+ if (isWhiteAttr && (name === 'href' || name === 'src')) {
31
+ if (!value) {
32
+ return;
33
+ }
34
+ value = String(value);
35
+ if (value[0] === '/' || value[0] === '#') {
36
+ return;
37
+ }
38
+ const hostname = (0, utils_js_1.getFromUrl)(value, 'hostname');
39
+ if (!hostname) {
40
+ return;
41
+ }
42
+ // If we don't have our hostname in the app.security.domainWhiteList,
43
+ // Just check for `shtmlConfig.domainWhiteList` and `ctx.whiteList`.
44
+ if (!(0, utils_js_1.isSafeDomain)(hostname, domainWhiteList)) {
45
+ // Check for `shtmlConfig.domainWhiteList` first (duplicated now)
46
+ if (shtmlConfig.domainWhiteList && shtmlConfig.domainWhiteList.length > 0) {
47
+ app.deprecate('[@eggjs/security/lib/helper/shtml] `config.helper.shtml.domainWhiteList` has been deprecate. Please use `config.security.domainWhiteList` instead.');
48
+ if (!(0, utils_js_1.isSafeDomain)(hostname, shtmlConfig.domainWhiteList)) {
49
+ return '';
50
+ }
51
+ }
52
+ else {
53
+ return '';
54
+ }
55
+ }
56
+ }
57
+ };
58
+ // avoid overriding user configuration 'onTagAttr'
59
+ if (shtmlConfig.onTagAttr) {
60
+ const customOnTagAttrHandler = shtmlConfig.onTagAttr;
61
+ shtmlConfig.onTagAttr = function (tag, name, value, isWhiteAttr) {
62
+ const result = customOnTagAttrHandler.apply(this, [tag, name, value, isWhiteAttr]);
63
+ if (result !== undefined) {
64
+ return result;
65
+ }
66
+ // fallback to build-in handler
67
+ return shtmlConfig[BUILD_IN_ON_TAG_ATTR].apply(this, [tag, name, value, isWhiteAttr]);
68
+ };
69
+ }
70
+ else {
71
+ shtmlConfig.onTagAttr = shtmlConfig[BUILD_IN_ON_TAG_ATTR];
72
+ }
73
+ }
74
+ return (0, xss_1.default)(val, shtmlConfig);
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2h0bWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zaHRtbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVdBLHdCQWlFQztBQTNFRCw4Q0FBc0I7QUFDdEIsMENBQXVEO0FBR3ZELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFeEQsZ0ZBQWdGO0FBQ2hGLHdDQUF3QztBQUN4QyxrREFBa0Q7QUFDbEQsbUZBQW1GO0FBQ25GLFNBQXdCLEtBQUssQ0FBeUIsR0FBVztJQUMvRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0lBQ2pELElBQUksdUJBQW1FLENBQUM7SUFDeEUsTUFBTSxXQUFXLEdBQUc7UUFDbEIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztRQUMvQixHQUFHLGVBQWUsQ0FBQyxLQUFLO1FBQ3hCLENBQUMsb0JBQW9CLENBQUMsRUFBRSx1QkFBdUI7S0FDaEQsQ0FBQztJQUNGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7SUFDakUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNyQiw0REFBNEQ7SUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDdkMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUNyRSxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxPQUFPO2dCQUNULENBQUM7Z0JBRUQsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDekMsT0FBTztnQkFDVCxDQUFDO2dCQUVELE1BQU0sUUFBUSxHQUFHLElBQUEscUJBQVUsRUFBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxPQUFPO2dCQUNULENBQUM7Z0JBRUQscUVBQXFFO2dCQUNyRSxvRUFBb0U7Z0JBQ3BFLElBQUksQ0FBQyxJQUFBLHVCQUFZLEVBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLGlFQUFpRTtvQkFDakUsSUFBSSxXQUFXLENBQUMsZUFBZSxJQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUMxRSxHQUFHLENBQUMsU0FBUyxDQUFDLG9KQUFvSixDQUFDLENBQUM7d0JBQ3BLLElBQUksQ0FBQyxJQUFBLHVCQUFZLEVBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDOzRCQUN6RCxPQUFPLEVBQUUsQ0FBQzt3QkFDWixDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLEVBQUUsQ0FBQztvQkFDWixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsa0RBQWtEO1FBQ2xELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sc0JBQXNCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztZQUNyRCxXQUFXLENBQUMsU0FBUyxHQUFHLFVBQVMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBRSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN6QixPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCwrQkFBK0I7Z0JBQy9CLE9BQU8sV0FBVyxDQUFDLG9CQUFvQixDQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBRSxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFBLGFBQUcsRUFBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDL0IsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Escape JavaScript to \xHH format
3
+ */
4
+ export default function escapeJavaScript(text: string): string;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * Escape JavaScript to \xHH format
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = escapeJavaScript;
7
+ // escape \x00-\x7f
8
+ // except 0-9,A-Z,a-z(\x2f-\x3a \x40-\x5b \x60-\x7b)
9
+ // eslint-disable-next-line
10
+ const MATCH_VULNERABLE_REGEXP = /[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]/;
11
+ // eslint-enable-next-line
12
+ const BASIC_ALPHABETS = new Set('abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''));
13
+ const map = {
14
+ '\t': '\\t',
15
+ '\n': '\\n',
16
+ '\r': '\\r',
17
+ };
18
+ function escapeJavaScript(text) {
19
+ const str = '' + text;
20
+ const match = MATCH_VULNERABLE_REGEXP.exec(str);
21
+ if (!match) {
22
+ return str;
23
+ }
24
+ let res = '';
25
+ let index = 0;
26
+ let lastIndex = 0;
27
+ let ascii;
28
+ for (index = match.index; index < str.length; index++) {
29
+ ascii = str[index];
30
+ if (BASIC_ALPHABETS.has(ascii)) {
31
+ continue;
32
+ }
33
+ else {
34
+ if (map[ascii] === undefined) {
35
+ const code = ascii.charCodeAt(0);
36
+ if (code > 127) {
37
+ continue;
38
+ }
39
+ else {
40
+ map[ascii] = '\\x' + code.toString(16);
41
+ }
42
+ }
43
+ }
44
+ if (lastIndex !== index) {
45
+ res += str.substring(lastIndex, index);
46
+ }
47
+ lastIndex = index + 1;
48
+ res += map[ascii];
49
+ }
50
+ return lastIndex !== index ? res + str.substring(lastIndex, index) : res;
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2pzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9oZWxwZXIvc2pzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUFpQkgsbUNBcUNDO0FBcERELG1CQUFtQjtBQUNuQixvREFBb0Q7QUFFcEQsMkJBQTJCO0FBQzNCLE1BQU0sdUJBQXVCLEdBQUcsd0NBQXdDLENBQUM7QUFDekUsMEJBQTBCO0FBRTFCLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLGdFQUFnRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTVHLE1BQU0sR0FBRyxHQUEyQjtJQUNsQyxJQUFJLEVBQUUsS0FBSztJQUNYLElBQUksRUFBRSxLQUFLO0lBQ1gsSUFBSSxFQUFFLEtBQUs7Q0FDWixDQUFDO0FBRUYsU0FBd0IsZ0JBQWdCLENBQUMsSUFBWTtJQUNuRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsSUFBSSxLQUFLLENBQUM7SUFFVixLQUFLLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdEQsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixTQUFTO1FBQ1gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBSSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ2YsU0FBUztnQkFDWCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN4QixHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ export default function jsonEscape(obj: any): string;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = jsonEscape;
7
+ const sjs_js_1 = __importDefault(require("./sjs.js"));
8
+ /**
9
+ * escape json
10
+ * for output json in script
11
+ */
12
+ function sanitizeKey(obj) {
13
+ if (typeof obj !== 'object')
14
+ return obj;
15
+ if (Array.isArray(obj))
16
+ return obj;
17
+ if (obj === null)
18
+ return null;
19
+ if (typeof obj === 'boolean')
20
+ return obj;
21
+ if (typeof obj === 'number')
22
+ return obj;
23
+ if (Buffer.isBuffer(obj))
24
+ return obj.toString();
25
+ for (const k in obj) {
26
+ const escapedK = (0, sjs_js_1.default)(k);
27
+ if (escapedK !== k) {
28
+ obj[escapedK] = sanitizeKey(obj[k]);
29
+ obj[k] = undefined;
30
+ }
31
+ else {
32
+ obj[k] = sanitizeKey(obj[k]);
33
+ }
34
+ }
35
+ return obj;
36
+ }
37
+ function jsonEscape(obj) {
38
+ return JSON.stringify(sanitizeKey(obj), (_k, v) => {
39
+ if (typeof v === 'string') {
40
+ return (0, sjs_js_1.default)(v);
41
+ }
42
+ return v;
43
+ });
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2pzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTJCQSw2QkFPQztBQWxDRCxzREFBMkI7QUFFM0I7OztHQUdHO0FBRUgsU0FBUyxXQUFXLENBQUMsR0FBUTtJQUMzQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDbkMsSUFBSSxHQUFHLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLElBQUksT0FBTyxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQUcsRUFBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDckIsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBd0IsVUFBVSxDQUFDLEdBQVE7SUFDekMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNoRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBQSxnQkFBRyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
@@ -0,0 +1,5 @@
1
+ /**
2
+ * File Inclusion
3
+ */
4
+ import type { BaseContextClass } from '@eggjs/core';
5
+ export default function pathFilter(this: BaseContextClass, path: string): string | null;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * File Inclusion
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = pathFilter;
7
+ function pathFilter(path) {
8
+ if (typeof path !== 'string')
9
+ return path;
10
+ const pathSource = path;
11
+ while (path.indexOf('%') !== -1) {
12
+ try {
13
+ path = decodeURIComponent(path);
14
+ }
15
+ catch (e) {
16
+ if (process.env.NODE_ENV !== 'production') {
17
+ // Not a PROD env, logging with a warning.
18
+ this.ctx.coreLogger.warn('[@eggjs/security/lib/helper/spath] : decode file path %j failed.', path);
19
+ }
20
+ break;
21
+ }
22
+ }
23
+ if (path.indexOf('..') !== -1 || path[0] === '/') {
24
+ return null;
25
+ }
26
+ return pathSource;
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBSUgsNkJBb0JDO0FBcEJELFNBQXdCLFVBQVUsQ0FBeUIsSUFBWTtJQUNyRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUUxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFFeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDMUMsMENBQTBDO2dCQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0VBQWtFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUNELE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ import type { BaseContextClass } from '@eggjs/core';
2
+ export default function surl(this: BaseContextClass, val: string): string;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = surl;
4
+ const escapeMap = {
5
+ '"': '&quot;',
6
+ '<': '&lt;',
7
+ '>': '&gt;',
8
+ '\'': '&#x27;',
9
+ };
10
+ function surl(val) {
11
+ // Just get the converted the protocolWhiteList in `Set` mode,
12
+ // Avoid conversions in `foreach`
13
+ const protocolWhiteListSet = this.app.config.security.__protocolWhiteListSet;
14
+ if (typeof val !== 'string') {
15
+ return val;
16
+ }
17
+ // only test on absolute path
18
+ if (val[0] !== '/') {
19
+ const arr = val.split('://', 2);
20
+ const protocol = arr.length > 1 ? arr[0].toLowerCase() : '';
21
+ if (protocol === '' || !protocolWhiteListSet.has(protocol)) {
22
+ if (this.app.config.env === 'local') {
23
+ this.ctx.coreLogger.warn('[@eggjs/security/surl] url: %j, protocol: %j, ' +
24
+ 'protocol is empty or not in white list, convert to empty string', val, protocol);
25
+ }
26
+ return '';
27
+ }
28
+ }
29
+ return val.replace(/["'<>]/g, ch => {
30
+ return escapeMap[ch];
31
+ });
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaGVscGVyL3N1cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSx1QkF5QkM7QUFoQ0QsTUFBTSxTQUFTLEdBQTJCO0lBQ3hDLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLE1BQU07SUFDWCxHQUFHLEVBQUUsTUFBTTtJQUNYLElBQUksRUFBRSxRQUFRO0NBQ2YsQ0FBQztBQUVGLFNBQXdCLElBQUksQ0FBeUIsR0FBVztJQUM5RCw4REFBOEQ7SUFDOUQsaUNBQWlDO0lBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUF1QixDQUFDO0lBRTlFLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdEQUFnRDtvQkFDdkUsaUVBQWlFLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNqQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ import type { SecurityConfig } from '../../types.js';
3
+ declare const _default: (options: SecurityConfig["csp"]) => (ctx: Context, next: Next) => Promise<void>;
4
+ export default _default;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const extend_1 = __importDefault(require("extend"));
7
+ const utils_js_1 = require("../utils.js");
8
+ const HEADER = [
9
+ 'x-content-security-policy',
10
+ 'content-security-policy',
11
+ ];
12
+ const REPORT_ONLY_HEADER = [
13
+ 'x-content-security-policy-report-only',
14
+ 'content-security-policy-report-only',
15
+ ];
16
+ // Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
17
+ const MSIE_REGEXP = / MSIE /i;
18
+ exports.default = (options) => {
19
+ return async function csp(ctx, next) {
20
+ await next();
21
+ const opts = {
22
+ ...options,
23
+ ...ctx.securityOptions.csp,
24
+ };
25
+ if ((0, utils_js_1.checkIfIgnore)(opts, ctx))
26
+ return;
27
+ let finalHeader;
28
+ const matchedOption = (0, extend_1.default)(true, {}, opts.policy);
29
+ const bufArray = [];
30
+ const headers = opts.reportOnly ? REPORT_ONLY_HEADER : HEADER;
31
+ if (opts.supportIE && MSIE_REGEXP.test(ctx.get('user-agent'))) {
32
+ finalHeader = headers[0];
33
+ }
34
+ else {
35
+ finalHeader = headers[1];
36
+ }
37
+ for (const key in matchedOption) {
38
+ const value = matchedOption[key];
39
+ // Other arrays are splitted into strings EXCEPT `sandbox`
40
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox
41
+ if (key === 'sandbox' && value === true) {
42
+ bufArray.push(key);
43
+ }
44
+ else {
45
+ let values = (Array.isArray(value) ? value : [value]);
46
+ if (key === 'script-src') {
47
+ const hasNonce = values.some(function (val) {
48
+ return val.indexOf('nonce-') !== -1;
49
+ });
50
+ if (!hasNonce) {
51
+ values.push('\'nonce-' + ctx.nonce + '\'');
52
+ }
53
+ }
54
+ values = values.map(function (d) {
55
+ if (d.startsWith('.')) {
56
+ d = '*' + d;
57
+ }
58
+ return d;
59
+ });
60
+ bufArray.push(key + ' ' + values.join(' '));
61
+ }
62
+ }
63
+ const headerString = bufArray.join(';');
64
+ ctx.set(finalHeader, headerString);
65
+ ctx.set('x-csp-nonce', ctx.nonce);
66
+ };
67
+ };
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9jc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsMENBQTRDO0FBRzVDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsMkJBQTJCO0lBQzNCLHlCQUF5QjtDQUMxQixDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRztJQUN6Qix1Q0FBdUM7SUFDdkMscUNBQXFDO0NBQ3RDLENBQUM7QUFFRixxREFBcUQ7QUFDckQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDO0FBRTlCLGtCQUFlLENBQUMsT0FBOEIsRUFBRSxFQUFFO0lBQ2hELE9BQU8sS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUNoRCxNQUFNLElBQUksRUFBRSxDQUFDO1FBRWIsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLE9BQU87WUFDVixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRztTQUMzQixDQUFDO1FBQ0YsSUFBSSxJQUFBLHdCQUFhLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFckMsSUFBSSxXQUFXLENBQUM7UUFDaEIsTUFBTSxhQUFhLEdBQUcsSUFBQSxnQkFBTSxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlELFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQywwREFBMEQ7WUFDMUQsNEZBQTRGO1lBQzVGLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLEtBQUssQ0FBRSxDQUFhLENBQUM7Z0JBQ3BFLElBQUksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO29CQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVMsR0FBRzt3QkFDdkMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxDQUFDLENBQUMsQ0FBQztvQkFFSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3RCLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ import type { SecurityConfig } from '../../types.js';
3
+ declare const _default: (options: SecurityConfig["csrf"]) => (ctx: Context, next: Next) => Promise<void>;
4
+ export default _default;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_util_1 = require("node:util");
7
+ const type_is_1 = __importDefault(require("type-is"));
8
+ const utils_js_1 = require("../utils.js");
9
+ const debug = (0, node_util_1.debuglog)('@eggjs/security/lib/middlewares/csrf');
10
+ exports.default = (options) => {
11
+ return function csrf(ctx, next) {
12
+ if ((0, utils_js_1.checkIfIgnore)(options, ctx)) {
13
+ return next();
14
+ }
15
+ // ensure csrf token exists
16
+ if (['any', 'all', 'ctoken'].includes(options.type)) {
17
+ ctx.ensureCsrfSecret();
18
+ }
19
+ // supported requests
20
+ const method = ctx.method;
21
+ let isSupported = false;
22
+ for (const eachRule of options.supportedRequests) {
23
+ if (eachRule.path.test(ctx.path)) {
24
+ if (eachRule.methods.includes(method)) {
25
+ isSupported = true;
26
+ break;
27
+ }
28
+ }
29
+ }
30
+ if (!isSupported) {
31
+ return next();
32
+ }
33
+ if (options.ignoreJSON && type_is_1.default.is(ctx.get('content-type'), 'json')) {
34
+ return next();
35
+ }
36
+ const body = ctx.request.body;
37
+ debug('%s %s, got %j', ctx.method, ctx.url, body);
38
+ ctx.assertCsrf();
39
+ return next();
40
+ };
41
+ };
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvY3NyZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlDQUFxQztBQUVyQyxzREFBNkI7QUFDN0IsMENBQTRDO0FBRzVDLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBRS9ELGtCQUFlLENBQUMsT0FBK0IsRUFBRSxFQUFFO0lBQ2pELE9BQU8sU0FBUyxJQUFJLENBQUMsR0FBWSxFQUFFLElBQVU7UUFDM0MsSUFBSSxJQUFBLHdCQUFhLEVBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksQ0FBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0RCxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLEtBQUssTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUN0QyxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksaUJBQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ declare const _default: () => (ctx: Context, next: Next) => Promise<void>;
3
+ export default _default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_js_1 = require("../utils.js");
4
+ // https://en.wikipedia.org/wiki/Directory_traversal_attack
5
+ exports.default = () => {
6
+ return function dta(ctx, next) {
7
+ const path = ctx.path;
8
+ if (!(0, utils_js_1.isSafePath)(path, ctx)) {
9
+ ctx.throw(400);
10
+ }
11
+ return next();
12
+ };
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9kdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwwQ0FBeUM7QUFFekMsMkRBQTJEO0FBQzNELGtCQUFlLEdBQUcsRUFBRTtJQUNsQixPQUFPLFNBQVMsR0FBRyxDQUFDLEdBQVksRUFBRSxJQUFVO1FBQzFDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUEscUJBQVUsRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ import type { SecurityConfig } from '../../types.js';
3
+ declare const _default: (options: SecurityConfig["hsts"]) => (ctx: Context, next: Next) => Promise<void>;
4
+ export default _default;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_js_1 = require("../utils.js");
4
+ // Set Strict-Transport-Security header
5
+ exports.default = (options) => {
6
+ return async function hsts(ctx, next) {
7
+ await next();
8
+ const opts = {
9
+ ...options,
10
+ ...ctx.securityOptions.hsts,
11
+ };
12
+ if ((0, utils_js_1.checkIfIgnore)(opts, ctx))
13
+ return;
14
+ let val = 'max-age=' + opts.maxAge;
15
+ // If opts.includeSubdomains is defined,
16
+ // the rule is also valid for all the sub domains of the website
17
+ if (opts.includeSubdomains) {
18
+ val += '; includeSubdomains';
19
+ }
20
+ ctx.set('strict-transport-security', val);
21
+ };
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvaHN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDBDQUE0QztBQUc1Qyx1Q0FBdUM7QUFDdkMsa0JBQWUsQ0FBQyxPQUErQixFQUFFLEVBQUU7SUFDakQsT0FBTyxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQVksRUFBRSxJQUFVO1FBQ2pELE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJO1NBQzVCLENBQUM7UUFDRixJQUFJLElBQUEsd0JBQWEsRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxJQUFJLEdBQUcsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuQyx3Q0FBd0M7UUFDeEMsZ0VBQWdFO1FBQ2hFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsR0FBRyxJQUFJLHFCQUFxQixDQUFDO1FBQy9CLENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -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,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const csp_js_1 = __importDefault(require("./csp.js"));
7
+ const csrf_js_1 = __importDefault(require("./csrf.js"));
8
+ const dta_js_1 = __importDefault(require("./dta.js"));
9
+ const hsts_js_1 = __importDefault(require("./hsts.js"));
10
+ const methodnoallow_js_1 = __importDefault(require("./methodnoallow.js"));
11
+ const noopen_js_1 = __importDefault(require("./noopen.js"));
12
+ const nosniff_js_1 = __importDefault(require("./nosniff.js"));
13
+ const referrerPolicy_js_1 = __importDefault(require("./referrerPolicy.js"));
14
+ const xframe_js_1 = __importDefault(require("./xframe.js"));
15
+ const xssProtection_js_1 = __importDefault(require("./xssProtection.js"));
16
+ exports.default = {
17
+ csp: csp_js_1.default,
18
+ csrf: csrf_js_1.default,
19
+ dta: dta_js_1.default,
20
+ hsts: hsts_js_1.default,
21
+ methodnoallow: methodnoallow_js_1.default,
22
+ noopen: noopen_js_1.default,
23
+ nosniff: nosniff_js_1.default,
24
+ referrerPolicy: referrerPolicy_js_1.default,
25
+ xframe: xframe_js_1.default,
26
+ xssProtection: xssProtection_js_1.default,
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21pZGRsZXdhcmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQTJCO0FBQzNCLHdEQUE2QjtBQUM3QixzREFBMkI7QUFDM0Isd0RBQTZCO0FBQzdCLDBFQUErQztBQUMvQyw0REFBaUM7QUFDakMsOERBQW1DO0FBQ25DLDRFQUFpRDtBQUNqRCw0REFBaUM7QUFDakMsMEVBQStDO0FBRS9DLGtCQUFlO0lBQ2IsR0FBRyxFQUFILGdCQUFHO0lBQ0gsSUFBSSxFQUFKLGlCQUFJO0lBQ0osR0FBRyxFQUFILGdCQUFHO0lBQ0gsSUFBSSxFQUFKLGlCQUFJO0lBQ0osYUFBYSxFQUFiLDBCQUFhO0lBQ2IsTUFBTSxFQUFOLG1CQUFNO0lBQ04sT0FBTyxFQUFQLG9CQUFPO0lBQ1AsY0FBYyxFQUFkLDJCQUFjO0lBQ2QsTUFBTSxFQUFOLG1CQUFNO0lBQ04sYUFBYSxFQUFiLDBCQUFhO0NBQ2QsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ declare const _default: () => (ctx: Context, next: Next) => Promise<void>;
3
+ export default _default;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_http_1 = require("node:http");
4
+ const METHODS_NOT_ALLOWED = ['TRACE', 'TRACK'];
5
+ const safeHttpMethodsMap = {};
6
+ for (const method of node_http_1.METHODS) {
7
+ if (!METHODS_NOT_ALLOWED.includes(method)) {
8
+ safeHttpMethodsMap[method.toUpperCase()] = true;
9
+ }
10
+ }
11
+ // https://www.owasp.org/index.php/Cross_Site_Tracing
12
+ // http://jsperf.com/find-by-map-with-find-by-array
13
+ exports.default = () => {
14
+ return function notAllow(ctx, next) {
15
+ // ctx.method is upper case
16
+ if (!safeHttpMethodsMap[ctx.method]) {
17
+ ctx.throw(405);
18
+ }
19
+ return next();
20
+ };
21
+ };
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kbm9hbGxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbWV0aG9kbm9hbGxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFvQztBQUdwQyxNQUFNLG1CQUFtQixHQUFHLENBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBRSxDQUFDO0FBQ2pELE1BQU0sa0JBQWtCLEdBQTRCLEVBQUUsQ0FBQztBQUV2RCxLQUFLLE1BQU0sTUFBTSxJQUFJLG1CQUFPLEVBQUUsQ0FBQztJQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2xELENBQUM7QUFDSCxDQUFDO0FBRUQscURBQXFEO0FBQ3JELG1EQUFtRDtBQUNuRCxrQkFBZSxHQUFHLEVBQUU7SUFDbEIsT0FBTyxTQUFTLFFBQVEsQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUMvQywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ import type { SecurityConfig } from '../../types.js';
3
+ declare const _default: (options: SecurityConfig["noopen"]) => (ctx: Context, next: Next) => Promise<void>;
4
+ export default _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_js_1 = require("../utils.js");
4
+ // @see http://blogs.msdn.com/b/ieinternals/archive/2009/06/30/internet-explorer-custom-http-headers.aspx
5
+ exports.default = (options) => {
6
+ return async function noopen(ctx, next) {
7
+ await next();
8
+ const opts = {
9
+ ...options,
10
+ ...ctx.securityOptions.noopen,
11
+ };
12
+ if ((0, utils_js_1.checkIfIgnore)(opts, ctx))
13
+ return;
14
+ ctx.set('x-download-options', 'noopen');
15
+ };
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcGVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9ub29wZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwwQ0FBNEM7QUFHNUMseUdBQXlHO0FBQ3pHLGtCQUFlLENBQUMsT0FBaUMsRUFBRSxFQUFFO0lBQ25ELE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFZLEVBQUUsSUFBVTtRQUNuRCxNQUFNLElBQUksRUFBRSxDQUFDO1FBRWIsTUFBTSxJQUFJLEdBQUc7WUFDWCxHQUFHLE9BQU87WUFDVixHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTTtTQUM5QixDQUFDO1FBQ0YsSUFBSSxJQUFBLHdCQUFhLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFckMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ import type { SecurityConfig } from '../../types.js';
3
+ declare const _default: (options: SecurityConfig["nosniff"]) => (ctx: Context, next: Next) => Promise<void>;
4
+ export default _default;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_js_1 = require("../utils.js");
4
+ // status codes for redirects
5
+ // @see https://github.com/jshttp/statuses/blob/master/index.js#L33
6
+ const RedirectStatus = {
7
+ 300: true,
8
+ 301: true,
9
+ 302: true,
10
+ 303: true,
11
+ 305: true,
12
+ 307: true,
13
+ 308: true,
14
+ };
15
+ exports.default = (options) => {
16
+ return async function nosniff(ctx, next) {
17
+ await next();
18
+ // ignore redirect response
19
+ if (RedirectStatus[ctx.status])
20
+ return;
21
+ const opts = {
22
+ ...options,
23
+ ...ctx.securityOptions.nosniff,
24
+ };
25
+ if ((0, utils_js_1.checkIfIgnore)(opts, ctx))
26
+ return;
27
+ ctx.set('x-content-type-options', 'nosniff');
28
+ };
29
+ };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9zbmlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbm9zbmlmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDBDQUE0QztBQUc1Qyw2QkFBNkI7QUFDN0IsbUVBQW1FO0FBQ25FLE1BQU0sY0FBYyxHQUE0QjtJQUM5QyxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtDQUNWLENBQUM7QUFFRixrQkFBZSxDQUFDLE9BQWtDLEVBQUUsRUFBRTtJQUNwRCxPQUFPLEtBQUssVUFBVSxPQUFPLENBQUMsR0FBWSxFQUFFLElBQVU7UUFDcEQsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLDJCQUEyQjtRQUMzQixJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTztRQUV2QyxNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1NBQy9CLENBQUM7UUFDRixJQUFJLElBQUEsd0JBQWEsRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxHQUFHLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import type { Context, Next } from '@eggjs/core';
2
+ import type { SecurityConfig } from '../../types.js';
3
+ declare const _default: (options: SecurityConfig["referrerPolicy"]) => (ctx: Context, next: Next) => Promise<void>;
4
+ export default _default;