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.
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


0