Mozilla Web Security Guidelines
Web Security Cheat Sheet
† Suggested order that administrators implement the web security guidelines. It is based on a combination of the security impact and the ease of implementation from an operational and developmental perspective.
Transport Layer Security (TLS/SSL)
Transport Layer Security provides assurances about the confidentiality, authentication, and integrity of all communications both inside and outside of Mozilla. To protect our users and networked systems, the support and use of encrypted communications using TLS is mandatory for all systems.
HTTPS
Websites or API endpoints that only communicate with modern browsers and systems should use the Mozilla modern TLS configuration.
Websites intended for general public consumption should use the Mozilla intermediate TLS configuration.
Websites that require backwards compatibility with extremely old browsers and operating systems may use the Mozilla backwards compatible TLS configuration. This is not recommended, and use of this compatibility level should be done only after consulting the security team for a risk assessment.
Compatibility
Modern
Firefox 63, Android 10.0, Chrome 70, Edge 75, Java 11, OpenSSL 1.1.1, Opera 57, and Safari 12.1
Intermediate
Firefox 27, Android 4.4.2, Chrome 31, Edge, IE 11 on Windows 7, Java 8u31, OpenSSL 1.0.1, Opera 20, Safari 9
Backwards Compatible (Old)
Firefox 1, Android 2.3, Chrome 1, Edge 12, IE8 on Windows XP, Java 6, OpenSSL 0.9.8, Opera 5, and Safari 1
See Also
Mozilla Server Side TLS Configuration Generator - generates software configurations for the three levels of compatibility
HTTP Strict Transport Security
HTTP Strict Transport Security (HSTS) is an HTTP header that notifies user agents to only connect to a given site over HTTPS, even if the scheme chosen was HTTP. Browsers that have had HSTS set for a given site will transparently upgrade all requests to HTTPS. HSTS also tells the browser to treat TLS and certificate-related errors more strictly by disabling the ability for users to bypass the error page.
The header consists of one mandatory parameter (max-age) and two optional parameters (includeSubDomains and preload), separated by semicolons.
Directives
max-age:how long user agents will redirect to HTTPS, in secondsincludeSubDomains:whether user agents should upgrade requests on subdomainspreload:whether the site should be included in the HSTS preload list
max-age must be set to a minimum of six months (15768000), but longer periods such as two years (63072000) are recommended. Note that once this value is set, the site must continue to support HTTPS until the expiry time has been reached.
includeSubDomains notifies the browser that all subdomains of the current origin should also be upgraded via HSTS. For example, setting includeSubDomains on domain.example.com will also set it on host1.domain.example.com and host2.domain.example.com. Extreme care is needed when setting the includeSubDomains flag, as it could disable sites on subdomains that don’t yet have HTTPS enabled.
preload allows the website to be included in the HSTS preload list, upon submission. As a result, web browsers will do HTTPS upgrades to the site without ever having to receive the initial HSTS header. This prevents downgrade attacks upon first use and is recommended for all high risk websites. Note that being included in the HSTS preload list requires that includeSubDomains also be set.
Examples
See Also
HTTP Redirections
Websites may continue to listen on port 80 (HTTP) so that users do not get connection errors when typing a URL into their address bar, as browsers currently connect via HTTP for their initial request. Sites that listen on port 80 should only redirect to the same resource on HTTPS. Once the redirection has occurred, HSTS should ensure that all future attempts go to the site via HTTP are instead sent directly to the secure site. APIs or websites not intended for public consumption should disable the use of HTTP entirely.
Sites should avoid redirections from HTTP to HTTPS on a different host, as this prevents HSTS from being set. Instead, for example, first redirect from http://example.com/ to https://example.com/ and then in a second redirect, redirect from https://example.com/ to https://example.org/
Examples
HTTP Public Key Pinning
Maximum risk sites may enable the use of HTTP Public Key Pinning (HPKP). HPKP instructs a user agent to bind a site to specific root certificate authority, intermediate certificate authority, or end-entity public key. This prevents certificate authorities from issuing unauthorized certificates for a given domain that would nevertheless be trusted by the browsers. These fraudulent certificates would allow an active attacker to MitM and impersonate a website, intercepting credentials and other sensitive data.
Due to the risk of knocking yourself off the internet, HPKP must be implemented with extreme care. This includes having backup key pins, testing on a non-production domain, testing with Public-Key-Pins-Report-Only and then finally doing initial testing with a very short-lived max-age directive. Because of the risk of creating a self-denial-of-service and the very low risk of a fraudulent certificate being issued, it is not recommended for most websites to implement HPKP.
Directives
max-age:number of seconds the user agent will enforce the key pins and require a site to use a cert that satisfies themincludeSubDomains:whether user agents should pin all subdomains to the same pins
Unlike with HSTS, what to set max-age is highly individualized to a given site. A longer value is more secure, but screwing up your key pins will result in your site being unavailable for a longer period of time. Recommended values fall between 15 and 120 days.
Examples
See Also
The HPKP Toolset - helpful tools for generating key pins
Resource Loading
All resources — whether on the same origin or not — should be loaded over secure channels. Secure (HTTPS) websites that attempt to load active resources such as JavaScript insecurely will be blocked by browsers. As a result, users will experience degraded UIs and “mixed content” warnings. Attempts to load passive content (such as images) insecurely, although less risky, will still lead to degraded UIs and can allow active attackers to deface websites or phish users.
Despite the fact that modern browsers make it evident that websites are loading resources insecurely, these errors still occur with significant frequency. To prevent this from occurring, developers should verify that all resources are loaded securely prior to deployment.
Examples
See Also
Content Security Policy
Content Security Policy (CSP) is an HTTP header that allows site operators fine-grained control over where resources on their site can be loaded from. The use of this header is the best method to prevent cross-site scripting (XSS) vulnerabilities. Due to the difficulty in retrofitting CSP into existing websites, CSP is mandatory for all new websites and is strongly recommended for all existing high-risk sites.
The primary benefit of CSP comes from disabling the use of unsafe inline JavaScript. Inline JavaScript – either reflected or stored – means that improperly escaped user-inputs can generate code that is interpreted by the web browser as JavaScript. By using CSP to disable inline JavaScript, you can effectively eliminate almost all XSS attacks against your site.
Note that disabling inline JavaScript means that all JavaScript must be loaded from <script> src tags . Event handlers such as onclick used directly on a tag will fail to work, as will JavaScript inside <script> tags but not loaded via src. Furthermore, inline stylesheets using either <style> tags or the style attribute will also fail to load. As such, care must be taken when designing sites so that CSP becomes easier to implement.
Implementation Notes
Aiming for
default-src https:is a great first goal, as it disables inline code and requires https.For existing websites with large codebases that would require too much work to disable inline scripts,
default-src https: 'unsafe-inline'is still helpful, as it keeps resources from being accidentally loaded over http. However, it does not provide any XSS protection.It is recommended to start with a reasonably locked down policy such as
default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'and then add in sources as revealed during testing.In lieu of the preferred HTTP header, pages can instead include a
<meta http-equiv=“Content-Security-Policy”content=“…”>tag. If they do, it should be the first<meta>tag that appears inside<head>.Care needs to be taken with
data:URIs, as these are unsafe insidescript-srcandobject-src(or inherited fromdefault-src).Similarly, the use of
script-src 'self'can be unsafe for sites with JSONP endpoints. These sites should use ascript-srcthat includes the path to their JavaScript source folder(s).Unless sites need the ability to execute plugins such as Flash or Silverlight, they should disable their execution with
object-src 'none'.Sites should ideally use the
report-uridirective, which POSTs JSON reports about CSP violations that do occur. This allows CSP violations to be caught and repaired quickly.Prior to implementation, it is recommended to use the
Content-Security-Policy-Report-OnlyHTTP header, to see if any violations would have occurred with that policy.
Examples
See Also
contribute.json
contribute.json is a text file placed within the root directory of a website that describes what it is, where its source exists, what technologies it uses, and how to reach support and contribute. contribute.json is a Mozilla standard used to describe all active Mozilla websites and projects.
Its existence can greatly speed up the process of bug triage, particularly for smaller websites with just a handful of maintainers. It further assists security researchers to find testable websites and instructs them on where to file their bugs against. As such, contribute.json is mandatory for all Mozilla websites, and must be maintained as contributors join and depart projects.
Require subkeys include name, description, bugs, participate (particularly irc and irc-contacts), and urls.
Examples
See Also
Cookies
All cookies should be created such that their access is as limited as possible. This can help minimize damage from cross-site scripting (XSS) vulnerabilities, as these cookies often contain session identifiers or other sensitive information.
Directives
Name: Cookie names may be either be prepended with either
__Secure-or__Host-to prevent cookies from being overwritten by insecure sourcesUse
__Host-for all cookies needed only on a specific domain (no subdomains) wherePathis set to/Use
__Secure-for all other cookies sent from secure origins (such as HTTPS)
Secure: All cookies must be set with theSecureflag, indicating that they should only be sent over HTTPSHttpOnly:Cookies that don’t require access from JavaScript should be set with theHttpOnlyflagExpiration: Cookies should expire as soon as is necessary: session identifiers in particular should expire quickly
Expires:Sets an absolute expiration date for a given cookieMax-Age:Sets a relative expiration date for a given cookie (not supported by IE <8)
Domain:Cookies should only be set with this if they need to be accessible on other domains, and should be set to the most restrictive domain possiblePath:Cookies should be set to the most restrictive path possible, but for most applications this will be set to the root directorySameSite: Forbid sending the cookie via cross-origin requests (such as from<img>tags, etc.), as a strong anti-CSRF measureSameSite=Strict: Only send the cookie when site is directly navigated toSameSite=Lax: Send the cookie when navigating to your site from another site
Examples
See Also
Cross-origin Resource Sharing
Access-Control-Allow-Origin is an HTTP header that defines which foreign origins are allowed to access the content of pages on your domain via scripts using methods such as XMLHttpRequest. crossdomain.xml and clientaccesspolicy.xml provide similar functionality, but for Flash and Silverlight-based applications, respectively.
These should not be present unless specifically needed. Use cases include content delivery networks (CDNs) that provide hosting for JavaScript/CSS libraries and public API endpoints. If present, they should be locked down to as few origins and resources as is needed for proper function. For example, if your server provides both a website and an API intended for XMLHttpRequest access on a remote websites, only the API resources should return the Access-Control-Allow-Origin header. Failure to do so will allow foreign origins to read the contents of any page on your origin.
Examples
See Also
CSRF Prevention
Cross-site request forgeries are a class of attacks where unauthorized commands are transmitted to a website from a trusted user. Because they inherit the users cookies (and hence session information), they appear to be validly issued commands. A CSRF attack might look like this:
When a user visits a page with that HTML fragment, the browser will attempt to make a GET request to that URL. If the user is logged in, the browser will provide their session cookies and the account deletion attempt will be successful.
While there are a variety of mitigation strategies such as Origin/Referrer checking and challenge-response systems (such as CAPTCHA), the most common and transparent method of CSRF mitigation is through the use of anti-CSRF tokens. Anti-CSRF tokens prevent CSRF attacks by requiring the existence of a secret, unique, and unpredictable token on all destructive changes. These tokens can be set for an entire user session, rotated on a regular basis, or be created uniquely for each request. Although SameSite cookies are the best defense against CSRF attacks, they are not yet fully supported in all browsers and should be used in conjunction with other anti-CSRF defenses.
Examples
See Also
Referrer Policy
When a user navigates to a site via a hyperlink or a website loads an external resource, browsers inform the destination site of the origin of the requests through the use of the HTTP Referer (sic) header. Although this can be useful for a variety of purposes, it can also place the privacy of users at risk. HTTP Referrer Policy allows sites to have fine-grained control over how and when browsers transmit the HTTP Referer header.
In normal operation, if a page at https://example.com/page.html contains <img src="https://not.example.com/image.jpg">, then the browser will send a request like this:
In addition to the privacy risks that this entails, the browser may also transmit internal-use-only URLs that it may not have intended to reveal. If you as the site operator want to limit the exposure of this information, you can use HTTP Referrer Policy to either eliminate the Referer header or reduce the amount of information that it contains.
Directives
no-referrer: never send theRefererheadersame-origin: send referrer, but only on requests to the same originstrict-origin: send referrer to all origins, but only the URL without the path (e.g. https://example.com/)strict-origin-when-cross-origin: send full referrer on same origin, URL without the path on foreign origin
Notes
Although there are other options for referrer policies, they do not protect user privacy and limit exposure in the same way as the options above.
no-referrer-when-downgrade is the default behavior for all current browsers, and can be used when sites are concerned about breaking existing systems that rely on the full Referrer header for their operation.
Referrer Policy has good support across modern browsers. The exception is Microsoft Edge, which still supports an older version of the specification.
Examples
See Also
robots.txt
robots.txt is a text file placed within the root directory of a site that tells robots (such as indexers employed by search engines) how to behave, by instructing them not to crawl certain paths on the website. This is particularly useful for reducing load on your website through disabling the crawling of automatically generated content. It can also be helpful for preventing the pollution of search results, for resources that don’t benefit from being searchable.
Sites may optionally use robots.txt, but should only use it for these purposes. It should not be used as a way to prevent the disclosure of private information or to hide portions of a website. Although this does prevent these sites from appearing in search engines, it does not prevent its discovery from attackers, as robots.txt is frequently used for reconnaissance.
Examples
See Also
Subresource Integrity
Subresource integrity is a recent W3C standard that protects against attackers modifying the contents of JavaScript libraries hosted on content delivery networks (CDNs) in order to create vulnerabilities in all websites that make use of that hosted library.
For example, JavaScript code on jquery.org that is loaded from example.org has access to the entire contents of everything of example.org. If this resource was successfully attacked, it could modify download links, deface the site, steal credentials, cause denial-of-service attacks, and more.
Subresource integrity locks an external JavaScript resource to its known contents at a specific point in time. If the file is modified at any point thereafter, supporting web browsers will refuse to load it. As such, the use of subresource integrity is mandatory for all external JavaScript resources loaded from sources not hosted on Mozilla-controlled systems.
Note that CDNs must support the Cross Origin Resource Sharing (CORS) standard by setting the Access-Control-Allow-Origin header. Most CDNs already do this, but if the CDN you are loading does not support CORS, please contact the Security Assurance team. We are happy to contact the CDN on your behalf.
Directives
integrity:a cryptographic hash of the file, prepended with the hash function used to generate itcrossorigin:should beanonymousto inform browsers to send anonymous requests without cookies
Examples
See Also
SRI Hash Generator - generates
<script>tags for you, and informs you if the CDN lacks CORS support
X-Content-Type-Options
X-Content-Type-Options is a header supported by Internet Explorer, Chrome and Firefox 50+ that tells it not to load scripts and stylesheets unless the server indicates the correct MIME type. Without this header, these browsers can incorrectly detect files as scripts and stylesheets, leading to XSS attacks. As such, all sites must set the X-Content-Type-Options header and the appropriate MIME types for files that they serve.
Examples
See Also
X-Frame-Options
X-Frame-Options is an HTTP header that allows sites control over how your site may be framed within an iframe. Clickjacking is a practical attack that allows malicious sites to trick users into clicking links on your site even though they may appear to not be on your site at all. As such, the use of the X-Frame-Options header is mandatory for all new websites, and all existing websites are expected to add support for X-Frame-Options as soon as possible.
Note that X-Frame-Options has been superseded by the Content Security Policy’s frame-ancestors directive, which allows considerably more granular control over the origins allowed to frame a site. As frame-ancestors is not yet supported in IE11 and older, Edge, Safari 9.1 (desktop), and Safari 9.2 (iOS), it is recommended that sites employ X-Frame-Options in addition to using CSP.
Sites that require the ability to be iframed must use either Content Security Policy and/or employ JavaScript defenses to prevent clickjacking from malicious origins.
Directives
DENY: disallow allow attempts to iframe site (recommended)SAMEORIGIN: allow the site to iframe itselfALLOW-FROMuri: deprecated; instead use CSP’sframe-ancestorsdirective
Examples
See Also
X-XSS-Protection
In modern browsers, X-XSS-Protection has been deprecated in favor of the Content-Security-Policy to disable the use of inline JavaScript. Its use can introduce XSS vulnerabilities in otherwise safe websites. This should not be used unless you need to support older web browsers that don’t yet support CSP. It is thus recommended to set the header as X-XSS-Protection: 0.
Last updated