@@ -881,7 +881,7 @@
|
|||||||
const images = getResultImages();
|
const images = getResultImages();
|
||||||
if (images.length === 0) return '';
|
if (images.length === 0) return '';
|
||||||
return '<div class="tool-images">' +
|
return '<div class="tool-images">' +
|
||||||
images.map(img => `<img src="data:${escapeHtml(img.mimeType || 'image/png')};base64,${img.data}" class="tool-image" />`).join('') +
|
images.map(img => `<img src="data:${escapeHtml(img.mimeType || 'image/png')};base64,${escapeHtml(img.data || '')}" class="tool-image" />`).join('') +
|
||||||
'</div>';
|
'</div>';
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1148,7 +1148,7 @@
|
|||||||
if (images.length > 0) {
|
if (images.length > 0) {
|
||||||
html += '<div class="message-images">';
|
html += '<div class="message-images">';
|
||||||
for (const img of images) {
|
for (const img of images) {
|
||||||
html += `<img src="data:${escapeHtml(img.mimeType || 'image/png')};base64,${img.data}" class="message-image" />`;
|
html += `<img src="data:${escapeHtml(img.mimeType || 'image/png')};base64,${escapeHtml(img.data || '')}" class="message-image" />`;
|
||||||
}
|
}
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,4 +25,10 @@ describe("export HTML markdown link sanitization", () => {
|
|||||||
expect(templateJs).not.toMatch(/\$\{img\.mimeType\}/);
|
expect(templateJs).not.toMatch(/\$\{img\.mimeType\}/);
|
||||||
expect(templateJs).toMatch(/escapeHtml\(img\.mimeType/);
|
expect(templateJs).toMatch(/escapeHtml\(img\.mimeType/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("escapes image data attributes", () => {
|
||||||
|
// Image data is embedded in src attributes and must not allow attribute breakout.
|
||||||
|
expect(templateJs).not.toMatch(/;base64,\$\{img\.data\}"/);
|
||||||
|
expect(templateJs).toMatch(/;base64,\$\{escapeHtml\(img\.data \|\| (?:''|"")\)\}"/);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user