You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
net/url: don't parse ';' as a separator in query string [freeze exception] #25192
changed the title [-]r.Form parse error when parameter include SQL Injection test[/-][+]net/http: ParseForm incorrectly parses parameters during an SQL Injection test[/+]on May 1, 2018
Both & and ; are used to split key value pairs. The ; is optional since it allows you to provide a URL as a value with a query string.
See https://en.wikipedia.org/wiki/Query_string under Web Forms
and the old survey of what other languages do while technically still correct per #2210 (comment), any future adoptions of the new recommendation from W3C will mean that those languages will also change their behavior.
Now the big question is: this behavior has been around since 2011, changing it 7 years later might massively break code for many users. Perhaps we need a survey of the make-up and interpretation of query strings from some frontend server?
Also this perhaps will need some security considerations as well or maybe a wide scale adoption of the recommendation first?
changed the title [-]net/http: ParseForm incorrectly parses parameters during an SQL Injection test[/-][+]net/url: ';' is parsed as a separator in query string[/+]on May 1, 2018
values, _:=url.ParseQuery(`a&b;c`)
fmt.Println(reflect.ValueOf(values).MapKeys()) // [c a b]
Assuming that's right:
Now the big question is: this behavior has been around since 2011, changing it 7 years later might massively break code for many users. Perhaps we need a survey of the make-up and interpretation of query strings from some frontend server?
+1
We might be able to get a handle on the size of potential breakage by surveying URL composition libraries to get an idea of how many sources are likely to produce URLs that are substantially different given non-crafted inputs.
I think this is mostly a correctness and interop issue but that the security consequences are not severe.
That said, there are risks to inferring more structure than the spec allows.
If a survey finds that there are widely used url.QueryEscape / encodeURIComponent counterparts that escape & but do not escape ;, and a trusted partner composes URLs thus:
Hi everybody,
I'm having the same problem by using AWS API Gateway in front of my application.
When the proxed endpoint is configured with the HTTP Proxy integration configuration on, AWS API Gateway transform a valid request like this one:
GET /service?cid=002125b3-26bd-48c4-ac90-9683d804be2d&tm=1532974971748&ua=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_6)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.99%20Safari%2F537.36&z=b075dd02-77f8-44bb-a389-866dcc80c9b6 HTTP/1.1
into:
GET /service?cid=002125b3-26bd-48c4-ac90-9683d804be2d&tm=1532974971748&ua=Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_13_6)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/67.0.3396.99+Safari/537.36&z=b075dd02-77f8-44bb-a389-866dcc80c9b6 HTTP/1.1
And Golang parse the ua parameter into Mozilla/5.0 (Macintosh
Thanks @antichris, #49399/#50034 describe my concerns exactly. @seankhliao yes log filtering seems the only workaround at the moment, albeit very ugly.
I have been caught this by surprise and want to restore the old behavior. But it's unclear to me how to do this while supporting both 1.17&pre-1.17 since calling AllowQuerySemicolons will result in build error in 1.16.
Activity
[-]r.Form parse error when parameter include SQL Injection test[/-][+]net/http: ParseForm incorrectly parses parameters during an SQL Injection test[/+]agnivade commentedon May 1, 2018
Complete repro -
curl 'http://localhost:9999/foo?id=1%27;--'@bradfitz - Is this expected ?
fraenkel commentedon May 1, 2018
Both & and ; are used to split key value pairs. The ; is optional since it allows you to provide a URL as a value with a query string.
See https://en.wikipedia.org/wiki/Query_string under Web Forms
odeke-em commentedon May 1, 2018
Hello @zhyale, thank you for filing this issue and welcome to the Go project!
@agnivade and @fraenkel thank you for the responses too.
So I believe, the root cause of the question here is rather:
Why is a semi colon being used as a separator in url.Parse?If you run https://play.golang.org/p/QVz18jWspPF or inlined below:
You'll see the real symptom
url.Values{"--":[]string{""}, "id":[]string{"1'"}}A W3C recommendation https://www.w3.org/TR/html401/appendix/notes.html#h-B.2.2 recommended using

;as a separator for url-encoded params for form-dataand that was what we used to add
;as a separator, making ';' synoymous with '&' in https://golang.org/cl/4973062 #2210 (comment)However, unfortunately that recommendation just got superseded very recently in mid-December 2017 by https://www.w3.org/TR/2017/REC-html52-20171214/
and now that points to https://url.spec.whatwg.org/#urlsearchparams

in which we can see that the only separator here is '&'
Node.js doesn't seem to recognize ';' as a separator
and the old survey of what other languages do while technically still correct per #2210 (comment), any future adoptions of the new recommendation from W3C will mean that those languages will also change their behavior.
Now the big question is: this behavior has been around since 2011, changing it 7 years later might massively break code for many users. Perhaps we need a survey of the make-up and interpretation of query strings from some frontend server?
Also this perhaps will need some security considerations as well or maybe a wide scale adoption of the recommendation first?
In addition to those already paged, I will page some more folks to help pitch in thoughts about the fate of the new W3C recommendation /cc @ianlancetaylor @andybons @tombergan @agl @rsc @mikesamuel
[-]net/http: ParseForm incorrectly parses parameters during an SQL Injection test[/-][+]net/url: ';' is parsed as a separator in query string[/+]bradfitz commentedon May 1, 2018
The Go 1 docs say:
So we can't change it during Go 1.x.
Repurposing this to be a Go 2.x issue.
mikesamuel commentedon May 1, 2018
IIUC, the problem is that
but
Assuming that's right:
+1
We might be able to get a handle on the size of potential breakage by surveying URL composition libraries to get an idea of how many sources are likely to produce URLs that are substantially different given non-crafted inputs.
For example:
In vanilla JS
I think this is mostly a correctness and interop issue but that the security consequences are not severe.
That said, there are risks to inferring more structure than the spec allows.
If a survey finds that there are widely used url.QueryEscape / encodeURIComponent counterparts that escape
&but do not escape;, and a trusted partner composes URLs thus:then
untrustedStringmight inject a;importantParamwhich would be available as the zero-th entry in Go's query map.The risk is pretty small as long as
laxEscapeQueryescapes'='and one workaround is to consistently enforce has-exactly-one constraints.bigluck commentedon Oct 23, 2018
Hi everybody,
I'm having the same problem by using AWS API Gateway in front of my application.
When the proxed endpoint is configured with the HTTP Proxy integration configuration on, AWS API Gateway transform a valid request like this one:
into:
And Golang parse the ua parameter into
Mozilla/5.0 (MacintoshHere a Go Playground to test it: https://play.golang.org/p/BeKy_UuSyoO
61 remaining items
yktoo commentedon Dec 13, 2021
Thanks @antichris, #49399/#50034 describe my concerns exactly. @seankhliao yes log filtering seems the only workaround at the moment, albeit very ugly.
shinny-chengzhi commentedon Mar 4, 2022
I have been caught this by surprise and want to restore the old behavior. But it's unclear to me how to do this while supporting both 1.17&pre-1.17 since calling
AllowQuerySemicolonswill result in build error in 1.16.ianlancetaylor commentedon Mar 4, 2022
@shinny-chengzhi You can use a build tag to compile code differently for go1.16 and go1.17.
https://pkg.go.dev/cmd/go#hdr-Build_constraints
shinny-chengzhi commentedon Mar 7, 2022
@ianlancetaylor Thanks, that will do it.
httpbp: Set http.Server.ErrorLog
httpbp: Set http.Server.ErrorLog
httpbp: Set http.Server.ErrorLog
httpbp: Set http.Server.ErrorLog
net/url: reject query values with semicolons