HTTP response headers are vital in the interaction between a web server and its client, usually a web browser. They deliver key details about the fetched resource and guide the handling of the response. Proper configuration of these headers boosts performance, security, and user experience. In this article, we delve into the most frequently used HTTP response headers, discussing their application, security aspects, and best practices
As part of a regular penetration test, these headers should be reported so you can create a robust and secure application. See our other blog posts to discover what other common threats may be present within your digital estate.
HTTP Response Headers
1. Content-Type
The Content-Type
header informs the client about the media type of the returned content. This header is vital because it enables the browser to understand how to process and display the content. For example, if the content is HTML, the Content-Type
header should be set to text/html
. If it is a JSON object, the header should be application/json
.
Example:
Content-Type: text/html; charset=UTF-8
Security Implications: Setting the correct Content-Type
is crucial for security reasons. An incorrect or missing Content-Type
can cause browsers to interpret files in an unintended way, leading to vulnerabilities such as cross-site scripting (XSS). For example, if a JSON response is served with a Content-Type
of text/html
, a malicious user could potentially execute scripts in the context of the site.
Best Practice: Always specify the Content-Type
header to match the type of content being delivered. For HTML content, use:
Content-Type: text/html; charset=UTF-8
For JSON responses, use:
Content-Type: application/json; charset=UTF-8
2. Content-Security-Policy (CSP)
The Content-Security-Policy
(CSP) header is a powerful tool to enhance the security of a web application by defining which resources are allowed to load. CSP helps mitigate the risk of various attacks, including cross-site scripting (XSS), by specifying valid sources for content such as scripts, styles, and images.
Example:
Content-Security-Policy: default-src 'self'; img-src 'self' https://trustedsite.com; script-src 'self' 'unsafe-inline'
Security Implications: A robust CSP significantly reduces the risk of XSS and data injection attacks by controlling which sources of content the browser can load and execute. By restricting sources to only trusted domains, you can prevent attackers from injecting malicious scripts or resources.
Best Practice: Define a strict CSP that allows content only from trusted sources. Start with a basic policy and refine it over time:
Content-Security-Policy: default-src 'self'; img-src 'self'; script-src 'self'; style-src 'self';
Test and adjust the policy to balance security and functionality.
3. Strict-Transport-Security (HSTS)
The Strict-Transport-Security
(HSTS) header instructs the browser to only interact with the server using secure HTTPS connections, even if the user attempts to access the site using HTTP. This header ensures that subsequent requests are made over a secure channel.
Example:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Security Implications: HSTS protects against man-in-the-middle attacks, protocol downgrade attacks, and cookie hijacking by enforcing HTTPS. When a site is accessed over HTTP, there is a risk that the traffic could be intercepted and manipulated. By implementing HSTS, you ensure that the site is always accessed securely.
Best Practice: Set a long max-age value to ensure HSTS remains in effect for a considerable duration. Include subdomains to secure all parts of the site:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Consider submitting your domain to the HSTS preload list to ensure that browsers enforce HTTPS from the first visit.
4. X-Content-Type-Options
The X-Content-Type-Options
header prevents browsers from MIME-sniffing the content type and forces them to respect the declared Content-Type
. This is particularly important for preventing certain types of attacks.
Example:
X-Content-Type-Options: nosniff
Security Implications: MIME-sniffing can lead to security vulnerabilities, such as XSS and drive-by downloads, where the browser interprets content as executable code. By setting X-Content-Type-Options
to nosniff
, you ensure that the browser handles the content based solely on the Content-Type
header, thereby reducing the risk of executing malicious code.
Best Practice: Always set this header to nosniff
to prevent MIME-sniffing:
X-Content-Type-Options: nosniff
5. X-Frame-Options
Usage: The X-Frame-Options
header determines whether a browser should be allowed to render a page in a <frame>
, <iframe>
, <embed>
, or <object>
. This header is used to protect against clickjacking attacks.
Example:
X-Frame-Options: DENY
Security Implications: Clickjacking involves tricking a user into clicking on something different from what they perceive, often resulting in malicious actions like unintentional form submissions or financial transactions. By preventing your site from being framed, you protect users from such attacks.
Best Practice: Set this header to DENY
to disallow all framing:
X-Frame-Options: DENY
If you need to allow framing from the same origin, use:
X-Frame-Options: SAMEORIGIN
6. Referrer-Policy
The Referrer-Policy
header controls how much referrer information (the URL of the previous page) is included with requests sent from your site. This is important for both privacy and security.
Example:
Referrer-Policy: no-referrer
Security Implications: Referrer information can contain sensitive data, such as URL parameters. By controlling the referrer policy, you can prevent information leakage to third parties and enhance user privacy.
Best Practice: Set a policy that aligns with your privacy and security requirements. A commonly recommended setting is:
Referrer-Policy: strict-origin-when-cross-origin
This setting provides a good balance by sending full referrer information only for same-origin requests and stripping it for cross-origin requests.
7. Feature-Policy (or Permissions-Policy)
The Feature-Policy
(recently renamed to Permissions-Policy
) header allows you to control which features and APIs can be used in the browser, such as geolocation, camera access, and microphone use.
Example:
Feature-Policy: geolocation 'self'; camera 'none'
Security Implications: By restricting access to potentially sensitive APIs, you reduce the attack surface of your application. For example, preventing access to the camera and microphone unless explicitly needed can mitigate the risk of eavesdropping or surveillance by malicious scripts.
Best Practice: Define a restrictive policy tailored to your site’s needs. For example:
Permissions-Policy: geolocation=(self), camera=(), microphone=()
Regularly review and update the policy as your application’s requirements evolve.
8. Cache-Control
The Cache-Control
header specifies caching policies for both the client and the server. It is used to define how and for how long a resource should be cached, which can significantly impact performance and load times.
Example:
Cache-Control: no-cache, no-store, must-revalidate
Security Implications: Improper caching can lead to sensitive information being stored and potentially accessed by unauthorised users. For instance, caching sensitive data such as login pages or user-specific information could result in data leaks.
Best Practice: Set caching policies according to the sensitivity of the content. For sensitive content, use:
Cache-Control: no-store
For static resources that don’t change often, use:
Cache-Control: max-age=3600
This allows caching while ensuring that the cache is refreshed periodically.
Conclusion
Setting up HTTP response headers correctly is key to boosting your web app’s security, speed, and user-friendliness. Each header has a unique job in managing how the browser uses resources and defends against security risks. By sticking to best practices and frequently checking your setup, you can tackle many usual vulnerabilities and make your web app strong and safe. Keep up with the latest security methods and update your headers as required for the best protection.
If you want to test your web applications for vulnerabilities then please get in touch!