@cosui/genui-toolkit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -0
- package/bin/genui +2 -0
- package/dist/auth.d.ts +3 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +132 -0
- package/dist/auth.js.map +1 -0
- package/dist/check/artifact.d.ts +16 -0
- package/dist/check/artifact.d.ts.map +1 -0
- package/dist/check/artifact.js +209 -0
- package/dist/check/artifact.js.map +1 -0
- package/dist/check/checker.d.ts +6 -0
- package/dist/check/checker.d.ts.map +1 -0
- package/dist/check/checker.js +79 -0
- package/dist/check/checker.js.map +1 -0
- package/dist/check/cli.d.ts +5 -0
- package/dist/check/cli.d.ts.map +1 -0
- package/dist/check/cli.js +110 -0
- package/dist/check/cli.js.map +1 -0
- package/dist/check/rules/artifact.d.ts +3 -0
- package/dist/check/rules/artifact.d.ts.map +1 -0
- package/dist/check/rules/artifact.js +96 -0
- package/dist/check/rules/artifact.js.map +1 -0
- package/dist/check/rules/common.d.ts +16 -0
- package/dist/check/rules/common.d.ts.map +1 -0
- package/dist/check/rules/common.js +60 -0
- package/dist/check/rules/common.js.map +1 -0
- package/dist/check/rules/file.d.ts +3 -0
- package/dist/check/rules/file.d.ts.map +1 -0
- package/dist/check/rules/file.js +157 -0
- package/dist/check/rules/file.js.map +1 -0
- package/dist/check/rules/html.d.ts +3 -0
- package/dist/check/rules/html.d.ts.map +1 -0
- package/dist/check/rules/html.js +414 -0
- package/dist/check/rules/html.js.map +1 -0
- package/dist/check/rules/index.d.ts +6 -0
- package/dist/check/rules/index.d.ts.map +1 -0
- package/dist/check/rules/index.js +59 -0
- package/dist/check/rules/index.js.map +1 -0
- package/dist/check/rules/javascript.d.ts +3 -0
- package/dist/check/rules/javascript.d.ts.map +1 -0
- package/dist/check/rules/javascript.js +541 -0
- package/dist/check/rules/javascript.js.map +1 -0
- package/dist/check/rules/svg.d.ts +8 -0
- package/dist/check/rules/svg.d.ts.map +1 -0
- package/dist/check/rules/svg.js +100 -0
- package/dist/check/rules/svg.js.map +1 -0
- package/dist/check/types.d.ts +50 -0
- package/dist/check/types.d.ts.map +1 -0
- package/dist/check/types.js +3 -0
- package/dist/check/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +25 -0
- package/dist/env.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +42 -0
- package/dist/output.js.map +1 -0
- package/dist/preview.d.ts +21 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +295 -0
- package/dist/preview.js.map +1 -0
- package/dist/project.d.ts +5 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +22 -0
- package/dist/project.js.map +1 -0
- package/dist/push.d.ts +2 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +322 -0
- package/dist/push.js.map +1 -0
- package/dist/remote.d.ts +15 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +73 -0
- package/dist/remote.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.htmlRule = void 0;
|
|
37
|
+
const parse5 = __importStar(require("parse5"));
|
|
38
|
+
const common_1 = require("./common");
|
|
39
|
+
const ruleId = 'html';
|
|
40
|
+
const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
|
|
41
|
+
const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
|
|
42
|
+
const NAVIGATION_TAGS = new Set(['a', 'area']);
|
|
43
|
+
const NAVIGATION_TARGET_TAGS = new Set(['a', 'area', 'base', 'form']);
|
|
44
|
+
const JAVASCRIPT_URL_ATTRIBUTES = new Map([
|
|
45
|
+
['a', new Set(['href'])],
|
|
46
|
+
['area', new Set(['href'])],
|
|
47
|
+
['form', new Set(['action'])],
|
|
48
|
+
]);
|
|
49
|
+
const FORBIDDEN_EMBEDDED_ELEMENTS = new Set([
|
|
50
|
+
'iframe',
|
|
51
|
+
'frame',
|
|
52
|
+
'fencedframe',
|
|
53
|
+
'object',
|
|
54
|
+
'embed',
|
|
55
|
+
]);
|
|
56
|
+
const NAVIGATION_TARGETS = new Set(['_top', '_parent', '_blank']);
|
|
57
|
+
/**
|
|
58
|
+
* 创建所有 HTML 规则共享的解析上下文
|
|
59
|
+
*/
|
|
60
|
+
async function createContext(file) {
|
|
61
|
+
const source = await (0, common_1.readUtf8)(file);
|
|
62
|
+
const document = parse5.parse(source, { sourceCodeLocationInfo: true });
|
|
63
|
+
return {
|
|
64
|
+
file,
|
|
65
|
+
document,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function getTagName(node) {
|
|
69
|
+
return (node.tagName ?? '').toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 深度优先遍历 HTML AST
|
|
73
|
+
*/
|
|
74
|
+
function walk(node, visitor, parentForm) {
|
|
75
|
+
const ancestorForm = getTagName(node) === 'form' ? node : parentForm;
|
|
76
|
+
visitor(node, ancestorForm);
|
|
77
|
+
for (const child of node.childNodes ?? []) {
|
|
78
|
+
walk(child, visitor, ancestorForm);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function getAttributes(node) {
|
|
82
|
+
return node.attrs ?? [];
|
|
83
|
+
}
|
|
84
|
+
function createAttributeMap(node) {
|
|
85
|
+
return new Map(getAttributes(node).map(attribute => [
|
|
86
|
+
attribute.name.toLowerCase(),
|
|
87
|
+
attribute,
|
|
88
|
+
]));
|
|
89
|
+
}
|
|
90
|
+
function getLocation(node, attributeName) {
|
|
91
|
+
const attributeLocation = attributeName
|
|
92
|
+
? node.sourceCodeLocation?.attrs?.[attributeName.toLowerCase()]
|
|
93
|
+
: undefined;
|
|
94
|
+
const location = attributeLocation ?? node.sourceCodeLocation;
|
|
95
|
+
return location?.startLine !== undefined && location.startCol !== undefined
|
|
96
|
+
? { line: location.startLine, column: location.startCol }
|
|
97
|
+
: {};
|
|
98
|
+
}
|
|
99
|
+
function isNavigationUrl(value) {
|
|
100
|
+
const normalized = value.trim().toLowerCase();
|
|
101
|
+
return normalized.length > 0
|
|
102
|
+
&& !normalized.startsWith('#')
|
|
103
|
+
&& !normalized.startsWith('?')
|
|
104
|
+
&& !normalized.startsWith('javascript:');
|
|
105
|
+
}
|
|
106
|
+
function getMetaRefreshTarget(value) {
|
|
107
|
+
const match = /^\s*\d+\s*(?:;(.*))?$/s.exec(value);
|
|
108
|
+
if (!match?.[1]) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
let target = match[1].trim().replace(/^url\s*=\s*/i, '').trim();
|
|
112
|
+
const quote = target[0];
|
|
113
|
+
if (target.length >= 2
|
|
114
|
+
&& ['"', '\''].includes(quote)
|
|
115
|
+
&& target.endsWith(quote)) {
|
|
116
|
+
target = target.slice(1, -1).trim();
|
|
117
|
+
}
|
|
118
|
+
return target || null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 禁止使用会改变相对资源路径基准的 base 标签
|
|
122
|
+
*/
|
|
123
|
+
function checkBase(node) {
|
|
124
|
+
if (getTagName(node) !== 'base') {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
...getLocation(node),
|
|
129
|
+
severity: 'error',
|
|
130
|
+
message: '请检查并移除<base>标签,改用相对当前文件的资源路径后重新打包上传',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 禁止 Meta Refresh 和非锚点页面跳转
|
|
135
|
+
*/
|
|
136
|
+
function checkNavigation(node) {
|
|
137
|
+
const tagName = getTagName(node);
|
|
138
|
+
const attributes = createAttributeMap(node);
|
|
139
|
+
const httpEquiv = attributes.get('http-equiv');
|
|
140
|
+
const content = attributes.get('content');
|
|
141
|
+
const refreshTarget = content ? getMetaRefreshTarget(content.value) : null;
|
|
142
|
+
const isRefresh = tagName === 'meta'
|
|
143
|
+
&& httpEquiv?.value.trim().toLowerCase() === 'refresh'
|
|
144
|
+
&& content
|
|
145
|
+
&& /^\s*\d+\s*(?:;|$)/.test(content.value);
|
|
146
|
+
if (isRefresh && (!refreshTarget || isNavigationUrl(refreshTarget))) {
|
|
147
|
+
return {
|
|
148
|
+
...getLocation(node, 'http-equiv'),
|
|
149
|
+
severity: 'error',
|
|
150
|
+
message: '页面包含自动跳转,请删除 Meta Refresh 并改用页面内锚点',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const href = attributes.get('href');
|
|
154
|
+
if (NAVIGATION_TAGS.has(tagName) && href && isNavigationUrl(href.value)) {
|
|
155
|
+
return {
|
|
156
|
+
...getLocation(node, 'href'),
|
|
157
|
+
severity: 'error',
|
|
158
|
+
message: '页面包含跳转链接,请删除该链接并改用页面内锚点',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 禁止可能跳出隔离容器或打开新窗口的 target
|
|
165
|
+
*/
|
|
166
|
+
function checkNavigationTarget(node, formsWithSubmitTarget) {
|
|
167
|
+
const tagName = getTagName(node);
|
|
168
|
+
if (!NAVIGATION_TARGET_TAGS.has(tagName)) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const attributes = createAttributeMap(node);
|
|
172
|
+
const target = attributes.get('target');
|
|
173
|
+
if (!target || !NAVIGATION_TARGETS.has(target.value.trim().toLowerCase())) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
if ((tagName === 'a' || tagName === 'area') && !attributes.get('href')?.value.trim()) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
if (tagName === 'form' && !formsWithSubmitTarget.has(node)) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
...getLocation(node, 'target'),
|
|
184
|
+
severity: 'error',
|
|
185
|
+
message: `链接使用了 target="${target.value.trim()}",请移除该属性`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 禁止导航和资源属性中的 javascript: 链接
|
|
190
|
+
*/
|
|
191
|
+
function checkJavascriptUrl(node) {
|
|
192
|
+
if (node.namespaceURI === SVG_NAMESPACE) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const supportedAttributes = JAVASCRIPT_URL_ATTRIBUTES.get(getTagName(node));
|
|
196
|
+
if (!supportedAttributes) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
for (const attribute of getAttributes(node)) {
|
|
200
|
+
if (supportedAttributes.has(attribute.name.toLowerCase())
|
|
201
|
+
&& attribute.value.trim().toLowerCase().startsWith('javascript:')) {
|
|
202
|
+
return {
|
|
203
|
+
...getLocation(node, attribute.name),
|
|
204
|
+
severity: 'error',
|
|
205
|
+
message: '链接使用了 javascript: 协议,请改用普通链接并通过 JavaScript 事件监听处理',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 禁止创建子页面、插件或其他嵌入式执行环境
|
|
213
|
+
*/
|
|
214
|
+
function checkEmbeddedElement(node) {
|
|
215
|
+
const tagName = getTagName(node);
|
|
216
|
+
if (node.namespaceURI !== HTML_NAMESPACE || !FORBIDDEN_EMBEDDED_ELEMENTS.has(tagName)) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
...getLocation(node),
|
|
221
|
+
severity: 'error',
|
|
222
|
+
message: `页面包含 <${tagName}> 标签,请移除该标签并将内容直接放到当前页面`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 禁止检查 onclick、onload 等行内事件属性
|
|
227
|
+
*/
|
|
228
|
+
function checkInlineHandler(node) {
|
|
229
|
+
if (node.namespaceURI === SVG_NAMESPACE) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
for (const attribute of getAttributes(node)) {
|
|
233
|
+
if ((0, common_1.isInlineHandlerAttribute)(attribute.name, getTagName(node))) {
|
|
234
|
+
return {
|
|
235
|
+
...getLocation(node, attribute.name),
|
|
236
|
+
severity: 'error',
|
|
237
|
+
message: '页面包含 onclick 等行内事件,请改用 JavaScript 事件监听',
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* 检查 HTML 文件中的内联 SVG;独立 .svg 文件由 svgRule 检查
|
|
245
|
+
* 禁止 SVG 脚本、行内事件和 JavaScript URI
|
|
246
|
+
*/
|
|
247
|
+
function checkSvgActiveContent(node) {
|
|
248
|
+
if (node.namespaceURI !== SVG_NAMESPACE) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
if (getTagName(node) === 'script') {
|
|
252
|
+
return {
|
|
253
|
+
...getLocation(node),
|
|
254
|
+
severity: 'error',
|
|
255
|
+
message: 'SVG 中包含 script 脚本,请删除该脚本',
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
for (const attribute of getAttributes(node)) {
|
|
259
|
+
const name = attribute.name.toLowerCase();
|
|
260
|
+
const isJavascriptUrl = ['href', 'xlink:href'].includes(name)
|
|
261
|
+
&& attribute.value.trim().toLowerCase().startsWith('javascript:');
|
|
262
|
+
if (isJavascriptUrl || (0, common_1.isInlineHandlerAttribute)(name, getTagName(node))) {
|
|
263
|
+
return {
|
|
264
|
+
...getLocation(node, attribute.name),
|
|
265
|
+
severity: 'error',
|
|
266
|
+
message: 'SVG 中包含行内事件或 javascript: 链接,请删除相关内容',
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 禁止 form 提交
|
|
274
|
+
*/
|
|
275
|
+
function checkFormAction(node, formOwner) {
|
|
276
|
+
const attributes = createAttributeMap(node);
|
|
277
|
+
const tagName = getTagName(node);
|
|
278
|
+
if (tagName === 'form'
|
|
279
|
+
&& attributes.has('action')
|
|
280
|
+
&& attributes.get('method')?.value.trim().toLowerCase() !== 'dialog') {
|
|
281
|
+
return {
|
|
282
|
+
...getLocation(node, 'action'),
|
|
283
|
+
severity: 'error',
|
|
284
|
+
message: '表单设置了提交地址,请阻止默认提交并改为在当前页面处理数据',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
const type = attributes.get('type')?.value.trim().toLowerCase() ?? '';
|
|
288
|
+
const isSubmitControl = tagName === 'button' && (!type || type === 'submit')
|
|
289
|
+
|| tagName === 'input' && ['submit', 'image'].includes(type);
|
|
290
|
+
if (formOwner
|
|
291
|
+
&& isSubmitControl
|
|
292
|
+
&& attributes.has('formaction')
|
|
293
|
+
&& attributes.get('formmethod')?.value.trim().toLowerCase() !== 'dialog') {
|
|
294
|
+
return {
|
|
295
|
+
...getLocation(node, 'formaction'),
|
|
296
|
+
severity: 'error',
|
|
297
|
+
message: '提交按钮设置了 formaction,请删除该属性并在当前页面处理数据',
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
function checkDownload(node) {
|
|
303
|
+
const attributes = createAttributeMap(node);
|
|
304
|
+
if (getTagName(node) !== 'a'
|
|
305
|
+
|| !attributes.has('download')
|
|
306
|
+
|| !attributes.get('href')?.value.trim()) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
...getLocation(node, 'download'),
|
|
311
|
+
severity: 'error',
|
|
312
|
+
message: '链接使用了 download 属性,请删除该属性并改为在页面内展示内容',
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
function checkManifest(node) {
|
|
316
|
+
const attributes = createAttributeMap(node);
|
|
317
|
+
const rel = new Set((attributes.get('rel')?.value ?? '').toLowerCase().split(/\s+/));
|
|
318
|
+
if (getTagName(node) !== 'link'
|
|
319
|
+
|| !rel.has('manifest')
|
|
320
|
+
|| !attributes.get('href')?.value.trim()) {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
...getLocation(node, 'rel'),
|
|
325
|
+
severity: 'warning',
|
|
326
|
+
message: '页面引用了 manifest 应用清单,请删除该链接',
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* HTML 规则统一入口
|
|
331
|
+
*
|
|
332
|
+
* HTML 文件只读取、解析一次,随后按顺序执行所有 HTML 规则
|
|
333
|
+
*/
|
|
334
|
+
async function checkHtmlRules(file) {
|
|
335
|
+
const context = await createContext(file);
|
|
336
|
+
const problems = [];
|
|
337
|
+
const elementsById = new Map();
|
|
338
|
+
walk(context.document, node => {
|
|
339
|
+
const id = createAttributeMap(node).get('id')?.value;
|
|
340
|
+
if (id && !elementsById.has(id)) {
|
|
341
|
+
elementsById.set(id, node);
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
const getFormOwner = (node, ancestorForm) => {
|
|
345
|
+
const formId = createAttributeMap(node).get('form');
|
|
346
|
+
const associatedElement = formId ? elementsById.get(formId.value) : ancestorForm;
|
|
347
|
+
return getTagName(associatedElement ?? {}) === 'form' ? associatedElement : undefined;
|
|
348
|
+
};
|
|
349
|
+
const formsWithSubmitTarget = new Set();
|
|
350
|
+
walk(context.document, (node, ancestorForm) => {
|
|
351
|
+
const attributes = createAttributeMap(node);
|
|
352
|
+
const tagName = getTagName(node);
|
|
353
|
+
if (tagName === 'form'
|
|
354
|
+
&& attributes.has('action')
|
|
355
|
+
&& attributes.get('method')?.value.trim().toLowerCase() !== 'dialog') {
|
|
356
|
+
formsWithSubmitTarget.add(node);
|
|
357
|
+
}
|
|
358
|
+
const type = attributes.get('type')?.value.trim().toLowerCase() ?? '';
|
|
359
|
+
const isSubmitControl = tagName === 'button' && (!type || type === 'submit')
|
|
360
|
+
|| tagName === 'input' && ['submit', 'image'].includes(type);
|
|
361
|
+
if (isSubmitControl
|
|
362
|
+
&& attributes.has('formaction')
|
|
363
|
+
&& attributes.get('formmethod')?.value.trim().toLowerCase() !== 'dialog') {
|
|
364
|
+
const owner = getFormOwner(node, ancestorForm);
|
|
365
|
+
if (owner) {
|
|
366
|
+
formsWithSubmitTarget.add(owner);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
const checks = [
|
|
371
|
+
checkBase,
|
|
372
|
+
checkNavigation,
|
|
373
|
+
checkJavascriptUrl,
|
|
374
|
+
checkEmbeddedElement,
|
|
375
|
+
checkInlineHandler,
|
|
376
|
+
checkSvgActiveContent,
|
|
377
|
+
checkDownload,
|
|
378
|
+
checkManifest,
|
|
379
|
+
];
|
|
380
|
+
walk(context.document, (node, ancestorForm) => {
|
|
381
|
+
const targetProblem = checkNavigationTarget(node, formsWithSubmitTarget);
|
|
382
|
+
if (targetProblem) {
|
|
383
|
+
problems.push(targetProblem);
|
|
384
|
+
}
|
|
385
|
+
const formOwner = getFormOwner(node, ancestorForm);
|
|
386
|
+
const formProblem = checkFormAction(node, formOwner);
|
|
387
|
+
if (formProblem) {
|
|
388
|
+
problems.push(formProblem);
|
|
389
|
+
}
|
|
390
|
+
for (const check of checks) {
|
|
391
|
+
const problem = check(node);
|
|
392
|
+
if (problem) {
|
|
393
|
+
problems.push(problem);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
return (0, common_1.toDiagnostics)(ruleId, problems.map(problem => ({
|
|
398
|
+
...problem,
|
|
399
|
+
file: context.file.name,
|
|
400
|
+
})));
|
|
401
|
+
}
|
|
402
|
+
exports.htmlRule = {
|
|
403
|
+
id: ruleId,
|
|
404
|
+
async check({ artifact }) {
|
|
405
|
+
const diagnostics = [];
|
|
406
|
+
for (const file of artifact.files.values()) {
|
|
407
|
+
if (file.path.toLowerCase().endsWith('.html')) {
|
|
408
|
+
diagnostics.push(...await checkHtmlRules((0, common_1.toFile)(file)));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return diagnostics;
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/check/rules/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/check/rules/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,UAAU,CAAC;AAEnC;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,IAAI,EAmDvB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rules = void 0;
|
|
4
|
+
const artifact_1 = require("./artifact");
|
|
5
|
+
const file_1 = require("./file");
|
|
6
|
+
const html_1 = require("./html");
|
|
7
|
+
const javascript_1 = require("./javascript");
|
|
8
|
+
const svg_1 = require("./svg");
|
|
9
|
+
/**
|
|
10
|
+
* 产物诊断规则注册表
|
|
11
|
+
*/
|
|
12
|
+
exports.rules = [
|
|
13
|
+
/**
|
|
14
|
+
* 拦截:
|
|
15
|
+
* 1、禁止不支持的 HTML/ZIP 格式,避免发布服务无法识别产物;
|
|
16
|
+
* 2、禁止缺少根 index.html,避免产物无法启动或加载;
|
|
17
|
+
* 3、禁止包含不支持的文件类型,避免产物无法启动或加载;
|
|
18
|
+
* 4、禁止超过体积上限,避免处理和发布时消耗异常资源。
|
|
19
|
+
*/
|
|
20
|
+
artifact_1.artifactRule,
|
|
21
|
+
/**
|
|
22
|
+
* 拦截:
|
|
23
|
+
* 1、禁止绝对路径、路径穿越、反斜杠和 NUL 路径,避免解包越出产物根目录;
|
|
24
|
+
* 2、禁止隐藏文件、软链接、设备文件和加密条目,避免携带不可控内容;
|
|
25
|
+
* 3、禁止确定的编码和语法解析错误,避免文件无法被发布服务加载。
|
|
26
|
+
*/
|
|
27
|
+
file_1.fileRule,
|
|
28
|
+
/**
|
|
29
|
+
* 拦截:
|
|
30
|
+
* 1、禁止 base 标签,避免改写资源路径基准;
|
|
31
|
+
* 2、禁止静态可确认的页面外跳,避免 iframe 离开当前产物并加载未经审核页面;
|
|
32
|
+
* 3、禁止 iframe、frame、fencedframe、object、embed 和 SVG 活跃内容,
|
|
33
|
+
* 避免创建未经审核的子页面、插件或脚本执行入口。
|
|
34
|
+
*
|
|
35
|
+
* 提醒:
|
|
36
|
+
* 1、禁止行内事件、JavaScript URI、表单、下载、manifest 和越界导航。
|
|
37
|
+
* 但仅做提醒,因为 script-src-attr、form-action、manifest CSP 和 sandbox 可以拦截。
|
|
38
|
+
*/
|
|
39
|
+
html_1.htmlRule,
|
|
40
|
+
/**
|
|
41
|
+
* 拦截:
|
|
42
|
+
* 1、禁止 SVG 脚本、行内事件和 JavaScript URI,避免通过 SVG 执行未纳入审核的代码。
|
|
43
|
+
*/
|
|
44
|
+
svg_1.svgRule,
|
|
45
|
+
/**
|
|
46
|
+
* 拦截:
|
|
47
|
+
* 1、禁止 JavaScript 语法错误,避免脚本无法执行;
|
|
48
|
+
* 2、禁止静态 location 外跳,避免 iframe 加载未经审核页面;
|
|
49
|
+
* 3、禁止 eval、Function、字符串定时器和明确的脚本或嵌入式环境写入、创建,
|
|
50
|
+
* 避免执行未纳入审核的代码;
|
|
51
|
+
* 4、禁止 RTCPeerConnection,避免绕过普通连接限制建立产物外通信。
|
|
52
|
+
*
|
|
53
|
+
* 提醒:
|
|
54
|
+
* 1、禁止 Worker、SharedWorker、ServiceWorker 和 window.open,
|
|
55
|
+
* 仅做提醒,因为 worker-src CSP 和 sandbox 可以拦截这些运行时入口。
|
|
56
|
+
*/
|
|
57
|
+
javascript_1.javascriptRule,
|
|
58
|
+
];
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/check/rules/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AACxC,iCAAgC;AAChC,iCAAgC;AAChC,6CAA4C;AAC5C,+BAA8B;AAG9B;;GAEG;AACU,QAAA,KAAK,GAAW;IAEzB;;;;;;OAMG;IACH,uBAAY;IAEZ;;;;;OAKG;IACH,eAAQ;IAER;;;;;;;;;;OAUG;IACH,eAAQ;IAER;;;OAGG;IACH,aAAO;IAEP;;;;;;;;;;;OAWG;IACH,2BAAc;CACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/check/rules/javascript.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA2B,IAAI,EAAC,MAAM,UAAU,CAAC;AAwkB7D,eAAO,MAAM,cAAc,EAAE,IAyB5B,CAAC"}
|