Skip to content

Commit 833043b

Browse files
authored
Merge pull request #461 from preactjs/fix-link
Reject namespaced attribute
2 parents 990307a + e32a4cd commit 833043b

3 files changed

Lines changed: 24 additions & 3 deletions

File tree

.changeset/clean-lions-smile.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'preact-render-to-string': patch
3+
---
4+
5+
Reject unsafe namespaced attribute names before normalizing SVG/XML attribute casing.

src/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -658,10 +658,10 @@ function _renderToString(
658658
break;
659659

660660
default: {
661-
if (NAMESPACE_REPLACE_REGEX.test(name)) {
662-
name = name.replace(NAMESPACE_REPLACE_REGEX, '$1:$2').toLowerCase();
663-
} else if (UNSAFE_NAME.test(name)) {
661+
if (UNSAFE_NAME.test(name)) {
664662
continue;
663+
} else if (NAMESPACE_REPLACE_REGEX.test(name)) {
664+
name = name.replace(NAMESPACE_REPLACE_REGEX, '$1:$2').toLowerCase();
665665
} else if (
666666
(name[4] === '-' || HTML_ENUMERATED.has(name)) &&
667667
v != null

test/render.test.jsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,22 @@ describe('render', () => {
193193
expect(rendered).to.equal(`<div a="b"></div>`);
194194
});
195195

196+
it('should not render JS in namespaced attributes', () => {
197+
let rendered = render(
198+
h(
199+
'svg',
200+
null,
201+
h('image', {
202+
xlinkHref: '#',
203+
'xlinkHref onload': 'alert(1)',
204+
'xlinkHref><script>alert(1)</script><image x': '#',
205+
'xlink:href onload': 'alert(2)'
206+
})
207+
)
208+
);
209+
expect(rendered).to.equal(`<svg><image xlink:href="#"></image></svg>`);
210+
});
211+
196212
it('should allow emoji attribute names', () => {
197213
let rendered = render(
198214
h('div', {

0 commit comments

Comments
 (0)