9 de julio de 2014

Cómo implementar el encabezado HTTP Strict Transport Security en código

Si el video de OWASP del anterior post sobre HSTS (HTTP Strict Transport Security) los dejó con algo de espectativas acerca de la implementación del encabezado de HTTP para el uso estricto de HTTPS, entonces lo que viene a continuación les interesa.
Si bien se puede implementar el encabezado a nivel de servicio web agregando en la configuración de las diferentes plataformas (Apache, IIS, nginx y otros) un "header", a veces es mucho más práctico agregar la cabecera directamente a nivel de aplicación o en las rutinas específicamente sensibles.
Cómo el vídeo no nos muestra el código para ello a continuación algunos ejemplos en diferentes lenguajes y/o plataformas:

Implementación en PHP.
// Usar HTTP Strict Transport Security para forzar al cliente a usar 
// conexiones seguras

$use_sts = true;
 
// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}  
Implementación en Perl CGI.
# Usar HTTP Strict Transport Security para forzar al cliente a usar
# conexiones seguras
use CGI;
use URI;
 
my $q   = new CGI;
my $url = URI->new($cgi->request_uri)
my $use_sts = 1;
 
if ($use_sts and $url->scheme eq 'https') {
    print $q->header('Strict-Transport-Security' => 'max-age=31536000'); 
} elsif ($use_sts) {
    $url->scheme('https');
    print $q->redirect(status => 301, location => $url);
}  
Implementación en Ruby on Rails.
class ApplicationController < ActionController::Base
  before_filter :ensure_proper_protocol
 
private
  def ensure_proper_protocol
    if request.ssl?
      response.headers['Strict-Transport-Security'] = 'max-age=31536000'
    else
      redirect_to "https://" + request.host + request.request_uri, :status => 301
    end
  end
end  
Implementación en C# / ASP.NET. Código en archivo global.asax
// Usar HTTP Strict Transport Security para forzar al cliente a usar 
// conexiones seguras
protected void Application_BeginRequest() { switch (Request.Url.Scheme) { case "https": Response.AddHeader("Strict-Transport-Security", "max-age=31536000"); break; case "http": var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; Response.Status = "301 Moved Permanently"; Response.AddHeader("Location", path); break; } }  
Implementación en ColdFusion Markup Language (CFML).
<!--- Usar HTTP Strict Transport Security para forzar al cliente a usar
conexiones seguras --->
<cfset use_sts = true>
 
<cfif use_sts is "True">
    <cfif cgi.https is "on"> 
        <cfheader name="Strict-Transport-Security" value="max-age=31536000">
    <cfelse> 
        <cfheader statuscode="301" statustext="Moved permanently">
        <cfheader name="Location" value="https://" + CGI.SERVER_NAME + CGI.SCRIPT_NAME + CGI.QUERY_STRING>
    </cfif>
</cfif>  
Implementación en JavaServer Pages (JSP) o Java Servlets.
// Usar HTTP Strict Transport Security para forzar al cliente a usar 
// conexiones seguras
boolean use_sts = true; if(use_sts) { if(request.getScheme().equals("https")) { // Send HSTS header response.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubdomains"); } else { // Redirect to HTTPS response.setStatus(301); String url = "https://" + request.getServerName(); if(request.getPathInfo() != null) { url = url + "/" + request.getPathInfo(); } if(request.getQueryString() != null && request.getQueryString().length() > 0) { url = url + "?" + request.getQueryString(); } response.setHeader("Location", url); } }

Espero les sea suficientemente útil y como podrán apreciar no es nada complicado.

No hay comentarios.:

Entradas populares