如何使用JavaScript中的XMLHttpRequest设置Cookie(头部)?

30

我正在尝试使用XMLHttpRequest在XSS请求中设置Cookie。

我发现XMLHttpRequest规范,其中4.6.2-5部分似乎暗示不允许设置Cookie、Cookie2和一些其他标头,但我希望有一种解决方法。

下面是我的(jQuery)代码,但由于Cookie没有被设置,所以查询失败了。

$.ajax( {
  type : "POST",
  url : URL,
  data: SOAP_INBOX_MAIL_QUERY,
  dataType : "xml",
  async: false,
  beforeSend : function(xhr) {  
    var cookie = credentials["COOKIE"];
    console.info( "adding cookie: "+ cookie );          
    xhr.setRequestHeader('Cookie', cookie);
  },
  success : function(data, textStatus, xmLHttpRequest){


  },
  error : function(xhr, ajaxOptions, thrownError) {
    credentials = null;
  }
});

2
https://fetch.spec.whatwg.org/#forbidden-header-name - Knu
5个回答

41

这是可以完成的。您需要在 $.ajax 调用中添加以下内容:

xhrFields: {
    withCredentials: true
}

(参见jQuery文档),并且您还需要请求的网站支持CORS(它们至少需要允许您的来源,并将Access-Control-Allow-Credentials HTTP标头设置为true)。

毫无疑问,这样做是可行的。您可以通过HTTPS进行设置,使用基本身份验证等。如果您告诉jQuery(xhrFields),并且该站点提供了正确的CORS标头,则jQuery将发送所有内容(身份验证标头、cookie)。不要放弃!


1
设置 "withCredentials" 后,将我的域名下的所有cookie添加到xhr请求中。感谢提示! - guido
1
请注意,服务器不能说“Access-Control-Allow-Origin:*”。Chrome(以及其他浏览器)将简单地取消GET请求。 - Jonno
1
下投票,因为你对错误的问题有正确的答案,请注意 OP 似乎想在请求中使用 JavaScript 设置 cookie,可能是在浏览器中。我正在尝试使用 XMLHttpRequest 在 XSS 请求中设置 Cookie。 - Christoffer Soop
1
我该如何使用原生JS实现这个? - philx_x

15

出于安全原因,在XMLHTTPRequest期间,您将无法修改标头。


1
不幸的是,根据我的阅读,这似乎的确是情况。 谢谢确认。 - barryred
1
这应该是被接受的答案,因为OP正在询问如何使用JavaScript在_request上设置cookie,而不是让服务器在_response上设置cookie。 - Christoffer Soop

4
如果您使用document.cookie设置cookie,则在发送请求时,cookie标头将包含它。

我完成了一系列有关cookies的教程,其中一个是关于如何使用JavaScript和cookies。请从http://dbp-consulting.com/tutorials/web/cookieintro.html开始了解cookies的基本知识,然后可以通过链接访问有关如何从浏览器使用JavaScript和从服务器使用PHP访问cookies的页面。 - phorgan1
值得注意的是,一些平台/环境似乎不会将document.cookie与XmlHttpRequests(XHR)共享。因此,如果您需要在文档和XHR之间共享cookie,例如通过会话cookie实现会话状态持久性,这将导致问题。发现Safari浏览器扩展和Mac OS X小部件似乎也存在此问题。对于Chrome扩展、Windows Vista/7小工具等,情况正常。不知道为什么苹果公司要如此限制。可悲的是,没有人能够解决我的问题或回答为什么会这样以及如何解决它的问题。 - David
补充我的先前评论,(PHPSESSID)会话cookie在document.cookie中设置(和/或初始XHR请求以获取某些数据)。随后的XHR用于提交数据应传递该会话cookie。在Chrome和Windows小工具中,这自动正常工作(无需进行手动cookie处理)。但在Safari和Mac OS X小部件中不起作用。我尝试使用document.cookie手动设置cookie请求头,但没有成功(尽管我没有检查document.cookie是否具有所需的cookie,这将是与Apple的单独问题)。 - David

1

0
如果您的请求与jQuery代码在同一域中,您可以使用jQuery cookies插件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接