【问题标题】:Is this ajax behavior normal, security-wise这种 ajax 行为是否正常,安全方面
【发布时间】:2011-06-23 05:45:23
【问题描述】:

似乎我完全不了解 ajax 安全性,而且我不断得到自相矛盾的问题的答案也无济于事。所以我做了这个实验。

我在位于http://site1.com/script.js 的 site1.com 上有这个 js 代码。在服务器端,它进入数据库但不返回任何输出。当我从 site1.com 调用此函数时,我看到该条目已按预期记录在数据库中。

function enterdb(){
  $.ajax({
    async: false,
    url: 'http://site1.com/test?format=json',
    type: 'POST',
    data: { input: '1' },
    success: function(resp) {
       alert(resp);
    }
  });
}

我将相同的 js 复制到 othersite.com 的 js 文件中,现在位于 http://othersite.com/script.js,以亲自查看它是否会登录到数据库。这不是很好,因为我不希望人们从其他外部脚本播放我的 ajax url。但这与我在之前的问题中读到的一些答案相矛盾

这个答案与我得到的结果相符

始终禁止跨域,因为 同源政策。

但同样的答案也说了

您的 JavaScript 制作了 XHR 并且有人欺骗了 XHR,他们是 相同且不可能 区分(虽然你可以 绝对让它更难)。

那么判决结果是什么?我的目标是保护 ajax url,这样它们就不会被 API 等外部网站用来将数据转储到我的数据库中。

【问题讨论】:

  • Ajax 请求是常规请求。 ajax 和非 ajax 没有区别。
  • @zmol: 再说一遍 - 没有 ajax 特定的东西需要保护,因为 ajax 请求与非 ajax 完全一样。
  • @zmol:是的,它只是客户端功能。攻击者可以对任何带有任何标头的 url 执行请求,并且您无法检测到它是有效的还是伪造的 - 这很容易做到。
  • 尝试打开您的浏览器并导航到site1.com/test?format=json,这将与您发出ajax请求时完全相同,除了使用ajax,您正在执行它是异步的,因此A(Async Javascript和 Xml)。尽管它迅速成为 AJAJ(异步 Javascript 和 Json):)
  • @David Conde 您正在回答一个没有被问到的问题。这不是我的问题。我说的是克服跨站点策略。你知道那是什么吗?因为当您告诉我转到浏览器中的网址时,您肯定不是在谈论它。

标签: php javascript ajax security cross-domain


【解决方案1】:

@zmol : 很高兴知道你根据我的要求进行了实验 :) (How to check if cross-domain requests are disabled)

跨域策略是这样说的:

您的 domainA 为 pageA 提供服务,该 pageA 能够进行 ajax 调用。
这个“pageA”的 ajax 只能从 domainA 请求资源,可能永远不会从 domainB 请求资源。

用你的话说,

如果 site1.com 服务于 script.js,则 script.js 只能通过 site1.com 而不能通过 othersite.com 通信和加载内容。

另一方面,如果 script.js 是从 othersite.com 提供的,那么它将无法调用 site1.com 上的任何内容,因为服务器会因为此策略而拒绝请求。

这适用于每个人,因为您无法在 google 上调用 ajax,而 google 也无法正式调用您的域。 [有解决方法,但现在不是重点]

现在还有什么困惑吗? :)

编辑 - 我忘了回答你的问题:

我的目标是保护 ajax url,这样它们就不会被 API 等外部网站用来将数据转储到我的数据库中。

正如其他人已经说过的那样,您无法“保护”ajax url,ajax 调用是对服务器的正常请求,但它们应用了 Origin 标头..
Origin 标头建议服务器是否信任调用者:)

编辑-我看到有一些方法可以确保安全,例如防止 CSRF ... [我认为这只有一种可能性] 感谢@David Dorward 指出。我的 +1

【讨论】:

    【解决方案2】:

    简短回答:安全反对您提到的问题。

    长答案:

    给定:

    • A — 您控制的网站
    • B — 其他人控制的网站
    • Charlie — 拥有凭据的您网站的访问者

    你的 JavaScript 制作了 XHR 和有人欺骗了 XHR,它们是相同的,无法区分(尽管你肯定可以让它变得更难)。

    这意味着您无法区分 Charlie 访问 A 和 Charlie 手动构造 HTTP 请求以访问您提供的供 JavaScript 访问的 URL。

    那么判决结果是什么?我的目标是保护 ajax url,这样它们就不会被 API 等外部网站用来将数据转储到我的数据库中。

    如果 Charlie 访问站点 B,则站点 B 无法通过 Charlie 的浏览器(使用 Charlie 的凭据)读取站点 A 的数据。

    站点 B 可能会导致 Charlie 的浏览器向站点 A 发出请求(例如,通过使用 JS 将不可见的表单提交到不可见的 iframe),因此站点 B 可能会导致插入数据。这是Cross Site Request Forgery,但有办法defend against this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2014-08-07
      • 2013-12-01
      • 2012-10-25
      相关资源
      最近更新 更多