- Notifications
You must be signed in to change notification settings - Fork914
feat: add csp headers for embedded apps#18374
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
coderd/coderd.go Outdated
proxies:= []*proxyhealth.ProxyHost{ | ||
{ | ||
Host:api.AccessURL.Host, | ||
AppHost:appurl.ConvertAppHostForCSP(api.AccessURL.String(),api.AppHostname), | ||
}, | ||
} |
code-asherJun 14, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I tacked on the primary here, but we could instead add the primary as part of theWorkspaceProxyHostsFn
function.
The current method here also includes the primary for AGPL, so if we do that we would also need to make some changes for the AGPL version (assuming wildcard apps and tasks even work with AGPL).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
api.AppHostname
can be""
. We should probably handle empty string, and not add it to the csp header.
code-asherJun 16, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
ConvertAppHostForCSP
uses the first argument if the second is""
, so we end up adding the base host instead (my thinking here was that means we are using path-based apps, so the root domain is the app host).
code-asherJun 16, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actually I think my reasoning is incorrect because you can use both wildcard and path-based at the same time, right? Hmm...that means we always want to add the access URL? I guessself
would cover that one already, but can you use path-based for the regions? Maybe I need to add both there.
code-asherJun 16, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Also I need to use.Host
instead of.String()
since I think CSP does not like the protocol being in there, could have sworn I fixed that already.
Edit: wait no what am I talking about, apparently my brain is fried today, seems to work either way.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
you can use both wildcard and path-based at the same time
You can, andself
covers that. I actually do not know if we support path based on proxies 🤔
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Overall LGTM. Have you done any manual QA@code-asher ?
code-asher commentedJun 16, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
I checked that the primary's headers get added to Definitely open to ideas on how I can more fully test. Maybe I need to make a proper deployment somewhere. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
It looks good on my local. We can confirm on dev.coder.
The unit tests look ok too 👍
This stuff is always annoying to test
82c14e0
intomainUh oh!
There was an error while loading.Please reload this page.
I tested regions on dev and the frames are embedding perfectly 😎 |
I modified the proxy host cache we already had and were using for websocket csp headers to also include the wildcard app host, then used those for frame-src policies.
I did not add frame-ancestors, since if I understand correctly, those would go on the app, and this middleware does not come into play there. Maybe we will want to add it on workspace apps like we do with cors, if we find apps are setting it to
none
or something.Closescoder/internal#684