如何在Express.js中强制执行相同的原始策略?

时间:2013-06-19 11:05:33

标签: node.js security rest express

假设我有以下网址:

app.post('upvote', function(req, res) {
  // make a database a call to increase vote count
});

我可以做些什么来防止他人打开控制台并在www.mysite.com/upvote上发送AJAX POST请求?我希望它只允许www.mysite.com发出POST请求而不允许其他人。

2 个答案:

答案 0 :(得分:4)

  

我该怎么做才能阻止他人打开控制台并发送AJAX POST请求

谁是“其他人”?

如果其他人= =该网站的用户......您无法阻止他们使用JavaScript控制台或任何其他方式发送他们喜欢的任何请求。您无法信任客户端,因此您必须拥有服务器端授权:要求用户登录帐户,并注册该帐户已投票,因此无法再次投票。

如果其他人= =其他网站的管理员(通过向其用户提供导致提交到您网站的脚本)...其他网站上的JavaScript无法导致AJAX POST请求,或者至少不会你有意使用CORS选择加入。{但是他们很可能只需创建一个<form>指向您的地址并提交它就可以发布POST。

这是一个经典的Cross Site Request Forgery问题。广泛接受的XSRF问题解决方案是在每个POST(表单或AJAX)提交中包含一个秘密令牌作为参数。该秘密令牌与用户的登录状态相关联,可以是存储在服务器端会话中,也可以是复制在客户端cookie中。无论哪种方式,来自其他站点的攻击者都无法获取对登录用户有效的令牌,因此他们无法伪造请求。

对于直接影响的所有操作,无论是AJAX还是基于表单的POST,都需要XSRF保护。

答案 1 :(得分:2)

我同意bobince。 others是一个非常通用的术语。

如果其他网站属于其他网站(网络上的恶意网站)。

  • express拥有csrf中间件以防止跨站点请求 伪造。您可以使用它来防止这种情况。请参阅API文档 here

如果其他人是您自己网站的用户

  • 然后这是一个身份验证问题。每个请求必须是 在服务/执行之前检查。你应该实现一个用户 验证以防止这种情况。我使用passport和 确保在我实际运行app.post之前对用户进行了身份验证 处理程序。