3

假设我有以下 URL 路由:

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

我能做些什么来防止其他人打开控制台并发送 AJAX POST 请求www.mysite.com/upvote?我希望它只www.mysite.com允许发出该 POST 请求,而没有其他人。

4

2 回答 2

4

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

谁是“他人”?

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

如果 others== 其他站点的管理员(通过向其用户提供导致提交到您站点的脚本)......另一个站点上的 JavaScript 不可能导致 AJAX POST 请求,或者至少不会,除非您故意选择使用CORS。但是他们很可能通过简单地创建<form>指向您的地址并提交它来引发 POST。

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

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

于 2013-06-19T12:24:53.610 回答
2

我同意bobince。others是一个很笼统的名词。

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

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

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

  • 那么这是一个身份验证问题。必须在服务/执行之前检查每个请求。您应该实施用户身份验证来防止这种情况。我使用passport,并确保在实际运行app.post 处理程序之前对用户进行身份验证。
于 2013-06-20T06:31:09.050 回答