HTTP Strict Transport Security setzen

HSTS (HTTP Strict Transport Security) verhindert sogenannte SSL Stripping Angriffe (ein bestimmte Art von man-in-the-middle-attack): wenn ein Nutzer bequemerweise example.com in den Browser eingibt, macht der automatisch ein http://example.com daraus. Der Server antwortet mit einem redirect zu der gesicherten Verbindung https://example.com. In dem Zeitraum zwischen der HTTP Anfrage und dem HTTPS response könnte die Verbindung übernommen und auf eine HTTP spoofing Seite umgeleitet werden. Es erfolgt also auch ein protocol downgrade. Dort könnten dann dem Benutzer sensible Daten entlockt werden.
HSTS sichert den Browser gegen diese Attacke ab, indem es von ihm verlangt, immer direkt die gesicherte HTTPS Verbindung zu verwenden. Dafür muss der Browser einmalig HSTS im Header von der Domain erhalten haben. Wenn der Browser also einmal weiß, dass die Domain HTTPS only ist, dann wird er immer sofort zu https://example.com gehen.
Der Headereintrag könnte so aussehen:

Strict-Transport-Security: max-age=31536000; includeSubDomains

Das bedeutet, daß HSTS für ein Jahr gültig ist und alle Subdomains beinhaltet.
Ruby on Rails unterstützt HSTS im Header standardmäßig (lesen, wie eine SSL Verbindung in Rails konfiguriert wird: Rails mit HTTPS) und setzt die Dauer auf genau 365 Tage (aber nicht für die Subdomains).
Ein weiterer Grund zum verändern des HSTS könnte auch sein, wenn der HSTS zum Beispiel testweise nur 1 Monat gültig sein soll. Denn wenn die Seite aus welchen Gründen auch immer wieder ungesichert ausgeliefert werden soll, bekommt der Browser für die verbleibende Zeit des Jahres eine unschöne Zertifikatsungültikeitsmeldung.
Der Header sollte im Falle in dem application_controller.rb gesetzt werden:

before_filter :strict_transport_security

private                                                                         
  def strict_transport_security                                                 
    response.headers["Strict-Transport-Security"] = 'max-age=2678400; includeSubDomains'
  end 

Im Fall des Rollback zu HTTP müsste max-age auf Null gesetzt werden:

before_filter :strict_transport_security

private                                                                         
  def strict_transport_security                                                 
    response.headers["Strict-Transport-Security"] = 'max-age=0; includeSubDomains'
  end