.

Ajax y el "Access Denied" cross-domain con un IFrame

   Uno de los grandes problemas que tenemos en lo referente a seguridad web, son los temido ataques "cross-site scripting". Algo que navegadores como IE (Internet Explorer) solventa con la negacion por defecto de acceso a scripts que estan hospedados en dominios distintos a los de nuestras aplicacion. Algo que otros navegadores no han optado por llevarlo desde un inicio.

   Esto nos lleva a que si tenemos que empotrar nuestro desarrollo dentro de un iframe de terceros, hospedados ambos en servidores distintos nuestra aplicacion funcionara perfectamete en Firefox, Safari, ..... pero no en IE, dandonos el error de "Access is denied" a ese script.

   La solucion es bastante mas sencilla de lo que hayamos podidos leer en otros sitios (1 y 2), simplemente tendremos que agregar a nuestra pagina o master page (dependiendo de donde nos convenga) el siguiente script:

<script type= "text/javascript">

if (Sys.Browser.agent == Sys.Browser.InternetExplorer){

                Sys.UI.DomElement.getLocation=function(a){

                if(a.self||a.nodeType===9)

                    return new Sys.UI.Point(0,0);

                var b=a.getBoundingClientRect();

                if(!b)

                    return new Sys.UI.Point(0,0);

                var c=a.document.documentElement,d=b.left-2+c.scrollLeft,e=b.top-2+c.scrollTop;

                try{

                    var g=a.ownerDocument.parentWindow.frameElement||null;

                    if(g){

                        var f=2-(g.frameBorder||1)*2;

                    d+=f;e+=f

                    }

               }catch(h){}

               return new Sys.UI.Point(d,e)}};

</script>

Espero que os sea util, y no os saque de vuestras casillas las distintas politicas e interpretaciones de cada navegador.

Posted: 1/8/2008 11:40 por Thempra | con 8 comment(s)
Archivado en: ,

Comentarios

Luis Reyes ha opinado:

Oye tengo una duda aplico t código pero ahora me dice que sys no esta definido, ya verifique el web config de hecho el sitio lo cree desde ajax web site y aun me marca lo de Sys indefinido

# August 7, 2008 12:24 AM

Thempra ha opinado:

Revisa el lugar donde has puesto el codigo. Prueba por ejemplo a colocarlo debajo de la definicion del ScriptManager.

He reeditado el post para que sea legible el codigo. De echo buscando acabo de darme cuenta que Marc Rubiño trato este mismo tema hace unos meses, ;)

# August 7, 2008 8:54 AM

Julian ha opinado:

Hola, muchas gracias por el script, ahora todo funciona muy bien. Te recomiendo que pongas el } que hace falta despues del último return, debería quedar así: return new Sys.UI.Point(d,e)}};

gracias

# August 11, 2008 10:22 PM

Thempra ha opinado:

Gracias por la nota Julian.

# August 12, 2008 8:09 AM

Trabajando con Ajax y las Microsoft Ajax Library (ScriptManager, UpdatePanel etc…) e IFrames: Como resolver el error “Access Denied”. « a deshoras ha opinado:

PingBack desde  Trabajando con Ajax y las Microsoft Ajax Library (ScriptManager, UpdatePanel etc&#8230;) e IFrames: Como resolver el error &#8220;Access Denied&#8221;. &laquo; a deshoras

# September 11, 2008 7:17 PM

David Bernad ha opinado:

Hola.

Tengo un problema y no sé si es el mismo. Tengo una aplicación que incluye en otra mediante un iframe, cada una en un servidor distinto. El contenido del iframe se ve bien en safari y en firefox, pero no en Internet Explorer.

Me da un error de javascript "Permission denied" pero lo he mirado en la consola de Firefox y también se muestra este error, es un error de acceso a un objeto.

He probado a incluir tu código en la página donde cargo el iframe pero no sirve de nada, por eso creo que no se trata del mismo error.

¿Alguna idea?

Gracias de antemano.

# February 4, 2009 5:32 PM

Juan ha opinado:

Hola, muchisimas gracias!! me salvastes de un error que me traia mal y era dificil encontrar una solucion en la web!!!

nuevamente gracias!!

# August 19, 2009 9:23 PM
Deja tu comentario

(requerido) 

(requerido) 

(opcional)

(requerido)