停留next页面,服务重启,请求报错
创建于:2025-08-22 17:19:08字数:1554
问题背景
生产环境中,如果用户停留在next的一个页面上,此时next服务重启了,重启后用户在停留的页面上发送新的http请求(不是跳转页面的链接,是post或者get的接口),服务端就会报错。
服务端日志如下:
为了安全,next在每次构建代码的时候都会生成一个唯一的密钥,无论代码是否修改过,然后客户端的每次请求都会带着这个密钥,以便服务端验证请求,验证失败就会报错并拒绝。
所以,重启后用户在停留的页面上发送新的请求,携带的还是旧的i密钥,所以服务端就拒绝了。
办法:
添加固定的环境变量 NEXT_SERVER_ACTIONS_ENCRYPTION_KEY
生成方法:在终端输入如下代码
node -e "const {randomBytes, createCipheriv} = require('crypto'); const secret = randomBytes(32); const aesKey = randomBytes(32); const iv = randomBytes(12); const c = createCipheriv('aes-256-gcm', aesKey, iv); const encrypted = Buffer.concat([c.update(secret), c.final()]); const tag = c.getAuthTag(); console.log(Buffer.concat([iv, tag, encrypted]).toString('base64'))"
执行后会给你一个加密的密钥,类似这样:fYjrNbedneAaE/nVUWklsMqXhDO4wRImwkzmkJJQn3TZSknlEsTvhzgkdoG3qKCH+v2Hsjm6ikrU68gP
然后把这个密钥配置在env文件中
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY="fYjrNbedneAaE/nVUWklsMqXhDO4wRImwkzmkJJQn3TZSknlEsTvhzgkdoG3qKCH+v2Hsjm6ikrU68gP"
问题解决。
弊端:
长期固定的密钥有安全风险,一旦密钥泄露,攻击者可以伪造action请求。
如果是经常性轮换的,即使密钥泄露,造成的损失也是在一定范围之内,不会是永久性的。
还有固定密钥会给黑客更多的时间破解,因为只要时间够久,一定会破解成功。
如果是经常性轮换的,没等到破解成功,黑客又得重新来过,提高破解难度和降低破解收益。
想要安全需要定期更换。
总结:
用户体验好,缺点是不太安全。
最后编辑于:2025-09-12 15:01:29
©著作权归作者所有,转载或内容合作请联系作者。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,little笔记系信息发布平台,仅提供信息存储服务。