使用NodeJS / Express应用程序保护AJAX调用

时间:2015-06-24 17:27:46

标签: javascript jquery ajax node.js express

有人能指出我在ExpressJS应用程序中如何处理AJAX调用的正确方向吗?

我有一个Jade模板,它引用一个外部JavaScript文件来处理向我服务器上的端点发送请求。现在,可以在没有任何身份验证的情况下访问相同的端点(显然)。

  // Sample AJAX call in my client-side JavaScript file (which dynamically updates a chart)
  $.ajax({
  url: 'https://example.com/jsonp?callback=?',
  jsonpCallback: 'callback',
  dataType: 'jsonp',
  data: {
    startDate: formatDate(fromDate, ''),
    endDate: formatDate(toDate, '')
  },
  success: function(response){
    //generateChart(processData(response));
  }

我知道Express可以将对象/变量传递给Jade模板,但是Jade模板可以将这些传递给包含的脚本吗?我的预感可能不是......

我可以在Express中对我的/ jsonp端点进行修改,以便它只接受来自mysite.com和localhost的请求吗?在客户端JavaScript中嵌入数据(例如身份验证凭据或API密钥)似乎是一种糟糕的方式。

// Route definition in Express
router.get('/jsonp', function(req, res){
  var obj = {"_id": "234e62ASFsdsds", "name": "An object", "status": "READY"};
  var callbackFunction = (req.query.callback) ? req.query.callback : 'cb';
  res.send(wrapJSONP(callbackFunction, obj)); 
})

或者我咆哮错误的树,需要完全考虑不同的方法?

1 个答案:

答案 0 :(得分:0)

如果您将端点设置为直接JSON(而不是JSONP,这种设计可以轻松绕过公共API的跨域安全性),则Access-Control-*系列标头(CORS headers)是要完全按照自己的意愿去做。浏览器本身将强制执行此操作并阻止来自不匹配域的任何AJAX请求。

具体来说,您需要两个Access-Control-Allow-Origin标头,其中http://yoursite.comhttp://localhost为值。

使用JSONP,你唯一可以做的就是在返回脚本之前查看服务器端的Referer标题 - 但这是不可靠的,也很容易被欺骗。