Sanitize search text to prevent XSS
This commit is contained in:
		
							parent
							
								
									427b23c127
								
							
						
					
					
						commit
						84f243bc95
					
				|  | @ -5,6 +5,7 @@ import fuzzaldrinPlus from 'fuzzaldrin-plus'; | |||
| import axios from '~/lib/utils/axios_utils'; | ||||
| import flash from '~/flash'; | ||||
| import { __ } from '~/locale'; | ||||
| import sanitize from 'sanitize-html'; | ||||
| 
 | ||||
| // highlight text(awefwbwgtc -> <b>a</b>wefw<b>b</b>wgt<b>c</b> )
 | ||||
| const highlighter = function(element, text, matches) { | ||||
|  | @ -74,7 +75,7 @@ export default class ProjectFindFile { | |||
| 
 | ||||
|   findFile() { | ||||
|     var result, searchText; | ||||
|     searchText = this.inputElement.val(); | ||||
|     searchText = sanitize(this.inputElement.val()); | ||||
|     result = | ||||
|       searchText.length > 0 ? fuzzaldrinPlus.filter(this.filePaths, searchText) : this.filePaths; | ||||
|     return this.renderList(result, searchText); | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Sanitize search text to prevent XSS | ||||
| merge_request: | ||||
| author: | ||||
| type: security | ||||
|  | @ -3,6 +3,9 @@ import $ from 'jquery'; | |||
| import ProjectFindFile from '~/project_find_file'; | ||||
| import axios from '~/lib/utils/axios_utils'; | ||||
| import { TEST_HOST } from 'helpers/test_constants'; | ||||
| import sanitize from 'sanitize-html'; | ||||
| 
 | ||||
| jest.mock('sanitize-html', () => jest.fn(val => val)); | ||||
| 
 | ||||
| const BLOB_URL_TEMPLATE = `${TEST_HOST}/namespace/project/blob/master`; | ||||
| const FILE_FIND_URL = `${TEST_HOST}/namespace/project/files/master?format=json`; | ||||
|  | @ -38,31 +41,31 @@ describe('ProjectFindFile', () => { | |||
|         href: el.querySelector('a').href, | ||||
|       })); | ||||
| 
 | ||||
|   const files = [ | ||||
|     'fileA.txt', | ||||
|     'fileB.txt', | ||||
|     'fi#leC.txt', | ||||
|     'folderA/fileD.txt', | ||||
|     'folder#B/fileE.txt', | ||||
|     'folde?rC/fil#F.txt', | ||||
|   ]; | ||||
| 
 | ||||
|   beforeEach(() => { | ||||
|     // Create a mock adapter for stubbing axios API requests
 | ||||
|     mock = new MockAdapter(axios); | ||||
| 
 | ||||
|     element = $(TEMPLATE); | ||||
|     mock.onGet(FILE_FIND_URL).replyOnce(200, files); | ||||
|     getProjectFindFileInstance(); // This triggers a load / axios call + subsequent render in the constructor
 | ||||
|   }); | ||||
| 
 | ||||
|   afterEach(() => { | ||||
|     // Reset the mock adapter
 | ||||
|     mock.restore(); | ||||
|     sanitize.mockClear(); | ||||
|   }); | ||||
| 
 | ||||
|   it('loads and renders elements from remote server', done => { | ||||
|     const files = [ | ||||
|       'fileA.txt', | ||||
|       'fileB.txt', | ||||
|       'fi#leC.txt', | ||||
|       'folderA/fileD.txt', | ||||
|       'folder#B/fileE.txt', | ||||
|       'folde?rC/fil#F.txt', | ||||
|     ]; | ||||
|     mock.onGet(FILE_FIND_URL).replyOnce(200, files); | ||||
| 
 | ||||
|     getProjectFindFileInstance(); // This triggers a load / axios call + subsequent render in the constructor
 | ||||
| 
 | ||||
|     setImmediate(() => { | ||||
|       expect(findFiles()).toEqual( | ||||
|         files.map(text => ({ | ||||
|  | @ -74,4 +77,14 @@ describe('ProjectFindFile', () => { | |||
|       done(); | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   it('sanitizes search text', done => { | ||||
|     const searchText = element.find('.file-finder-input').val(); | ||||
| 
 | ||||
|     setImmediate(() => { | ||||
|       expect(sanitize).toHaveBeenCalledTimes(1); | ||||
|       expect(sanitize).toHaveBeenCalledWith(searchText); | ||||
|       done(); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue