diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue index a579316b38..80a47ae6e8 100644 --- a/src/components/MonitorList.vue +++ b/src/components/MonitorList.vue @@ -324,11 +324,25 @@ export default { // finds monitor name, tag name or tag value let searchTextMatch = true; if (this.searchText !== "") { - const loweredSearchText = this.searchText.toLowerCase(); - searchTextMatch = - monitor.name.toLowerCase().includes(loweredSearchText) - || monitor.tags.find(tag => tag.name.toLowerCase().includes(loweredSearchText) - || tag.value?.toLowerCase().includes(loweredSearchText)); + try { + // Escape special characters for use in the regular expression + const escapeRegExp = (string) => string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + + const escapedSearchText = escapeRegExp(this.searchText); + const regex = new RegExp(escapedSearchText, "i"); + + const safeRegexTest = (str) => str && regex.test(str); + + searchTextMatch = + regex.test(monitor.name) || + safeRegexTest(monitor.url) || + safeRegexTest(monitor.hostname) || + safeRegexTest(monitor.dns_resolve_server) || + monitor.tags.some(tag => regex.test(tag.name) || safeRegexTest(tag.value)); + } catch (e) { + console.error("Invalid regex pattern:", e); + searchTextMatch = false; + } } // filter by status