b03051dec6a7b9d132995e809f378bc3277a987a max Thu Aug 27 01:18:06 2026 -0700 escape search terms and uploaded sequence names (XSS), refs #38057 #Preview2 week - bugs introduced now will need a build patch to fix #Preview2 week - bugs introduced now will need a build patch to fix Follow-up to the QA review of dbd10edb43b. hgFileSearch and hgTracks track search: the name/description/simple search boxes echoed the search term into a value attribute unescaped. The earlier pass escaped the hgFileSearch simple box only, which sits inside a USE_TABS block that is not compiled. hgPhyloPlace: uploaded sequence names are echoed in the QC failure messages from vcfFromFasta, in the subtree summary table, in the placement and mutation-path headings, in the subtree download links and in the no-reference-match list. All now go through htmlEncode. hgLiftOver: the failure file was read back while its FILE* was still open and unflushed, so the "Failed input regions" block always came out empty. Close mapped and unmapped right after liftOver writes them. diff --git src/hg/hgTracks/searchTracks.c src/hg/hgTracks/searchTracks.c index 9965365a093..04f75100073 100644 --- src/hg/hgTracks/searchTracks.c +++ src/hg/hgTracks/searchTracks.c @@ -1077,68 +1077,68 @@ TRACK_SEARCH_CURRENT_TAB, currentTab); hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_DEL_ROW); hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_ADD_ROW); hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_PAGER); hPrintf("<div id='tabs' style='display:none; %s'>\n<ul>\n<li><a href='#simpleTab'>" "<B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Search</B>" "</a></li>\n<li><a href='#advancedTab'>" "<B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Advanced</B>" "</a></li>\n</ul>\n<div id='simpleTab' style='max-width:inherit;'>\n", cgiBrowser()==btIE?"width:1060px;":"max-width:inherit;"); hPrintf("<table id='simpleTable' style='width:100%%; font-size:.9em;'><tr><td colspan='2'>"); hPrintf("<input type='text' name='%s' id='simpleSearch' class='submitOnEnter' value='%s' " "style='max-width:1000px; width:100%%;'>\n", - TRACK_SEARCH_SIMPLE,simpleEntry == NULL ? "" : simpleEntry); + TRACK_SEARCH_SIMPLE,simpleEntry == NULL ? "" : htmlEncode(simpleEntry)); // escape (XSS) jsOnEventById("keyup", "simpleSearch", "findTracks.searchButtonsEnable(true);"); hPrintf("</td></tr><td style='max-height:4px;'></td></tr></table>"); //hPrintf("</td></tr></table>"); hPrintf("<input type='submit' name='%s' id='searchSubmit' value='Search' " "style='font-size:.8em;'>\n", TRACK_SEARCH); hPrintf("<input type='button'id='doSTClear1' name='clear' value='Clear' class='clear' " "style='font-size:.8em;'>\n"); jsOnEventById("click", "doSTClear1", "findTracks.clear();"); hPrintf("<input type='submit' name='submit' value='Cancel' class='cancel' " "style='font-size:.8em;'>\n"); hPrintf("</div>\n"); // Advanced tab hPrintf("<div id='advancedTab' style='width:inherit;'>\n" "<table id='advancedTable' cellSpacing=0 style='width:inherit; font-size:.9em;'>\n"); cols = 8; // Track Name contains hPrintf("<tr><td colspan=3></td>"); hPrintf("<td nowrap><b style='max-width:100px;'>Track Name:</b></td>"); hPrintf("<td align='right'>contains</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); hPrintf("<input type='text' name='%s' id='nameSearch' class='submitOnEnter' value='%s' " "style='min-width:326px; font-size:.9em;'>", - TRACK_SEARCH_ON_NAME, nameSearch == NULL ? "" : nameSearch); + TRACK_SEARCH_ON_NAME, nameSearch == NULL ? "" : htmlEncode(nameSearch)); // escape (XSS) jsOnEventById("keyup", "nameSearch", "findTracks.searchButtonsEnable(true);"); hPrintf("</td></tr>\n"); // Description contains hPrintf("<tr><td colspan=2></td><td align='right'>and </td>"); hPrintf("<td><b style='max-width:100px;'>Description:</b></td>"); hPrintf("<td align='right'>contains</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); hPrintf("<input type='text' name='%s' id='descSearch' value='%s' class='submitOnEnter' " "style='max-width:536px; width:536px; font-size:.9em;'>", - TRACK_SEARCH_ON_DESCR, descSearch == NULL ? "" : descSearch); + TRACK_SEARCH_ON_DESCR, descSearch == NULL ? "" : htmlEncode(descSearch)); // escape (XSS) jsOnEventById("keyup", "descSearch", "findTracks.searchButtonsEnable(true);"); hPrintf("</td></tr>\n"); hPrintf("<tr><td colspan=2></td><td align='right'>and </td>\n"); hPrintf("<td><b style='max-width:100px;'>Group:</b></td>"); hPrintf("<td align='right'>is</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); cgiMakeDropListFullExt(TRACK_SEARCH_ON_GROUP, labels, groups, numGroups, groupSearch, NULL, NULL, "min-width:40%; font-size:.9em;", "groupSearch"); hPrintf("</td></tr>\n"); // Track Type is (drop down) hPrintf("<tr><td colspan=2></td><td align='right'>and </td>\n"); hPrintf("<td nowrap><b style='max-width:100px;'>Data Format:</b></td>"); hPrintf("<td align='right'>is</td>\n");