Skip to content

Commit ad35c4c

Browse files
developitmarvinhagemeister
authored andcommitted
Ignore non-VNode objects during rendering
This fixes #245.
1 parent 60075a5 commit ad35c4c

File tree

6 files changed

+25
-0
lines changed

6 files changed

+25
-0
lines changed

.changeset/curly-bananas-do.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+
Fix object children being rendered as `undefined`

src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ function _renderToString(vnode, context, isSvgMode, selectValue, parent) {
210210
return rendered;
211211
}
212212

213+
// VNodes have {constructor:undefined} to prevent JSON injection:
214+
if (vnode.constructor !== undefined) return '';
215+
213216
vnode[PARENT] = parent;
214217
if (options[DIFF]) options[DIFF](vnode);
215218

src/pretty.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ export function _renderToStringPretty(
5353
return rendered;
5454
}
5555

56+
// VNodes have {constructor:undefined} to prevent JSON injection:
57+
if (vnode.constructor !== undefined) return '';
58+
5659
let nodeName = vnode.type,
5760
props = vnode.props,
5861
isComponent = false;

test/jsx.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,8 @@ describe('jsx', () => {
163163
<meta charset="utf-8" />
164164
`);
165165
});
166+
167+
it('should prevent JSON injection', () => {
168+
expect(renderJsx(<div>{{ hello: 'world' }}</div>)).to.equal('<div></div>');
169+
});
166170
});

test/pretty.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,10 @@ describe('pretty', () => {
222222
</p>
223223
`);
224224
});
225+
226+
it('should prevent JSON injection', () => {
227+
expect(prettyRender(<div>{{ hello: 'world' }}</div>)).to.equal(
228+
'<div></div>'
229+
);
230+
});
225231
});

test/render.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,4 +1260,8 @@ describe('render', () => {
12601260
'<select><option selected value="2">2</option></select>'
12611261
);
12621262
});
1263+
1264+
it('should prevent JSON injection', () => {
1265+
expect(render(<div>{{ hello: 'world' }}</div>)).to.equal('<div></div>');
1266+
});
12631267
});

0 commit comments

Comments
 (0)