logo

Insecure or unset HTTP headers - Referrer-Policy - Dart


Need

Implementation of secure and properly configured HTTP headers


Context

  1. Usage of Dart 2.0 for building scalable and efficient web and mobile applications
  2. Usage of Shelf for managing and organizing data in Node.js applications

Description

Insecure Code Example

import 'package:shelf/shelf.dart' as shelf;

void main() {
  var handler = const shelf.Pipeline().addMiddleware(shelf.logRequests()).addHandler(_echoRequest);

  shelf.serve(handler, 'localhost', 8080).then((server) {
    print('Serving at http://${server.address.host}:${server.port}');
  });
}

shelf.Response _echoRequest(shelf.Request request) {
  return shelf.Response.ok('Request for "${request.url}"');
}

In the above Dart code, we are using the `shelf` package to create a simple server. The server listens on localhost at port 8080 and responds to any request with a simple message. However, this code is vulnerable because it does not set the `Referrer-Policy` HTTP header. The `Referrer-Policy` header controls how much referrer information (sent via the `Referer` header) should be included with requests. Without this header, or with an insecure configuration, it could potentially leak sensitive data from the URL to other sites through the `Referer` header. This can happen when your site links to an external site or loads resources from it. To mitigate this vulnerability, it is recommended to always set the `Referrer-Policy` header to a secure value like 'no-referrer', 'same-origin', or 'strict-origin-when-cross-origin'.

Steps

  1. Import the 'shelf' package in your Dart file.
  2. Create a middleware function that adds the 'Referrer-Policy' HTTP header to every response.
  3. The value of the 'Referrer-Policy' should be set to a secure option like 'no-referrer', 'same-origin', or 'strict-origin-when-cross-origin'.
  4. Add this middleware to your server pipeline using the 'addMiddleware' function.

Secure Code Example

import 'package:shelf/shelf.dart' as shelf;

void main() {
  var handler = const shelf.Pipeline()
      .addMiddleware(shelf.logRequests())
      .addMiddleware(_addReferrerPolicyHeader)
      .addHandler(_echoRequest);

  shelf.serve(handler, 'localhost', 8080).then((server) {
    print('Serving at http://${server.address.host}:${server.port}');
  });
}

shelf.Response _echoRequest(shelf.Request request) {
  return shelf.Response.ok('Request for "${request.url}"');
}

shelf.Middleware _addReferrerPolicyHeader() {
  return (shelf.Handler innerHandler) {
    return (shelf.Request request) async {
      final response = await innerHandler(request);
      return response.change(headers: {'Referrer-Policy': 'strict-origin-when-cross-origin'});
    };
  };
}

The above code fixes the vulnerability by adding a middleware function `_addReferrerPolicyHeader` to the server pipeline. This function adds the 'Referrer-Policy' HTTP header to every response. The value of the 'Referrer-Policy' is set to 'strict-origin-when-cross-origin', which is a secure option. The 'Referrer-Policy' HTTP header controls how much referrer information (sent via the Referer header) should be included with requests. The 'strict-origin-when-cross-origin' option sends a full URL when performing a same-origin request, only sends the origin of the document for cross-origin requests, and sends no header to a less secure destination (from HTTPS to HTTP). This middleware is added to the server pipeline using the `addMiddleware` function, ensuring that every response includes this header. This helps to prevent potential security vulnerabilities related to the referrer policy.


References

  • 071 - Insecure or unset HTTP headers - Referrer-Policy

  • Last updated

    2023/09/18