AJAX - DUDA EJERCICIO AJAX (SEGURIDAD)

 
Vista:

DUDA EJERCICIO AJAX (SEGURIDAD)

Publicado por Juan (2 intervenciones) el 06/07/2009 17:49:41
Hola, necesito solucionar un problemilla.

El siguiente ejercicio no me funciona (no se por qué) y tengo que entregarlo en un plazo bastante breve de tiempo. SI alguien pudiera solucionarlo y enviarmelo al correo se lo agradecería. Un saludo

Motivación
--------------
En este ejemplo vamos a poner de manifiesto el funcionamiento de los dos navegadores más difundidos (Internet Explorer y mozilla) respecto a la aplicación de la política de seguridad server-of-origin.

Desarrollo paso a paso de la aplicación
-------------------------------------------------------
Creación del HTML
Pruebas con Internet Explorer
Pruebas con Mozilla Firefox

1 - Creación de HTML

El HTML simplemente constará de un pequeño formulario para escribir la cadena de búsqueda y un función JS para lanzar una petición al servidor de yahoo.
Utilizaremos la librería comunicaciones.js desarrollada para ejemplos anteriores:

--------------------------- comunicacion.js---------------------------------------------

var comunicacion = new Object();
comunicacion.READY_STATE_UNINITIALIZED=0;
comunicacion.READY_STATE_LOADING=1;
comunicacion.READY_STATE_LOADED=2;
comunicacion.READY_STATE_INTERACTIVE=3;
comunicacion.READY_STATE_COMPLETE=4;

comunicacion.PeticionAsincrona = function(onload,onerror)
{
this.req = null;
this.onload = onload;
// si esta definida una función de control de error la asocio en caso coloco una por defecto
this.onerror = (onerror) ? onerror : this.defaultError;
}

comunicacion.PeticionAsincrona.prototype={

realizarPeticion:function(url){
// creamos el objeto XMLHttpRequest correspondiente en funcion del navegador utilizado
if (window.XMLHttpRequest)
{
this.req=new XMLHttpRequest();
}else if (window.ActiveXObject)
{
this.req=new ActiveXObject("Microsoft.XMLHTTP");
}if (this.req)
{
try
{
var loader=this;
this.req.onreadystatechange=function()
{
// cualquiera de las dos formas siguientes es valida para proporcionar a la
// función el contexto adecuado
//loader.respuestaRecibida();
loader.respuestaRecibida.call(loader);
}this.req.open("GET",url,true);
this.req.send(null);
}catch (err)
{
this.onerror.call(this);
}
}
},

respuestaRecibida:function(){
var req = this.req;
var ready = req.readyState;
if (ready==comunicacion.READY_STATE_COMPLETE)
{
var httpStatus = req.status;
if (httpStatus==200 || httpStatus==0)
{
this.onload.call(this);
}else
{
this.onerror.call(this);
}
}
},

defaultError:function(){
alert("error al recibir los datos de la petición!"
+" readyState:"+this.req.readyState
+" status: "+this.req.status
+" headers: "+this.req.getAllResponseHeaders());
}
}

---------------------------fin comunicacion.js---------------------------------------------

El código html es el siguiente:

<html>
<head>
<title>Ejemplo Seguridad</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Pragma" content="no-cache" />
<script type="text/javascript" src="comunicacion.js"></script>
<script type="text/javascript">
<!-- function PeticionYahoo()
{
var yahooID = "YahooDemo";
var urlYahoo = 'http://search.yahooapis.com/WebSearchService/V1/webSearch?appid='+yahooID+'&query='+document.Form1.user.value+'&results=10'
new comunicacion.PeticionAsincrona(urlYahoo,onXMLLoad);
}
function onXMLLoad()
{
alert(this.req.responseText);
}
-->
</script>
</head>
<body>
<form name="Form1" onsubmit="PeticionYahoo();return false;" id="Form1">
Busqueda: <input name="user" type="text""/>
<input type="submit" name="btnSearch" value="Search"/>
<span id="espera"></span>
<span id="spanSave"></span>
<br/><br/>
</form>
</body>
</html>

2 – Pruebas con Internet Explorer
Internet explorer aplica una política de seguridad diferente en función del origen de la pagina.
- Si el origen es el disco local la pagina se considera con derechos para realizar peticiones a cualquier servidor.
- Si la pagina nos llega desde un servidor se aplicará server-of-origin y IE preguntará al usuario si permite a la pagina que efectué o no la comunicación.
Para comprobar esto haremos dos pruebas, la primera sencillamente abriendo la pagina HTML desde nuestro duro y la segunda colocándola en un servidor web.
En el primer caso todo debería funcionar correctamente y veremos un “alert” con el xml que devuelve yahoo. En el segundo caso IE debería lanzarnos una pregunta como esta:

"Esta página está intentado el acceso a informacion..."

3 – Pruebas con Mozilla FireFox
Mozilla Firefox se comporta de un modo más restrictivo que Internet Explorer:
-
Si la pagina se carga desde local lanzará una pregunta al usuario para que este permita el acceso a la pagina. Aunque para lograr este efecto debemos efectuar un par de llamadas JavaScript al sistema de seguridad de Mozilla.
-
Si la pagina nos llega desde un servidor la única posibilidad para evitar el server-of-origin y firmar la pagina completa mediante un certificado y servirla en un formato especifico de mozilla. Más información acerca de cómo firmar en script con mozilla:
http://www.mozilla.org/projects/security/components/jssec.html#signedscript
Para el primer caso necesitamos incluir la siguiente línea antes de realizar la petición y cuando recibimos la respuesta:
if (netscape.security.PrivilegeManager.enablePrivilege)
netscape.security.PrivilegeManager.enablePrivilege
('UniversalBrowserRead');

Con esto conseguimos que Mozilla nos de permiso para realizar peticiones a otros servidores distintos del de origen. Esto será necesario incluirlo también dentro del script que firmemos para el caso de la segunda opción.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:DUDA EJERCICIO AJAX (SEGURIDAD)

Publicado por Juan (2 intervenciones) el 06/07/2009 17:51:31
Mi correo electrónico es el siguiente [email protected].

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar