La página Web que está abriendo contiene tanto elementos seguros como no seguros.

Cuando trabajamos con páginas SSL es bastante molesto encontrarse con un mensaje del navegador indicando que "La página Web que está abriendo contiene elementos seguros como no seguros. ¿Desea mostrar los elementos no seguros?"

Este mensaje además de molesto - sale siempre - resulta cuanto menos "inquietante" y puede provocar que más de un usuario salga inmediatamente de nuestro sitio Web. Algo especialmente grave si se trata de un sitio web dedicado a la venta online.

¿Como evitarlo?. Para responder a esta pregunta lo primero que debemos saber en porque se está produciendo. Este mensaje se muestra cuando dentro de un entorno SSL (protocolo https) existe alguna petición http. Es decir, en nuestra página hay elementos apuntado a una URL absoluta con protocolo http. Estos elementos pueden ser imagenes, scripts, css ...

Un ejemplo claro es cuando incluimos una pelicula flash en nuestra página, por defecto, el enlace incluye una redirección a la página de adobe para descargar el reproductor en el caso de que no lo tengamos instalado. Ese enlace es absoluto a través de http - por lo que provoca el molesto error.

Este sería un enlace a una pelicula flash tipico:

 

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

codebase="http://download.macromedia.com/.../swflash.cab#version=5,0,0,0"

width="516" height="76" id="ShockwaveFlash1">

<param name="movie" value="mipelicula.swf"/>

<param name="quality" value="high"/>

<param name="bgcolor" value="#000000"/>

</object>

Este enlace no muestra ningún error cuando estamos sobre un entorno http - tipicamente el entorno de desarrollo -, pero cuando pasamos a un entorno https - producción - muestra el mensaje debido al enlace http://download.macromedia.com/.../swflash.cab#version=5,0,0,0 que contiene.

En este caso la solucion es sencilla, bastará con quitar el enlace http la etiqueta.

 

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

width="516" height="76" id="ShockwaveFlash1">

<param name="movie" value="mipelicula.swf"/>

<param name="quality" value="high"/>

<param name="bgcolor" value="#000000"/>

</object>

Pero no siempre es tan fácil solucionar el error. Cuando no podemos o no queremos eliminar el enlace - por ejemplo un javascrit - tendremos que recurrir a otros métodos.

Por ejemplo, cuando utilizamos Google Analytics, tenemos que incluir el siguiente script en nuestra página.

	

<script src="http://www.google-analytics.com/urchin.js"

type="text/javascript"></script>

En este caso necesitaremos programar una página intermedia - que se trasmita por https - y que realice la solicitud a la dirección http y devuelva el mismo contenido. En nuestro caso, utilizamos ASP.NET por lo que nuestra página es aspx - pero la idea es válida para cualquier entorno web php, jsp, RoR ...

 

<script src="GetScript.aspx"

type="text/javascript"></script>

Y nuestra página GetScript.aspx (debemos incluir una directiva using System.Net;):

 

protected void Page_Load(object sender, EventArgs e)

{

string httpUrl = "http://www.google-analytics.com/urchin.js";

WebRequest httpRequest = WebRequest.Create(httpUrl);

WebResponse httpResponse = httpRequest.GetResponse();

System.IO.Stream webStream = httpResponse.GetResponseStream();

System.IO.StreamReader reader =

new System.IO.StreamReader(webStream );

string html = reader.ReadToEnd();

Response.Write(html);

}

En el caso de que la conexion salga a través de un servidor proxy:

 

protected void Page_Load(object sender, EventArgs e)

{

string httpUrl = "http://www.google-analytics.com/urchin.js";

WebRequest httpRequest =WebRequest.Create(httpUrl);

// En el caso de utilizar un servidor proxy

IWebProxy proxy = WebRequest.GetSystemWebProxy();

if (proxy != null && proxy.Credentials != null)

{

httpRequest.Proxy = proxy;

}

else

{

proxy = new WebProxy("<servidor proxy>:<puerto>");

NetworkCredential credenciales =

new NetworkCredential("<usuario>", "<clave>");

proxy.Credentials = credenciales;

httpRequest.Proxy = proxy;

}

WebResponse httpResponse = httpRequest.GetResponse();

System.IO.Stream webStream = httpResponse.GetResponseStream();

System.IO.StreamReader reader =

new System.IO.StreamReader(webStream);

string html = reader.ReadToEnd();

Response.Write(html);

}

Finalmente, si lo que queremos es "rizar el rizo", en lugar de utilizar una página - que entre otros inconveniente tiene que ejecuta su ciclo de vida completo - sería mejor utilizar un manejador http.

Para eso, creamos nuestro propio manejador de peticiones como se muestra a continuación.

 

<%@ WebHandler Language="C#" Class="Handler" %>

 

using System;

using System.Web;

using System.Net;

 

public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context)

{

context.Response.ContentType = "text/javascript";

context.Response.Write(GetData());

}

private string GetData()

{

string httpUrl = "http://www.google-analytics.com/urchin.js";

WebRequest httpRequest = WebRequest.Create(httpUrl);

// En el caso de utilizar un servidor proxy

IWebProxy proxy = WebRequest.GetSystemWebProxy();

if (proxy != null && proxy.Credentials != null)

{

httpRequest.Proxy = proxy;

}

else

{

 

proxy = new WebProxy("<servidor proxy>:<puerto>");

NetworkCredential credenciales =

new NetworkCredential("<usuario>", "<clave>");

proxy.Credentials = credenciales;

httpRequest.Proxy = proxy;

}

WebResponse httpResponse = httpRequest.GetResponse();

System.IO.Stream webStream = httpResponse.GetResponseStream();

System.IO.StreamReader reader =

new System.IO.StreamReader(webStream);

string html = reader.ReadToEnd();

return html;

}

public bool IsReusable

{

get {

return false;

}

}

}

Luego definimos una extension de archivo - en nuestro caso jsx - , incluimos el manejador en el web.config y cambiamos el enlace de la página para que apunte a un recurso .jsx

 

<httpHandlers>

<add verb="GET" path="*.jsx" validate="false" type="Handler"/>

</httpHandlers>

	<script src="GetScript.jsx" type="text/javascript"></script>

 Saludos,

Pedro  Herrarte  Sánchez
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:26/02/2009
Última actualizacion:26/02/2009
Visitas totales:7313
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com