Node.js / Express:防止直接从URL加载AJAX HTML片段

时间:2013-03-27 06:22:47

标签: javascript jquery ajax node.js express

我正在使用Node.js,Express和MongoDB构建博客。

在主页上,我有一个按钮可以加载更多帖子。这很好用,我用以下代码完成它:

的jQuery

$("#load-more-posts").click(function() {
    $.ajax({
        url: '/load/posts/',
        type: 'get',
        dataType: 'html',
        success: function(data) {
            $("#primary").append(data);
        },
        data: {"passLastDate": lastDate}
    });

    return false;
});

以下是 app.js

中的路线
app.get("/load/posts", routes.loadPosts);

以下是观点:

loadPosts: function(req, res) {
  var lastDate;
  lastDate = req.query.passLastDate;
  return Post.find({
    "published": true,
    "publish_date": {
      $lt: lastDate
    }
  }).sort('-publish_date').limit(1).execFind(function(err, posts) {
    if (posts === []) {
      console.log("thats it");
      return res.render("thats-it", {
        layout: false
      });
    } else {
      lastDate = posts.slice(-1)[0].publish_date;
      return res.render("more-posts", {
        layout: false,
        posts: posts,
        lastDate: lastDate
      });
    }
  });
}

就像我说的,这一切都很有效。但是,如果我从控制台复制GET url并将其直接粘贴到浏览器中,我会得到一个返回的HTML代码段。我想这应该是应该的,但我不想归还它。我不认为这是一个安全隐患,只是看起来有点不雅。

有没有办法阻止对此视图的直接请求?

奖金

这是另外一些奇怪的事情,并且这是一个由两部分组成的问题。当我在if语句中检查空的post数组时,Node会忽略它。控制台输出显示posts = []但它跳过它然后在lastDate = posts.slice(-1)[0].publish_date;上抛出错误我知道JS表现得很有趣,空值(null,undefined,空字符串等)但是我已经尝试了不同的结果。似乎它完全无视它。我服用疯子吗?

2 个答案:

答案 0 :(得分:4)

  

有没有办法阻止对此视图的直接请求?

您可以通过检查x-requested-with标头(jQuery发送的标头)检查并查看是否使用AJAX调用执行了请求:

loadPosts: function(req, res) {
  if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
    // AJAX request
  }
  else {
    // not an AJAX request
  }
}

这不应该用作安全措施(因为它不是),而只是作为检查请求是否是使用AJAX进行检查的方式。

至于你的其他问题,[] === []实际上是假的(就像[] == []一样),所以这不是查看数组是否为空的好方法。我建议你使用:

if (!posts || posts.length === 0) {
  // empty
}

答案 1 :(得分:1)

您可以使用会话(在主页面中初始化)来保护您的代码段 在路由到片段之前添加中间件,中间件检查会话令牌并在没有找到会话时重定向。
它与具有受登录保护的数据的系统几乎相同,并且您的主页面会自动为每个用户登录。

我可以为您提供一些示例,如果您需要,请发表评论。

[BONUS]

您是否尝试过 posts == [] posts.length === 0而不是posts === []