这种ajax行为是正常的,安全性

时间:2011-02-08 06:05:04

标签: php javascript ajax security cross-domain

我似乎完全没有理解ajax的安全性,而且我不断帮助我不断回答我的问题。所以我做了这个实验。

我在site1.com上有这个位于http://site1.com/script.js的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,有人欺骗一个,他们是   同样也是不可能的   区别(尽管你可以   肯定会让它变得更难。)

那么判决是什么?我的目标是保护ajax网址,以便外部网站(如API)不会将数据转储到我的数据库中。

2 个答案:

答案 0 :(得分:3)

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

答案很长:

假设:

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

你的JavaScript制作一个XHR,有人欺骗一个,它们是相同的,不可能区分(尽管你肯定会让它变得更难)。

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

  

那么判决是什么?我的目标是保护ajax网址,以便外部网站(如API)不会将数据转储到我的数据库中。

如果Charlie访问网站B,那么网站B无法通过Charlie的浏览器(使用Charlie的凭据)读取来自网站A的数据。

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

答案 1 :(得分:1)

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

跨域政策说的是这样的:

你的domainA服务于一个能够进行ajax调用的pageA 这个“pageA”的ajax只能从domainA请求资源,可能永远不会从domainB请求资源。

用你的话说,

如果site1.com提供了script.js,则script.js只能通过site1.com进行通信并加载内容,而不能通过othersite.com进行通信。

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

这适用于所有人,因为你不能在谷歌上调用ajax而google不能正式调用你的域名。 [有解决方法,但现在不是重点]

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

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

  

我的目标是保护ajax网址,以便外部网站(如API)不会将数据转储到我的数据库中。

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

编辑 - 我发现有一些方法可以保护,比如防止CSRF ... [我认为只有一种可能性]感谢@David Dorward指出它。我的+1