【问题标题】:AJAX post error : Refused to set unsafe header "Connection"AJAX 发布错误:拒绝设置不安全的标头“连接”
【发布时间】:2011-11-04 20:19:54
【问题描述】:

我有以下自定义 ajax 函数将数据发送回 PHP 文件。每次发布数据时,我都会收到以下两个错误:

拒绝设置不安全的标头“Content-length”
拒绝设置不安全的标头“Connection”

代码:

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);
 }

我做错了什么?

【问题讨论】:

标签: javascript ajax


【解决方案1】:

删除这两行:

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

XMLHttpRequest 不允许设置这些标头,它们是由浏览器自动设置的。原因是通过操纵这些标头,您可能能够欺骗服务器通过同一连接接受第二个请求,该连接不会通过通常的安全检查 - 这将是浏览器中的一个安全漏洞。

【讨论】:

  • Connection: close 会导致什么“漏洞”?如果您知道一个请求会花费很长时间,那么应该可以请求它不占用持久连接。浏览器也不支持请求流水线,因此如果长时间运行的请求在正常请求之前出现,那么它将阻塞第二个请求以保持完整的保活时间。如果长时间运行的请求可以使用“连接:关闭”,则可以请求它不占用持久连接并导致(例如)不必要的 5 秒延迟(其中 5 秒是保持活动时间)。
  • @doug65536:浏览器不验证标头值,它们只是不允许设置您不应该乱用的标头。
  • 嗨,Wladimir,如果删除了这 2 行,我如何传递我的参数?
  • @anunixercoder:你不知道。这两个标头由浏览器自动设置,不能更改。
  • 回复:“应该可以要求它不占用持久连接。” -- 那不是 |Connection: close|是的。
【解决方案2】:

W3C XMLHttpRequest Level 1 规范的第 4.6.2 节列出了“由用户代理控制”并且不允许使用 setRequestHeader() 方法设置的标头。 Connection 和 Content-length 都在该列表中。

Accept-Charset
Accept-Encoding
Access-Control-Request-Headers
Access-Control-Request-Method
Connection
Content-Length
Cookie
Cookie2
Date
DNT
Expect
Host
Keep-Alive
Origin
Referer
TE
Trailer
Transfer-Encoding
Upgrade
User-Agent
Via

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2011-11-03
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多