【问题标题】:Why is $.post() subject to same-origin policy, but submitting a form with method='POST' okay?为什么 $.post() 受同源策略约束,但提交带有 method='POST' 的表单好吗?
【发布时间】:2012-02-20 10:55:24
【问题描述】:

我正在开发一种基于网络的工具,以简化我们在办公室的工作。我们的合作伙伴提供给我们的工具有一个通用登录,我们整个楼层都在使用,但它每 30 分钟就会超时,整天都必须重新登录很烦人。

我过去所做的是在我的工具中创建一个隐藏的 iframe,通过在页面加载时提交一个隐藏的表单来登录它,并继续每 30 分钟提交一次表单以防止超时。然后,他们可以直接从我的工具(通过另一个可见的表单)向合作伙伴工具提交搜索。

我想使用 jQuery $.post() 来摆脱隐藏的 iframe,并使其提交登录信息的唯一时间是搜索完成时。这样它就不会在不使用时不断发送请求,但您仍然可以运行搜索,而不必担心登录超时。

似乎 ajax 同源策略正在阻止这种情况,所以目前我只是让它打开一个新的命名窗口,然后在目标窗口中一个接一个地提交两个隐藏的表单。

这样的问题是,如果登录请求没有完成,搜索请求没有通过,它们会再次被带到登录页面。如果他们关闭窗口并再次搜索它会起作用,但这也很烦人,只是没有原来的情况那么多。

所以除了您实际上必须看到页面打开(除非它在隐藏的 iframe 中)这一事实之外,通过$.post() 提交参数和使用 POST 方法提交表单之间有什么区别?它们在萤火虫中看起来相同。有什么办法可以在表单提交时设置回调,以便等待第一个请求完成后再开始第二个请求?

【问题讨论】:

    标签: jquery forms post same-origin-policy


    【解决方案1】:

    $.post 使用 xmlhttprequest 发送数据。 Xhr 受同源策略限制。不是直接发送 HTTP POST 请求。

    【讨论】:

    • 我猜不出为什么这被否决了。对我来说似乎是正确的。 +1
    • 已删除反对票。我认为用户要求解释为什么只有 XHR 有限制 - 如果主题是一个与正文不同的完整问题并且人们只仔细阅读主题,那就是问题:p
    • 是在不实际打开页面的情况下直接发送 HTTP POST 请求的方法吗?
    • 那种?您可以让您的 iframe 执行此操作(提交隐藏表单),但随后它将重定向到远程服务器上的下一页。由于它是一个不同的域,您将无法再控制 iframe。你总是可以删除它并阅读它我猜当你确定他们已经完成登录时。
    • 但没有 iframe 就无法做到这一点?
    【解决方案2】:

    向另一个域执行 POST 请求时,您将无法使用 JavaScript 访问响应(即使您将表单提交到 iframe)。

    但是,当使用 XHR 时,您可以完全访问响应,因此您可能会做很多坏事 - 例如。访问用户登录的页面,窥探他的公司内部网等。

    所以 XHR 的限制不是为了避免 CSRF,而是为了避免泄露特权信息。

    【讨论】:

    • 你能备份一下吗?如果我在原始 http 客户端(如 curl)中发送发布请求,我可以访问响应,但我还没有看到您描述的机会。与可以访问更多资源的 http 库相比,javascript 将如何具有优势?如果我只是使用没有强制执行同源策略的浏览器,该策略是在客户端级别而不是服务器级别强加的呢?
    • 使用 HTTP 客户端时, 发起请求并控制您发送的数据(例如登录 cookie)。但是您通常无法控制网站使用的 JavaScript。例如,在 Stack Overflow 上,一个简单的 GET 请求就足以让我查看仅对版主可用的特权信息。现在另一个网站可以(如果没有通过 x-frame-policy 标头禁止)使用指向包含此类信息的 URL 的 iframe - 但由于相同的来源策略,它无法访问此数据页面。
    • 是的,但这就是为什么同源政策是好的和到位的。您指出,通过 ajax 的表单发布更容易受到攻击,因为 js 访问响应使服务器面临的风险比任何 xhr 攻击都大。我认为您的意思是同源策略(通常而不是特定于 OP 问题)可以像保护用户一样保护服务器。一个有效的观点,但您的回答表明它是特定于形成帖子的,这可能会误导读者认为除了同源政策之外还有其他一些机制。
    【解决方案3】:

    ajax 同源策略是停止通过网络将您的信息发送到他们的个人服务器,而您却不知道它正在发生。不建议将页面发布到其他服务器,并且可能会失败。

    你能解决吗?您可以将表单提交替换为 jq 以等待登录状态完成,然后提交表单,但是,我不确定这是一个好主意 - 旋转循环通常表示设计错误。

    您对代码有多少控制权?您可以让提交进行登录,然后返回发送搜索吗?还是让搜索不需要登录?

    【讨论】:

    • 现在它确实提交了登录,然后是搜索,但是在搜索之前无法判断登录请求是否已经完成。
    • "不建议将页面发帖到其他服务器,可能会失败。"
    猜你喜欢
    • 2023-03-12
    • 2021-02-22
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2019-12-08
    • 2017-01-07
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多