1

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スニペットが返されます。これは正常に機能していると思いますが、返却したくありません。私はそれがセキュリティ上の危険ではないと思います、ただ少しエレガントではないようです。

このビューへの直接リクエストをブロックする方法はありますか?

ボーナス

これは奇妙なことで、これを2部構成の質問にします。ステートメントで空のpost配列をチェックするとif、Nodeはそれを無視します。コンソール出力は表示posts = []されますが、すぐにスキップされ、エラーがスローされますlastDate = posts.slice(-1)[0].publish_date;。JSが空の値(null、未定義、空の文字列など)でおかしな動作をすることはわかっていますが、同じ結果で別の値を試しました。完全に無視しているようです。私はクレイジーな薬を飲んでいますか?

4

2 に答える 2

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を使用して行われたかどうかを確認する方法としてのみ使用してください。

他の問題に関しては、[] === []は実際にはfalse[] == []であるため(そのまま)、配列が空であるかどうかを確認するのに適した方法ではありません。私はあなたが使用することをお勧めします:

if (!posts || posts.length === 0) {
  // empty
}
于 2013-03-27T07:32:43.220 に答える
1

(メインページで初期化される)セッションを使用して、スニペットを保護することができます。
スニペットへのルートの前にミドルウェアを追加します。ミドルウェアはセッショントークンをチェックし、セッションが見つからない場合はリダイレクトします。
これは、ログインによってデータが保護され、メインページがユーザーごとに自動的にログインするシステムとほとんど同じです。

私はあなたのためにいくつかの例をフェッチすることができます、あなたがそれを必要とするならばコメントを残してください。

[ボーナス]

試したことがありますか、posts == []それとも posts.length === 0代わりにposts === []

于 2013-03-27T07:28:42.203 に答える