假设我有以下 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 请求,而没有其他人。
我该怎么做才能防止其他人打开控制台并发送 AJAX POST 请求
谁是“他人”?
如果其他人==站点的用户......您无法阻止他们使用 JavaScript 控制台或任何其他方式发送他们喜欢的任何请求。您不能信任客户端,因此您必须获得服务器端授权:要求用户登录帐户,并注册该帐户已投票,因此无法再次投票。
如果 others== 其他站点的管理员(通过向其用户提供导致提交到您站点的脚本)......另一个站点上的 JavaScript 不可能导致 AJAX POST 请求,或者至少不会,除非您故意选择使用CORS。但是他们很可能通过简单地创建<form>
指向您的地址并提交它来引发 POST。
这是一个经典的跨站请求伪造问题。广泛接受的 XSRF 问题解决方案是在每个 POST(表单或 AJAX)提交中包含一个秘密令牌作为参数。该秘密令牌与用户的登录状态相关联,要么存储在服务器端会话中,要么复制到客户端 cookie 中。无论哪种方式,来自另一个站点的攻击者都无法获得对登录用户有效的令牌,因此他们无法伪造请求。
您需要对所有具有直接影响的操作进行XSRF 保护,无论是 AJAX 还是基于表单的 POST。