无需用户认证,如何保护Node.js服务器的POST端点?
问题描述
我有一个带单个POST端点的Node.js服务器,配合React应用使用,但不想让其他人访问这个端点。服务器用来处理不适合或不能在客户端操作的数据,他人无法从服务器获取数据,但提交的数据需要保护。
除了用户认证外,还有什么方法可以防止他人访问该POST端点?我发现只要知道正确的URL和JSON数据参数,就能通过cURL命令访问。
我已经配置了CORS,仅允许我的域名访问:
app.use( cors({ origin: [ 'http://myWebsite.com', 'http://www.myWebsite.com', 'https://myWebsite.com', 'https://www.myWebsite.com', ], }), );
可行防护方案(除用户认证外)
- 请求签名验证:前端用双方约定的密钥,对请求参数、时间戳等信息生成签名,随请求一起发送。服务器收到请求后,用相同密钥重新计算签名并比对,只有签名匹配的请求才会被处理。这种方式能有效防止伪造请求。
- CSRF令牌校验:前端从服务器获取CSRF令牌,每次发起POST请求时在请求头或表单中携带该令牌。服务器验证令牌的有效性,不匹配则拒绝请求。虽然CSRF主要针对跨站伪造,但也能阻挡部分直接的未授权请求。
- 请求频率限制:使用
express-rate-limit这类中间件,对该POST端点设置请求频率阈值(比如每分钟最多10次请求),防止恶意批量请求。 - 请求体哈希校验:前端结合密钥对请求体生成哈希值,随请求发送。服务器收到后重新计算请求体的哈希并比对,确保请求内容未被篡改且来源合法。
- 自定义请求头验证:约定一个仅前端和服务器知晓的自定义请求头(例如
X-Valid-Key),服务器检查请求中是否存在该头且值正确。不过这种方式容易被抓包获取,建议配合加密手段一起使用。
个人解决方案分享
我在前端和Node.js服务器中引入了CryptoJS,两端配置相同的环境变量作为密钥。请求时用该密钥对请求数据加密,服务器收到后用密钥解密,没有正确密钥的请求无法被处理,这个方法成功解决了我的问题。
内容的提问来源于stack exchange,提问作者dela1000
相关产品推荐
相关产品推荐

