¿Cómo llevar a cabo una solicitud de dominio cruzado en un control de navegador web?
-
03-07-2019 - |
Pregunta
Como sabe, las solicitudes XMLHTTP entre dominios no están permitidas por razones de seguridad en Internet Explorer.
Tengo un control WebBrowser y estoy usando DocumentText
en lugar de Navigate
a una URL. Dado que el dominio actual es about: blank
cuando la página intenta hacerse una solicitud a sí mismo u otro dominio, obtengo Acceso denegado
Error de Javascript.
Incluso cuando uso Navigate
si el Javascript hace una solicitud a otro dominio, no funciona.
¿Cómo puedo evitar esto?
Este código HTML debería funcionar con el Control WebBrowser:
<body>
<a href="javascript:getit('http://www.google.com')">this should work</a>
<div id="x"></div>
</body>
<script>
function XHConn()
{
var xmlhttp, bComplete = false;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false; }}}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone)
{
if (!xmlhttp) return false;
bComplete = false;
sMethod = sMethod.toUpperCase();
try {
if (sMethod == "GET")
{
xmlhttp.open(sMethod, sURL+"?"+sVars, true);
sVars = "";
}
else
{
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete)
{
bComplete = true;
fnDone(xmlhttp);
}};
xmlhttp.send(sVars);
}
catch(z) { return false; }
return true;
};
return this;
}
function getit(url){
var xmlhttp = new XHConn();
var fnWhenDone = function (oXML) { document.getElementById('x').innerHTML = oXML.responseText; alert(oXML.responseText); };
xmlhttp.connect(url, "GET", "", fnWhenDone);
}
</script>
- No tengo control sobre el código Javascript / HTML, mi aplicación solo aloja un Control de navegador web
- Encontré algo llamado CROSS_DOMAIN_DATA URL Action Banderas , no estoy seguro si es la dirección correcta. Incluso es que no estoy seguro de cómo implementarlo.
- También si puede responder a esta pregunta: ¿Cómo configurar el documento.domain actual en el Control WebBrowser para evitar" Acceso denegado "? también es suficiente para mí.
Solución
Encontré una solución sucia, cargué un HTML local (c: \ temp \ temp.html) y luego modifiqué el contenido a través de javascript.
Después de este punto, no hay más restricciones de CrossDomain, sin embargo, el uso de document.write causa otros problemas desagradables como las funciones JQuery .ready
no funcionarán.
Otros consejos
Comprueba esto, funcionó para mí como un amuleto. http://support.microsoft.com/default.aspx? scid = kb; en-us; 246227
No entiendo en qué dominio no tienes acceso a Javascript ... ¿Ha intentado usar la etiqueta script para obtener los datos que desea de un dominio diferente? Puede utilizar el idioma JSONP para nombrar los datos ...
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "anotherdomain.com/data?callback=myFunction";
head.appendChild(script);
Y luego en " / data " ;:
myFunction({
// data here
});
URLACTION-CROSS-DOMAIN-DATA parece ser la dirección correcta: Lea esto para descubrir por qué
La única forma de hacer esto es asegurarse de que su código se ejecute en la zona de confianza (o en un lugar como HTA). De forma predeterminada, cualquier cosa que se ejecute dentro del control WebBrowser se ejecuta en la zona de la que proceden los archivos que se sirven. (es decir, se están utilizando las políticas de seguridad estándar de IE).
Para cambiar este comportamiento, deberá cambiar la aplicación que aloja el control WebBrowser e implementar algunas interfaces en ese control WebBrowser. (Debería echar un vistazo a IInternetHostSecurityManager, IInternetZoneManager y IInternetSecurityMgrSite). Esta no es una tarea trivial y la documentación sobre esto es, en el mejor de los casos, escasa.
Una vez hecho esto, tu código puede ejecutarse con cualquier privilegio que necesites, y las solicitudes entre dominios son tan fáciles como restablecer las puntuaciones altas de Mime-Sweeper.
Espero que esto ayude.