2012-05-25 10 views
10

Me gustaría implementar Framebursting selectivo para mi aplicación iframe.Framebufting selectivo

Mi iframe está disponible en www.mywebsite.con/iframe.aspx?lic=1234

Cuando el sitio web de terceros de alojamiento es mi iframe (PayedWebsited1.con O PayedWebsited2.con) Y también existe la opción lic=1234, visualizar el marco flotante. Para cualquier otro tramposo, ¡muestre plátanos!

¿Cómo puedo hacerlo?

+0

Necesita un poco de lenguaje del lado del servidor para comprobar esto y prodivde el contenido correspondiente. A menos que quiera almacenar los posibles 'lic =' 's en su JS, para que todos puedan leerlos. – pduersteler

+0

Hola, ¿podría darme una pequeña muestra? – OrElse

Respuesta

-1

Global.asax hizo el truco!

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     Dim ref As String = HttpContext.Current.Request.ServerVariables("HTTP_REFERER") 
     If Not ref.Contains("PayedWebsited1") And Not ref.Contains("PayedWebsited2") Then 
      Response.Redirect("MYDOMAIN", True) 
     End If 
End Sub 

¡Gracias a todos!

+0

Como esto no incluye ningún JavaScript, no se trata de destruir el marco. Ahora dentro del marco, recibes una solicitud con REFERER = some_site. Luego se redirige, por lo que dentro del marco se obtiene la misma página, justo después de redirigir. Ahora REFERER = your_site y la página se muestra. Y todavía está en el marco. –

0

Debido a la seguridad, su navegador no le permitirá usar javascript para detectar la URL de la página principal (es decir, la página que contiene el iframe que muestra su página).

Las únicas soluciones que se me ocurren son:

  1. Insistir en que los usuarios de su página iframe.aspx, incluyen un parámetro GET adicional que establece el dominio que están utilizando.
  2. Uso del Request.UrlReferrer para obtener la URL de referencia

En la página que se renderiza, usted debe tener un literal que, en caso de que desee evitar que la persona que enmarca su página, sólo tiene que añadir el código JavaScript necesario para fuerza los marcos.

Desafortunadamente, si javascript está deshabilitado, esto hará que su código inútil ...

Esperanza esto ayuda?

protected void page_load(object sender, EventArgs e) 
{ 
    bool killFrames = false; 
    if(Request.QueryString["lic"] == null) 
     killFrames = true; 
    if(!killFrames && Request.UrlReferrer != null) 
    { 
     // do some database check against the LIC and Referrer 
     // and set killFrames accordingly. 
    } 
    if(killFrames) 
    { 
     literalFrame.Text = "<script type=\"text/javascript\">if(top.location != location) { top.location.href = document.location.href; }</script>"; 
     // or show the bananas 
    } 
    else 
    { 
     // render the page accordingly. 
    } 
} 
0

voy a tratar de señalar una solución para su problema general y no particular, este problema técnico, que por lo que sé es imposible que las medidas de seguridad realizados por todos los navegadores web.


Necesita algún tipo de apretón de manos entre su aplicación y la suya, y eso tiene que hacerse desde el servidor.

Cada PayedWebsite debe tener una contraseña (o si tienen una dirección IP estática, puede usarla). Internamente en su servidor (usando CURL puede ser), ellos te envían -via POST- su contraseña; luego devuelve un token que se usa en el iframe.

iframe.aspx?lic=1234&token=d16evg5tr44e0trty45xp6es5 

Y el token solo funciona una vez; por lo tanto, el proceso debe repetirse cada vez que se necesite abrir el iframe. Y rechazas todas las conexiones que no incluyen un token válido.

4

El hecho es que ese número de licencia no servirá de nada, ya sea que use la solución del servidor o en javascript. Los tramposos podrán ver ese número de licencia en PayedWebsite1.com.

Como se dijo, no puede obtener la ubicación del fotograma principal, pero puede obtener la referencia, es igual al fotograma principal, si su página está cargada en iframe.

if (window.top.location !== document.location) { // only if we're in iframe 
          // we get host of our referrer 
    var host = document.referrer.match(new RegExp("(http|https)://(.*?)/.*$"))[2]; 
    host = host.toLowerCase(); // convert to lower case 
    var myHost = document.location.host.toLowerCase(); 
    if (
     host !== myHost     // so we can click on links in an iframe 
     && host !== 'payedwebsite1.com' 
     && host !== 'payedwebsite2.com' 
    ) { 
     window.top.location.href = document.location.href; 
    } 
} 

Tenga en cuenta que esta técnica puede ser superada.Más información en http://javascript.info/tutorial/clickjacking

Para los nuevos navegadores, puede enviar cabecera especial:

La lógica mantiene el mismo, sólo en el lado del servidor. Verifique Referrer, si PayedDomain o su propio dominio, simplemente continúe. De lo contrario, envíe este encabezado.

+0

Hola, probé tu solución pero el iframe está cargado en pantalla completa en el sitio web payedwebsite1.com ¿Podrías actualizarme? – OrElse

+0

El dominio debe estar exactamente como marcado, es decir "payedwebsite1.com", no por ejemplo "www.payedwebsite1.com". No puedo dar más información sin ver tu problema. ¿Podrías dar un enlace? Lo probé localmente y funcionó bien. Puede depurar cambiando código dentro si algo como console.log (host); o alerta (host); –

+0

También tenga en cuenta que si payedwebsite.com está en HTTPS y su iframe está en HTTP, no se enviará referencia. –

0

No soy un experto en .NET, pero parece que su solución podría resolverse fácilmente mediante el seguimiento del encabezado de referencia que el cliente envía a su página al cargar el contenido del iframe.

Es posible que desee hacer referencia a otra pregunta relativa a las cabeceras referirse: how should we validate http header referrer in aspx .net

Básicamente, usted haría lo siguiente

  1. Uso de la cabecera de referencia para obtener el nombre de dominio
  2. buscar el nombre de dominio en su base de datos (para ver si había una licencia para ese sitio)
  3. Envíe la página real, o los plátanos según el resultado del partido.
+0

Los interlocutores no son confiables para nada que requiera seguridad real (son fácilmente falsificados). Creo que OP necesita algo que el usuario no pueda evitar. – Brilliand

+1

Creo que no es una medida de seguridad, sino solo una restricción de marco: la referencia es correcta en esta situación. Todavía puede ver el contenido de la página cuando no está abierto en iframe, por lo que la derivación de referencia no tiene sentido. A menos que haya una forma de suplantarlo con la página de iframe (?) –

+0

No solo los remitentes se falsifican fácilmente, sino que con frecuencia son eliminados de la solicitud por un software de seguridad bien intencionado. – jatrim

3

Si es posible para los usuarios de terceros para incluir un archivo JavaScript, o, idealmente, enviar una solicitud en ASP antes de estirar la página, esto es lo que haría:

Javascript

  1. Cree una página ASP (hago PHP, entonces mi ejemplo es en PHP) en su servidor que verifica la referencia y el número de licencia para que coincida con una cuenta en su base de datos. El archivo ASP debería generar funciones de javascript que reemplazarán o insertarán en el elemento su iframe especificado con una clave de "uso único" que usted genere. El archivo puede tener un aspecto similar a este:

    <?php 
    $lic = $_GET['lic']; // Do better validation (short for demo purposes) 
    if (valid_license($lic, $_SERVER['HTTP_REFERER'])) { 
        $one_time_key = get_access_key($lic); 
        ?> 
        function drawIframe() { 
         document.getElementById('iframe_target').innerHTML = "<iframe src='mysite.php?key=<?php echo $one_time_key;?>'></iframe>"; 
        } 
        <?php 
    } 
    else { 
        echo "You are not authorized to use this service."; 
    } 
    
  2. Haga que su cliente incluye el código Javascript como un reemplazo de su marco flotante, de una manera similar a esto:

    <script src="http://www.yoursite.com/preauth.php?lic=1234"></script> 
    <script>drawIframe();</script> 
    <div id="iframe_target"></div> 
    
  3. En la página que es cargado por el iframe, inmediatamente verifique la clave que generó contra el valor pasado al iframe. Si es válido, elimine o cambie el estado de la clave inmediatamente para que sepa que se ha utilizado. A continuación, muestre la aplicación adecuada.

    • Este método JavaScript será el método menos doloroso para sus terceros usuarios, aunque puede ser vencido (los usuarios pueden cambiar el "árbitro" que se envía a su servidor, aunque es poco probable.)

ASP

Si usted puede conseguir sus usuarios hacer una petición a la URL dentro de su servidor, se eliminará la exposición de cualquier información de riesgo como la licencia para el usuario. Podrían llamar a algo como $key = file_get_contents("http://www.yoursite.com/preauth.asp?lic=1234"); Inmediatamente después de que puedan generar el iframe con la clave de uso único que acaba de generar.

Cuestiones relacionadas