Error de publicación AJAX: se negó a establecer un encabezado inseguro "Conexión"

101

Tengo la siguiente función ajax personalizada que envía datos a un archivo PHP. Cada vez que ocurre la publicación de datos, obtengo los siguientes dos errores:

Se negó a establecer un encabezado inseguro "Longitud de contenido" Se
negó a establecer un encabezado inseguro "Conexión"

Codigo:

function passposturl(url1, params, obj)
{
    //url1 = url1+"&sid="+Math.random();
    xmlHttp = get_xmlhttp_obj();
    xmlHttp.loadflag = obj;
    xmlHttp.open("POST", url1, true);
    //alert(url1);
    //alert(params);
    //alert(obj);
    //alert(params.length);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.onreadystatechange = function ()
    {
        stateChanged(xmlHttp);
    };
    xmlHttp.send(params);
 }

¿Qué estoy haciendo mal?

francotirador
fuente
Hola Joey. Pasé por eso antes de publicarlo aquí. Todavía no lo entiendo. ¿Todo lo que tengo que hacer es comentar las líneas setRequestHeader?
francotirador

Respuestas:

166

Elimina estas dos líneas:

xmlHttp.setRequestHeader("Content-length", params.length);
xmlHttp.setRequestHeader("Connection", "close");

XMLHttpRequest no tiene permitido configurar estos encabezados, el navegador los configura automáticamente. La razón es que al manipular estos encabezados, es posible que pueda engañar al servidor para que acepte una segunda solicitud a través de la misma conexión, una que no pasaría por las comprobaciones de seguridad habituales; eso sería una vulnerabilidad de seguridad en el navegador.

Wladimir Palant
fuente
5
¿Qué "vulnerabilidad" Connection: closecausa? Si sabe que una solicitud llevará mucho tiempo, debería ser posible solicitar que no interrumpa la conexión persistente. Los navegadores tampoco admiten la canalización de solicitudes, por lo que si una solicitud de ejecución prolongada se produce antes de una solicitud normal, bloqueará la segunda solicitud durante todo el tiempo de actividad. Si la solicitud de ejecución prolongada podría usar "Conexión: cerrar", entonces sería posible solicitar que no interrumpa la conexión persistente y cause (por ejemplo) un retraso innecesario de 5 segundos (donde 5 segundos es el tiempo de mantenimiento).
doug65536
3
@ doug65536: Los navegadores no validan los valores de los encabezados, simplemente no permiten la configuración de encabezados con los que no debería meterse.
Wladimir Palant
Hola Wladimir, ¿Cómo paso mi parámetro si se eliminan esas 2 líneas?
coderInrRain
@anunixercoder: No es así. Estos dos encabezados los configura automáticamente el navegador y no se pueden cambiar.
Wladimir Palant
Re: "debería ser posible solicitar que no interrumpa la conexión persistente". - eso no es lo que | Conexión: cerrar | hace.
EricLaw