Skip to content

Commit 4724724

Browse files
authored
Merge pull request #92 from Fastbyte01/codex/sanitize-query-in-theme.js
Fix search query sanitization
2 parents 4ff1e37 + 162d7d7 commit 4724724

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

assets/js/theme.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ class Util {
3030
if (!reserved) element.addEventListener('animationend', handler, false);
3131
}
3232

33+
escapeHTML(str) {
34+
const div = document.createElement('div');
35+
div.textContent = str;
36+
return div.innerHTML;
37+
}
38+
3339
}
3440

3541
class Theme {
@@ -319,10 +325,18 @@ class Theme {
319325
title,
320326
date,
321327
context
322-
}) => `<div><span class="suggestion-title">${title}</span><span class="suggestion-date">${date}</span></div><div class="suggestion-context">${context}</div>`,
328+
}, {
329+
query
330+
}) => {
331+
const safeQuery = this.util.escapeHTML(query);
332+
return `<div data-query="${safeQuery}"><span class="suggestion-title">${title}</span><span class="suggestion-date">${date}</span></div><div class="suggestion-context">${context}</div>`;
333+
},
323334
empty: ({
324335
query
325-
}) => `<div class="search-empty">${searchConfig.noResultsFound}: <span class="search-query">"${query}"</span></div>`,
336+
}) => {
337+
const safeQuery = this.util.escapeHTML(query);
338+
return `<div class="search-empty">${searchConfig.noResultsFound}: <span class="search-query">"${safeQuery}"</span></div>`;
339+
},
326340
footer: ({}) => {
327341
const {
328342
searchType,

src/js/theme.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ class Util {
2626
};
2727
if (!reserved) element.addEventListener('animationend', handler, false);
2828
}
29+
30+
escapeHTML(str) {
31+
const div = document.createElement('div');
32+
div.textContent = str;
33+
return div.innerHTML;
34+
}
2935
}
3036

3137
class Theme {
@@ -272,8 +278,14 @@ class Theme {
272278
}
273279
},
274280
templates: {
275-
suggestion: ({ title, date, context }) => `<div><span class="suggestion-title">${title}</span><span class="suggestion-date">${date}</span></div><div class="suggestion-context">${context}</div>`,
276-
empty: ({ query }) => `<div class="search-empty">${searchConfig.noResultsFound}: <span class="search-query">"${query}"</span></div>`,
281+
suggestion: ({ title, date, context }, { query }) => {
282+
const safeQuery = this.util.escapeHTML(query);
283+
return `<div data-query="${safeQuery}"><span class="suggestion-title">${title}</span><span class="suggestion-date">${date}</span></div><div class="suggestion-context">${context}</div>`;
284+
},
285+
empty: ({ query }) => {
286+
const safeQuery = this.util.escapeHTML(query);
287+
return `<div class="search-empty">${searchConfig.noResultsFound}: <span class="search-query">"${safeQuery}"</span></div>`;
288+
},
277289
footer: ({}) => {
278290
const { searchType, icon, href } = searchConfig.type === 'algolia' ? {
279291
searchType: 'algolia',

0 commit comments

Comments
 (0)