【问题标题】:Node.js/Express: Prevent AJAX HTML snippet from being loaded directly from URLNode.js/Express:防止直接从 URL 加载 AJAX HTML 片段
【发布时间】:2013-03-27 06:22:47
【问题描述】:

我正在使用 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 sn-p。我想这是应该的,但我不想退回它。我不认为这是一个安全隐患,只是看起来有点不雅。

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

奖金

这里还有一些奇怪的东西,它把它变成了一个由两部分组成的问题。当我在 if 语句中检查一个空的 post 数组时,Node 会忽略它。控制台输出显示posts = [] 但它直接跳过它然后在lastDate = posts.slice(-1)[0].publish_date; 上引发错误同样的结果。它似乎完全无视它。我在吃药吗?

【问题讨论】:

    标签: javascript jquery ajax node.js express


    【解决方案1】:

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

    您可以通过检查 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
    }
    

    【讨论】:

      【解决方案2】:

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

      我可以为你拿一些例子,如果你需要的话,留下评论。

      [奖金]

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

      【讨论】:

      • 您必须使用posts.length === 0posts == [] 不起作用。谢谢!
      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2017-10-02
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多