Security: fix four vulnerabilities in autocomplete app#19
Merged
Conversation
Co-authored-by: gb119 <4428426+gb119@users.noreply.github.com>
Co-authored-by: gb119 <4428426+gb119@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Audit autocomplete app for security issues and propose fixes
Security: fix four vulnerabilities in autocomplete app
Mar 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The autocomplete app had four security issues: unauthenticated access to data-exposing endpoints, a reflected XSS via inline JS event handlers, an unhandled 500 on bad URL parameters, and an HTML attribute injection via unescaped
component_prefix.Changes
Critical – Block unauthenticated access by default (
core.py)auth_checkpreviously usedAUTOCOMPLETE_BLOCK_UNAUTHENTICATEDdefaulting toFalse, meaning all autocomplete endpoints (users, equipment, cost centres) were reachable without a session. Inverted to deny by default; opt-out viaAUTOCOMPLETE_ALLOW_UNAUTHENTICATED = True.High – XSS via
component_idin inline event handler (textinput.html)Django's HTML auto-escaping converts
'→', but the browser decodes entities before executing the event handler, allowingfield_name=x'); alert(1); //to break out of the string.escapejsbackslash-escapes JS special characters instead.Medium – 500 on unknown
ac_name→ 404 (views.py)ac_classraised an unhandledValueErrorfor unregistered names; changed toHttp404.Medium –
component_prefixattribute injection (templatetags/autocomplete.py)component_prefixwas embedded in a single-quote-delimitedhx-valsattribute without HTML escaping. A'in the value terminates the attribute early, enabling e.g.onmouseover='...'injection. Appliedescape()consistently withfield_name.Tests
Added
apps/autocomplete/tests.py(12 tests) covering auth enforcement, 404 behaviour,hx-valsescaping, and XSS safety of thesearch_highlightfilter.💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.