我似乎完全没有理解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)不会将数据转储到我的数据库中。
答案 0 :(得分:3)
简短回答:您不安全反对您提及的问题。
答案很长:
假设:
你的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