当前位置: 首页 > 面试题库 >

为什么设置document.domain不能允许AJAX请求到父域?

仲孙鸿飞
2023-03-14
问题内容

我有两个文件domain.com/test2.php

<div id="testDiv"></div>

<script src="http://domain.com/packages/jquery.js"></script>
<script>$("#testDiv").load("http://domain.com/test3.php", {var1:1, var2:2});</script>

和domain.com/test3.php:

<b>var1: <?php echo $var1; ?> , var2: <?php echo $var2; ?></b>

在这种情况下,domain.com/test2.php的输出 var1: 1 , var2: 2
与您期望的一样,但是现在让我们说我想在一个子域中创建一个test2.php。为了阻止跨域脚本编写问题,我将在sub.domain.com/test2.php的开头添加以下额外的行:

<script>document.domain = "domain.com";</script>

此额外的行阻止了跨域错误的显示,但是现在该文件不再输出 var1: 1 , var2: 2 。为什么会这样,我该如何解决?


问题答案:

document.domain机制旨在允许帧之间进行客户端通信,而不是客户端到服务器的通信。如果从包含页面的一帧example.com,并从包含页面另一个框架foo.example.com则二者不能互相访问对方的DOM,除非后者套document.domainexample.com你在你的例子显示。

跨域AJAX请求的现代首选机制是“ 跨域资源共享 ”或“
CORS”。此机制涉及使目标资源返回一个特殊的HTTP响应标头,该标头指示允许跨域请求。在您的方案中,您将test3.php返回以下HTTP响应标头:

Access-Control-Allow-Origin: sub.domain.com

在PHP中,您可以按照以下步骤进行操作:

header("Access-Control-Allow-Origin: sub.domain.com");

您也可以将此标头值设置为仅仅*是为了允许来自 任何 来源的跨域请求,但请注意,这将允许来自不受您控制的网站的请求。

来自客户端JavaScript库的请求通常还包含X-Requested- With不在CORS允许的标准集中的其他标头,因此可能有必要通过附加的响应标头显式允许此标头:

Access-Control-Allow-Headers: X-Requested-With

仅现代浏览器支持CORS。对于较旧的浏览器,通常的约定是使用JSON-P,这是一种技巧,它利用了一个服务器上的页面能够从另一台服务器加载并执行脚本文件这一事实。此技术要求目标资源是一个有效的JavaScript程序,该程序在页面中调用一个函数,因此它不像CORS那样优雅和无缝,但它应在任何支持JavaScript的浏览器中都可以工作。



 类似资料:
  • 问题内容: 在我的项目中,我需要允许其他人向我的脚本发送ajax请求。因此,外部请求可能来自其他网站和域,也可能来自浏览器扩展。 我在脚本顶部仅添加了以下两行,以使它们能够做到: 现在我的问题是:这里是否遗漏了任何安全方面的考虑?这个简单的解决方案会带来严重的问题吗? 如果是这样,什么是更好的解决方案? 感谢您的回复。 问题答案: 如上所述,任何人都可以随时向您的页面发送请求:因此,您需要考虑的主

  • 在我的项目中,我需要允许其他人向我的脚本发送ajax请求。因此,外部请求可能来自其他网站和域,也可能来自浏览器扩展<我只是在我的脚本顶部添加了这两行,让他们完成这项任务: 现在我的问题是:这里有我错过的任何安全考虑吗?这个简单的解决方案会产生严重的问题吗? 如果是,更好的解决方案是什么? 感谢您的回复。

  • 问题内容: 除了JSONP,为什么要遵循相同的域策略? 问题答案: 出于安全原因,已实施“同源起源策略”;引用维基百科的相关句子: 这种机制对现代Web应用程序具有特殊的意义,因为Web服务器广泛依赖于HTTP cookie来维护经过身份验证的用户会话,因为服务器基于HTTP cookie信息进行操作以揭示敏感信息或执行状态更改操作。 必须在客户端维护不相关站点提供的内容之间的严格分隔,以防止丢失

  • 我试图从我的新Angular应用程序中调用REST web服务。当发出请求时,我会得到以下错误: XMLHttpRequest无法加载http://localhost:8080/WebService。请求的资源上没有“访问-控制-允许-来源”标头。因此,不允许访问源“http://localhost”。 我发现这是因为浏览器不允许这样的操作。 编辑我也试着把它添加到我的angular应用程序中:

  • 问题内容: 在我的应用程序中,我在一个子域(dev.u413.com)上有一个网站,并且我使用jQuery向另一个子域(api.u413.com)的JSON api提出了ajax请求。当我在Chrome开发工具和Firefox Firebug中检查请求时,似乎阻止了我的请求。我设置为当前域的后缀:。 这是我的要求: 如果我将ajax请求修改为在同一域中,则请求成功。 为什么会这样?浏览器不应该抱怨

  • 我正在使用ajax进行表单更新。当我在ajax中使用GET方法时,它工作得很好,但当我使用Post方法时,它抛出了错误405 method,这是不允许的。我正在本地主机上测试这个。我以前在localhost中做过,效果很好。顺便说一句,我用的是Laravel5.2。 这是我的ajax代码。 这是我在视图中使用的脚本 这是我的路线 当ajax函数和路由中的方法更改为GET时,它会打印在控制台中传递的