@aurumjs/html 0.10.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +152 -0
- package/package.json +52 -0
- package/prebuilt/esnext/builtin_components/portal.d.ts +9 -0
- package/prebuilt/esnext/builtin_components/portal.d.ts.map +1 -0
- package/prebuilt/esnext/builtin_components/portal.js +40 -0
- package/prebuilt/esnext/builtin_components/portal.js.map +1 -0
- package/prebuilt/esnext/builtin_components/router_link.d.ts +21 -0
- package/prebuilt/esnext/builtin_components/router_link.d.ts.map +1 -0
- package/prebuilt/esnext/builtin_components/router_link.js +54 -0
- package/prebuilt/esnext/builtin_components/router_link.js.map +1 -0
- package/prebuilt/esnext/index.d.ts +18 -0
- package/prebuilt/esnext/index.d.ts.map +1 -0
- package/prebuilt/esnext/index.js +18 -0
- package/prebuilt/esnext/index.js.map +1 -0
- package/prebuilt/esnext/jsx-dev-runtime.d.ts +2 -0
- package/prebuilt/esnext/jsx-dev-runtime.d.ts.map +1 -0
- package/prebuilt/esnext/jsx-dev-runtime.js +2 -0
- package/prebuilt/esnext/jsx-dev-runtime.js.map +1 -0
- package/prebuilt/esnext/jsx-runtime.d.ts +28 -0
- package/prebuilt/esnext/jsx-runtime.d.ts.map +1 -0
- package/prebuilt/esnext/jsx-runtime.js +26 -0
- package/prebuilt/esnext/jsx-runtime.js.map +1 -0
- package/prebuilt/esnext/nodes/input.d.ts +41 -0
- package/prebuilt/esnext/nodes/input.d.ts.map +1 -0
- package/prebuilt/esnext/nodes/input.js +92 -0
- package/prebuilt/esnext/nodes/input.js.map +1 -0
- package/prebuilt/esnext/nodes/rendering_helpers.d.ts +8 -0
- package/prebuilt/esnext/nodes/rendering_helpers.d.ts.map +1 -0
- package/prebuilt/esnext/nodes/rendering_helpers.js +173 -0
- package/prebuilt/esnext/nodes/rendering_helpers.js.map +1 -0
- package/prebuilt/esnext/nodes/select.d.ts +17 -0
- package/prebuilt/esnext/nodes/select.d.ts.map +1 -0
- package/prebuilt/esnext/nodes/select.js +95 -0
- package/prebuilt/esnext/nodes/select.js.map +1 -0
- package/prebuilt/esnext/nodes/simple_dom_nodes.d.ts +866 -0
- package/prebuilt/esnext/nodes/simple_dom_nodes.d.ts.map +1 -0
- package/prebuilt/esnext/nodes/simple_dom_nodes.js +531 -0
- package/prebuilt/esnext/nodes/simple_dom_nodes.js.map +1 -0
- package/prebuilt/esnext/nodes/textarea.d.ts +34 -0
- package/prebuilt/esnext/nodes/textarea.d.ts.map +1 -0
- package/prebuilt/esnext/nodes/textarea.js +61 -0
- package/prebuilt/esnext/nodes/textarea.js.map +1 -0
- package/prebuilt/esnext/rendering/dom_runtime.d.ts +91 -0
- package/prebuilt/esnext/rendering/dom_runtime.d.ts.map +1 -0
- package/prebuilt/esnext/rendering/dom_runtime.js +970 -0
- package/prebuilt/esnext/rendering/dom_runtime.js.map +1 -0
- package/prebuilt/esnext/rendering/render_batch.d.ts +15 -0
- package/prebuilt/esnext/rendering/render_batch.d.ts.map +1 -0
- package/prebuilt/esnext/rendering/render_batch.js +73 -0
- package/prebuilt/esnext/rendering/render_batch.js.map +1 -0
- package/prebuilt/esnext/rendering/renderers/dom_adapter.d.ts +199 -0
- package/prebuilt/esnext/rendering/renderers/dom_adapter.d.ts.map +1 -0
- package/prebuilt/esnext/rendering/renderers/dom_adapter.js +525 -0
- package/prebuilt/esnext/rendering/renderers/dom_adapter.js.map +1 -0
- package/prebuilt/esnext/rendering/renderers/string_adapter.d.ts +4 -0
- package/prebuilt/esnext/rendering/renderers/string_adapter.d.ts.map +1 -0
- package/prebuilt/esnext/rendering/renderers/string_adapter.js +112 -0
- package/prebuilt/esnext/rendering/renderers/string_adapter.js.map +1 -0
- package/prebuilt/esnext/rendering/renderers/vdom_adapter.d.ts +11 -0
- package/prebuilt/esnext/rendering/renderers/vdom_adapter.d.ts.map +1 -0
- package/prebuilt/esnext/rendering/renderers/vdom_adapter.js +23 -0
- package/prebuilt/esnext/rendering/renderers/vdom_adapter.js.map +1 -0
- package/prebuilt/esnext/utilities/aurum.d.ts +155 -0
- package/prebuilt/esnext/utilities/aurum.d.ts.map +1 -0
- package/prebuilt/esnext/utilities/aurum.js +282 -0
- package/prebuilt/esnext/utilities/aurum.js.map +1 -0
- package/prebuilt/esnext/utilities/sanitize.d.ts +25 -0
- package/prebuilt/esnext/utilities/sanitize.d.ts.map +1 -0
- package/prebuilt/esnext/utilities/sanitize.js +191 -0
- package/prebuilt/esnext/utilities/sanitize.js.map +1 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
|
|
2
|
+
// These elements either execute code, create a new parsing context, alter URL
|
|
3
|
+
// resolution, or can activate content that was not inspected by this sanitizer.
|
|
4
|
+
const UNSAFE_ELEMENTS = new Set([
|
|
5
|
+
'base',
|
|
6
|
+
'embed',
|
|
7
|
+
'frame',
|
|
8
|
+
'frameset',
|
|
9
|
+
'iframe',
|
|
10
|
+
'link',
|
|
11
|
+
'meta',
|
|
12
|
+
'noembed',
|
|
13
|
+
'noframes',
|
|
14
|
+
'noscript',
|
|
15
|
+
'object',
|
|
16
|
+
'plaintext',
|
|
17
|
+
'script',
|
|
18
|
+
'style',
|
|
19
|
+
'template',
|
|
20
|
+
'xmp'
|
|
21
|
+
]);
|
|
22
|
+
const URL_ATTRIBUTES = new Set([
|
|
23
|
+
'action',
|
|
24
|
+
'background',
|
|
25
|
+
'cite',
|
|
26
|
+
'formaction',
|
|
27
|
+
'href',
|
|
28
|
+
'longdesc',
|
|
29
|
+
'poster',
|
|
30
|
+
'src',
|
|
31
|
+
'xlink:href'
|
|
32
|
+
]);
|
|
33
|
+
const SAFE_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'tel:']);
|
|
34
|
+
const UNSAFE_STYLE = /(?:url\s*\(|image-set\s*\(|@import|expression\s*\(|-moz-binding|behavior\s*:|javascript\s*:|\\)/i;
|
|
35
|
+
/**
|
|
36
|
+
* Sanitizes HTML and returns its serialized representation.
|
|
37
|
+
*
|
|
38
|
+
* Prefer setSanitizedHTML when inserting the result into the DOM. Sanitization
|
|
39
|
+
* is context-sensitive, so serializing and reparsing HTML in a different
|
|
40
|
+
* element can reintroduce mutation-XSS hazards.
|
|
41
|
+
*/
|
|
42
|
+
export function sanitizeHTML(html, config = {}) {
|
|
43
|
+
const container = document.createElement('div');
|
|
44
|
+
setSanitizedHTML(container, html, config);
|
|
45
|
+
return container.innerHTML;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Safely replaces an element's children with sanitized HTML.
|
|
49
|
+
*
|
|
50
|
+
* The native safe HTML Sanitizer API is used when available. Browsers without
|
|
51
|
+
* it parse into a detached element and apply the same mandatory safety policy
|
|
52
|
+
* before any nodes are connected to the document.
|
|
53
|
+
*/
|
|
54
|
+
export function setSanitizedHTML(target, html, config = {}) {
|
|
55
|
+
const normalizedConfig = normalizeConfig(config);
|
|
56
|
+
if (setHTMLNatively(target, html)) {
|
|
57
|
+
applyPolicy(target, normalizedConfig);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const staging = target.cloneNode(false);
|
|
61
|
+
staging.innerHTML = html;
|
|
62
|
+
applyPolicy(staging, normalizedConfig);
|
|
63
|
+
target.replaceChildren(...Array.from(staging.childNodes));
|
|
64
|
+
}
|
|
65
|
+
/** Safely appends or prepends sanitized HTML without rebuilding existing nodes. */
|
|
66
|
+
export function insertSanitizedHTML(target, html, position, config = {}) {
|
|
67
|
+
const staging = target.cloneNode(false);
|
|
68
|
+
setSanitizedHTML(staging, html, config);
|
|
69
|
+
const fragment = target.ownerDocument.createDocumentFragment();
|
|
70
|
+
fragment.append(...Array.from(staging.childNodes));
|
|
71
|
+
if (position === 'append') {
|
|
72
|
+
target.append(fragment);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
target.prepend(fragment);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function setHTMLNatively(target, html) {
|
|
79
|
+
const setHTML = target.setHTML;
|
|
80
|
+
if (typeof setHTML !== 'function') {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
// setHTML always applies the browser's XSS-safe baseline, even when a
|
|
85
|
+
// custom removal configuration is supplied.
|
|
86
|
+
setHTML.call(target, html, {
|
|
87
|
+
sanitizer: {
|
|
88
|
+
removeElements: Array.from(UNSAFE_ELEMENTS)
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Early implementations used a different configuration shape. Their
|
|
94
|
+
// default safe sanitizer is preferable to falling back to innerHTML.
|
|
95
|
+
setHTML.call(target, html);
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
function applyPolicy(root, config) {
|
|
100
|
+
const elements = Array.from(root.querySelectorAll('*'));
|
|
101
|
+
for (const element of elements) {
|
|
102
|
+
if (!root.contains(element)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const tag = element.localName.toLowerCase();
|
|
106
|
+
if (element.namespaceURI !== HTML_NAMESPACE || UNSAFE_ELEMENTS.has(tag)) {
|
|
107
|
+
element.remove();
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (!isAllowed(tag, config.tagWhitelist, config.tagBlacklist)) {
|
|
111
|
+
element.replaceWith(...Array.from(element.childNodes));
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
sanitizeAttributes(element, config);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function sanitizeAttributes(element, config) {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
for (const attribute of Array.from(element.attributes)) {
|
|
120
|
+
const name = attribute.name.toLowerCase();
|
|
121
|
+
const localName = attribute.localName.toLowerCase();
|
|
122
|
+
if (!isAllowed(name, config.attributeWhitelist, config.attributeBlacklist)) {
|
|
123
|
+
element.removeAttributeNode(attribute);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (localName.startsWith('on') || localName === 'srcdoc') {
|
|
127
|
+
element.removeAttributeNode(attribute);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (URL_ATTRIBUTES.has(name) && !isSafeURL(attribute.value, element.ownerDocument)) {
|
|
131
|
+
element.removeAttributeNode(attribute);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (localName === 'srcset' && !isSafeSrcSet(attribute.value, element.ownerDocument)) {
|
|
135
|
+
element.removeAttributeNode(attribute);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (localName === 'style' && UNSAFE_STYLE.test(attribute.value)) {
|
|
139
|
+
element.removeAttributeNode(attribute);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (element.localName === 'a' && ((_a = element.getAttribute('target')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === '_blank') {
|
|
143
|
+
const rel = new Set(((_b = element.getAttribute('rel')) !== null && _b !== void 0 ? _b : '').toLowerCase().split(/\s+/).filter(Boolean));
|
|
144
|
+
rel.add('noopener');
|
|
145
|
+
rel.add('noreferrer');
|
|
146
|
+
element.setAttribute('rel', Array.from(rel).join(' '));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function isSafeURL(value, document) {
|
|
150
|
+
const normalized = value.replace(/[\u0000-\u0020\u007f-\u009f]/g, '');
|
|
151
|
+
if (normalized === '' || normalized.startsWith('#')) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
if (/^(?:javascript|vbscript|data):/i.test(normalized)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
return SAFE_URL_PROTOCOLS.has(new URL(normalized, document.baseURI).protocol);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function isSafeSrcSet(value, document) {
|
|
165
|
+
if (/(?:javascript|vbscript|data)\s*:/i.test(value.replace(/[\u0000-\u0020\u007f-\u009f]/g, ''))) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
return value
|
|
169
|
+
.split(',')
|
|
170
|
+
.map((candidate) => candidate.trim().split(/\s+/)[0])
|
|
171
|
+
.filter(Boolean)
|
|
172
|
+
.every((candidate) => isSafeURL(candidate, document));
|
|
173
|
+
}
|
|
174
|
+
function normalizeConfig(config) {
|
|
175
|
+
return {
|
|
176
|
+
attributeBlacklist: toLowerCaseSet(config.attributeBlacklist),
|
|
177
|
+
attributeWhitelist: toLowerCaseSet(config.attributeWhitelist),
|
|
178
|
+
tagBlacklist: toLowerCaseSet(config.tagBlacklist),
|
|
179
|
+
tagWhitelist: toLowerCaseSet(config.tagWhitelist)
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function toLowerCaseSet(values) {
|
|
183
|
+
return values ? new Set(values.map((value) => value.toLowerCase())) : undefined;
|
|
184
|
+
}
|
|
185
|
+
function isAllowed(value, allowList, rejectList) {
|
|
186
|
+
if (rejectList === null || rejectList === void 0 ? void 0 : rejectList.has(value)) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
return !allowList || allowList.has(value);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/utilities/sanitize.ts"],"names":[],"mappings":"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"}
|