mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 15:58:39 +09:00
CSP: connect-src 'self' should always include https: and wss: schemes
This commit is contained in:
parent
ee67abc801
commit
96886141e1
8 changed files with 168 additions and 11 deletions
|
|
@ -266,20 +266,21 @@ CSP_ContentTypeToDirective(nsContentPolicyType aType)
|
|||
}
|
||||
|
||||
nsCSPHostSrc*
|
||||
CSP_CreateHostSrcFromURI(nsIURI* aURI)
|
||||
CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI)
|
||||
{
|
||||
// Create the host first
|
||||
nsCString host;
|
||||
aURI->GetAsciiHost(host);
|
||||
aSelfURI->GetAsciiHost(host);
|
||||
nsCSPHostSrc *hostsrc = new nsCSPHostSrc(NS_ConvertUTF8toUTF16(host));
|
||||
hostsrc->setGeneratedFromSelfKeyword();
|
||||
|
||||
// Add the scheme.
|
||||
nsCString scheme;
|
||||
aURI->GetScheme(scheme);
|
||||
aSelfURI->GetScheme(scheme);
|
||||
hostsrc->setScheme(NS_ConvertUTF8toUTF16(scheme));
|
||||
|
||||
int32_t port;
|
||||
aURI->GetPort(&port);
|
||||
aSelfURI->GetPort(&port);
|
||||
// Only add port if it's not default port.
|
||||
if (port > 0) {
|
||||
nsAutoString portStr;
|
||||
|
|
@ -348,13 +349,17 @@ CSP_IsQuotelessKeyword(const nsAString& aKey)
|
|||
* @param aUpgradeInsecure
|
||||
* Whether the policy makes use of the directive
|
||||
* 'upgrade-insecure-requests'.
|
||||
* @param aFromSelfURI
|
||||
* Whether a scheme was generated from the keyword 'self'
|
||||
* which then allows schemeless sources to match ws and wss.
|
||||
*/
|
||||
|
||||
bool
|
||||
permitsScheme(const nsAString& aEnforcementScheme,
|
||||
nsIURI* aUri,
|
||||
bool aReportOnly,
|
||||
bool aUpgradeInsecure)
|
||||
bool aUpgradeInsecure,
|
||||
bool aFromSelfURI)
|
||||
{
|
||||
nsAutoCString scheme;
|
||||
nsresult rv = aUri->GetScheme(scheme);
|
||||
|
|
@ -373,8 +378,20 @@ permitsScheme(const nsAString& aEnforcementScheme,
|
|||
// allow scheme-less sources where the protected resource is http
|
||||
// and the load is https, see:
|
||||
// http://www.w3.org/TR/CSP2/#match-source-expression
|
||||
if (aEnforcementScheme.EqualsASCII("http") &&
|
||||
scheme.EqualsASCII("https")) {
|
||||
if (aEnforcementScheme.EqualsASCII("http")) {
|
||||
if (scheme.EqualsASCII("https")) {
|
||||
return true;
|
||||
}
|
||||
if ((scheme.EqualsASCII("ws") || scheme.EqualsASCII("wss")) && aFromSelfURI) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (aEnforcementScheme.EqualsASCII("https")) {
|
||||
if (scheme.EqualsLiteral("wss") && aFromSelfURI) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (aEnforcementScheme.EqualsASCII("ws") && scheme.EqualsASCII("wss")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -483,7 +500,7 @@ nsCSPSchemeSrc::permits(nsIURI* aUri, const nsAString& aNonce, bool aWasRedirect
|
|||
if (mInvalidated) {
|
||||
return false;
|
||||
}
|
||||
return permitsScheme(mScheme, aUri, aReportOnly, aUpgradeInsecure);
|
||||
return permitsScheme(mScheme, aUri, aReportOnly, aUpgradeInsecure, false);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
@ -503,6 +520,7 @@ nsCSPSchemeSrc::toString(nsAString& outStr) const
|
|||
|
||||
nsCSPHostSrc::nsCSPHostSrc(const nsAString& aHost)
|
||||
: mHost(aHost)
|
||||
, mGeneratedFromSelfKeyword(false)
|
||||
, mWithinFrameAncstorsDir(false)
|
||||
{
|
||||
ToLowerCase(mHost);
|
||||
|
|
@ -612,7 +630,7 @@ nsCSPHostSrc::permits(nsIURI* aUri, const nsAString& aNonce, bool aWasRedirected
|
|||
// http://www.w3.org/TR/CSP11/#match-source-expression
|
||||
|
||||
// 4.3) scheme matching: Check if the scheme matches.
|
||||
if (!permitsScheme(mScheme, aUri, aReportOnly, aUpgradeInsecure)) {
|
||||
if (!permitsScheme(mScheme, aUri, aReportOnly, aUpgradeInsecure, mGeneratedFromSelfKeyword)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue