看来我完全不了解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网址。但是,这与我在前一期文章中读到的一些答案相矛盾这个答案与我得到的结果相符
但同样的答案也说
那么判决是什么?我的目标是保护Ajax网址,以免外部站点(如API)使用它们将数据转储到我的数据库中。
最佳答案
简短的答案:您并非,可以安全解决您提到的问题。
长答案:
鉴于:
这意味着您无法分辨出Charlie访问A和Charlie手动构造一个HTTP请求来访问为JavaScript提供的URL的区别。
如果Charlie访问站点B,则站点B无法通过Charlie的浏览器(具有Charlie的凭据)从站点A读取数据。
不过,网站B可能会导致查理的浏览器向网站A发出请求(例如,通过使用JS向不可见的iframe提交不可见的表单),因此网站B可能会导致插入数据。这是Cross Site Request Forgery,但是有很多方法可以使用defend against this。