【问题标题】:Same-origin Policy Specification同源策略规范
【发布时间】:2013-11-04 20:45:44
【问题描述】:

我对在我的服务器上运行的代码隐藏函数进行了 javascript AJAX 调用,该函数返回到客户端脚本(已启动调用)、带有查询(@987654321)的 url(来自与我不同的域) @?)。返回调用后,将执行以下 JQuery 代码('specific_div' 是页面中的现有 div):

$('#specific_div').load(returned_url);

同时,我收到以下错误消息:

XMLHttpRequest cannot load http://www.web_server_url.com/my_query&callback=?. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

虽然我了解同源策略,但我不太明白为什么在这种情况下我会收到此错误消息,因为 url 是从我的服务器传递的。考虑到它的来源来自同一个域(在本例中为本地主机),浏览器不应该接受它吗,尽管它正在联系另一个域?

【问题讨论】:

  • Shouldn’t it be accepted by the browser, considering that its origin is from the same Domain (local host in this case), although it is contacting another Domain? 不可以。您不能向其他域发送请求。
  • CORS 呢?
  • 请考虑一下 AJAX 请求是代表客户端发出的。他们将传递任何浏览器 cookie。我可以很容易地制作一个网页,一旦被查看,它就会从您的浏览器向每个已知的银行或金融机构发出 AJAX 请求,请求将资金转移到不正当的帐户或其他东西。如果您当前登录到这些网站中的任何一个,那么您的浏览器将传递 cookie,并且请求将被验证。
  • 因此,仅仅因为您从网站读取了 HTTP 响应并不意味着您相信它会代表您进行通信!
  • 加载数据服务器端并将其提供给您的客户端。

标签: c# javascript jquery


【解决方案1】:

同源意味着请求的资源/信息必须与页面位于同一域(架构 + 主机 + 端口)上。这并不意味着“源服务器提供的资源的 URL”。

在您的特定情况下,您在"http://localhost" 上有页面并尝试请求"http://www.web_server_url.com" - 方案(“http”)和端口(80)匹配,但域名不匹配(“localhost”与“www.web_server_url” .com”)。

请注意,您看到的错误说明您需要在目标服务器上为此特定请求启用 CORS

如果您不拥有/控制目标服务器(因此不能使用 CORS 或 JSONP 与其他服务器客户端安全通信),那么最通用的选项是代理服务器上的请求。请注意,您可以使用哪些信息受到限制(即,您不能以这种方式窃取目标域上设置的 cookie)。

【讨论】:

  • 谢谢阿列克谢。据我了解,并非所有浏览器都支持 CORS,因此,我试图避免使用该技术。我不明白的是我在页面中有一个脚本标签,它与相同的 url 联系(但最后有不同的查询),并且在最初加载页面时工作正常。不应该将更新后的 url 视为与初始页面相同的来源(因为 url 是由我的服务器发送的)?我错过了什么吗?
  • @JF001 您正在描述称为cross site request forgery 的常见安全漏洞。不同之处在于 AJAX 请求可以是 PUT、POST 等,而像
  • 再次感谢特雷弗。如果不使用 CORS,如何实现我想要做的事情?当然,某些网站必须以安全的方式执行我正在尝试实施的操作。
  • @JF0001 - 我在答案中添加了标准的“代理请求服务器端”解决方法。
  • 再次感谢阿列克谢。正如上面评论中所指出的,这是我最初尝试实现的,但数据以以下格式返回:document.write('
猜你喜欢
  • 2016-11-13
  • 2011-11-08
  • 2013-06-27
  • 2011-01-17
  • 2012-10-30
  • 2011-12-26
  • 2013-11-09
  • 2013-09-08
  • 2014-05-29
相关资源
最近更新 更多