Fixing Missing Strict-Transport-Security in Modern Frameworks

11/9/2023

What is Strict-Transport-Security (HSTS)?

The Strict-Transport-Security (HSTS) header is a security feature that helps prevent MITM (Man-in-the-middle) attacks by ensuring that web browsers always connect to a website using a secure connection (HTTPS). If a website does not have HSTS implemented, an attacker can intercept and manipulate traffic, potentially stealing sensitive information.

Why is HSTS Important?

HSTS is an essential security feature that helps protect users from various types of attacks, including:

  • SSL stripping
  • Cookie hijacking
  • Phishing attacks

By implementing HSTS, you can ensure that your users' connections to your website are always secure and encrypted.

How to Implement HSTS in Popular Frameworks

1. Express.js (Node.js)

To implement HSTS in Express.js, you can use the helmet middleware package. First, install helmet using npm:

npm install helmet

Then, add the following code to your Express.js application:

const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet());
app.use(helmet.hsts({ maxAge: 31536000 })); // 1 year

2. Django

To implement HSTS in Django, you can use the SECURE_HSTS_SECONDS setting. Add the following code to your settings.py file:

SECURE_HSTS_SECONDS = 31536000  # 1 year

Alternatively, you can use a custom middleware to implement HSTS:

from django.http import HttpResponse

class HSTSMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
        return response

Then, add the middleware to your MIDDLEWARE setting:

MIDDLEWARE = [
    # ...
    'path.to.HSTSmiddleware',
]

3. Flask

To implement HSTS in Flask, you can use the @after_this_request decorator to modify the response headers. Add the following code to your Flask application:

from flask import after_this_request, Response

@app.after_request(response)
def add_hsts_header(response):
    response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
    return response

4. Ruby on Rails

To implement HSTS in Ruby on Rails, you can use the config.action_controller.default_tags setting. Add the following code to your config/application.rb file:

config.action_controller.default_tags << { 'Strict-Transport-Security' => 'max-age=31536000; includeSubDomains' }

Alternatively, you can use a custom middleware to implement HSTS:

class HSTSMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
    [status, headers, body]
  end
end

Then, add the middleware to your config.middleware setting:

config.middleware.use 'HSTSMiddleware'

Conclusion

Implementing HSTS is a straightforward process in most modern frameworks. By following the instructions above, you can improve the security of your application and protect your users from potential threats.

Additional Resources