网易首页 > 网易号 > 正文 申请入驻

开发者审计12个开源JWT项目:几乎每个都犯了这6个相同错误

0
分享至

最近一个月,我翻遍了GitHub上12个使用Node.js的开源项目,从那些标着2k星标的起步模板,到正经公司在用的生产级脚手架,就为了看看大家怎么处理JWT(JSON Web Token)。结果让我有点坐不住:几乎每个项目里都藏着同样的6个错误。不是开发者不行,恰恰相反,写这些代码的人都很老练。问题在于那些从教程里复制粘贴过来的写法,被无数次照搬却没人停下来问一句——它真的安全吗?下面就是这6个坑,先上第一个,也是离谱到让你想发弹幕的那种。

第一个错误:密钥就叫“secret”,真的就是那个单词。

我在三个不同的项目里看到了下面这句:
const token = jwt.sign({ userId: user.id }, "secret", { expiresIn: "1h" });
这个“secret”几乎出现在互联网上每一个JWT教程里,JSON Web Token官网文档里有它,jsonwebtoken库的README里也有它。开发者写示例时随手一敲,后来忘了改,就直接跑在了线上。一个只有6个字符的ASCII密钥,大概能提供42比特的熵值。用GPU集群跑字典攻击,几毫秒就能把它撞开。随手生成一个真正安全的密钥只要3秒钟,用256位密码学随机数就好。信我,这3秒真不能省。

第二个错误:在鉴权中间件里用了 jwt.decode()。

我在一个生产环境的认证中间件里看到了这样的代码:
const decoded = jwt.decode(req.headers.authorization.split(" ")[1]);
if (!decoded.userId) return res.status(401).send("Unauthorized");
jwt.decode()根本不检查签名。它只管把payload原封不动地读出来,不管这个token是过期了、是伪造的、还是被人改写过。这意味着攻击者可以随手捏一个payload,只要能糊弄过这个userId检查,就能直接绕过认证。改法也很简单,就两个字:把decode换成verify。
const decoded = jwt.verify(token, process.env.JWT_SECRET, { algorithms: ["HS256"] });
多两个字母,少一个天大漏洞。

第三个错误:verify()的时候没指定算法。

很多项目在验证token时是这么写的:
jwt.verify(token, secret);
没有第二个参数里的{algorithms:['HS256']},这个库就会老老实实地信任token头部里自己声明的算法。攻击者可以造一个token,头部写成"alg":"none",签名留空,verify()一看,哦你没说要验什么算法,那我信了,于是放行。记住:验证的时候永远显式地把预期的算法写死。别把选择权留给攻击者。

第四个错误:密钥直接提交到了版本控制里。

我在一个公开仓库的config.js里看到了这段:
module.exports = {
jwtSecret: "productionsecretdonotshare2024",
database: process.env.DATABASE_URL
};
注意那个注释——“donotshare”。开发者自己也知道这是敏感信息,可它就是被commit进了公开仓库。一旦进了git历史,这个密钥就永久泄露了。哪怕你之后删掉文件,历史记录里照样扒得出来。如果你也这么干过,别犹豫,马上轮换密钥,别抱幻想。

第五个错误:把token存在localStorage里。

我在好几个项目的前端代码中都发现了同一套操作:
localStorage.setItem("token", response.data.token);
// 然后要用的时候:
const token = localStorage.getItem("token");
localStorage里的内容对页面上跑的任何JavaScript都是透明的。只要有一个XSS漏洞——比如一条没过滤干净的评论、一个被污染的npm包、一个第三方脚本——所有存着的token就会被人直接卷走。最好的做法是用httpOnly的cookie来放鉴权token。它对JavaScript不可见,XSS再怎么折腾也偷不走。如果需要防CSRF,再配上SameSite属性就好。

第六个错误:token永远不过期。

有的项目签发token的时候压根没设expiresIn:
const token = jwt.sign({ userId: user.id }, secret);
这意味着一旦生成,这个token永生不死。用户可能早就注销了,设备可能早就丢了,但只要token本身还在,谁拿到它都能一直用下去。永远给token一个合理的过期时间,同时准备好刷新令牌的机制。即便只是设成24小时,也比永远要好上无数倍。

这6个错误都没什么高深的技术门槛,它们只是被复制粘贴得太顺手,顺手到整个社区都快忘了原本不该这么写。把这些小零件换好,你的JWT实现就不会再是下一个被轻松穿过的筛子。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
71岁敬一丹录节目意外脑溢血,抢救一个多月后悼念帖被紧急删除

71岁敬一丹录节目意外脑溢血,抢救一个多月后悼念帖被紧急删除

猪小艳吖
2026-07-25 20:52:29
破防!近80岁洪秀柱杭州哽咽:我等不及两岸统一了

破防!近80岁洪秀柱杭州哽咽:我等不及两岸统一了

阿天爱旅行
2026-07-20 15:59:02
长鑫科技,明日上市!还有两大龙头同步开启申购!

长鑫科技,明日上市!还有两大龙头同步开启申购!

新浪财经
2026-07-26 17:36:55
北大同学评价王虹都是偏内向,法国都说她是活泼开朗有想法的人

北大同学评价王虹都是偏内向,法国都说她是活泼开朗有想法的人

大张的自留地
2026-07-25 18:52:33
难怪谢贤早结扎,前女友Coco曝私密猛料,原来父子俩是一个样

难怪谢贤早结扎,前女友Coco曝私密猛料,原来父子俩是一个样

闻香阁
2026-07-26 13:47:23
儿子在校被打,我赶到后发现对方家长竟然是前夫,我冷笑:打回去

儿子在校被打,我赶到后发现对方家长竟然是前夫,我冷笑:打回去

麦子情感故事
2026-07-26 12:55:11
一波未平一波又起!峰学蔚来再迎“噩耗”,武亮走上了张雪峰老路

一波未平一波又起!峰学蔚来再迎“噩耗”,武亮走上了张雪峰老路

社会日日鲜
2026-07-26 14:58:22
别傻走!人民日报:比散步更长寿的,其实是这运动

别傻走!人民日报:比散步更长寿的,其实是这运动

华庭讲美食
2026-07-15 03:35:57
闹剧终遭反噬,印尼逼走中企致新首都烂尾,求救无门妄想中国买单

闹剧终遭反噬,印尼逼走中企致新首都烂尾,求救无门妄想中国买单

大黑爱旅游
2026-07-25 13:16:54
广东退休人注意!工龄不分5年一档!30/35/40年按月算清清楚楚

广东退休人注意!工龄不分5年一档!30/35/40年按月算清清楚楚

王二哥老搞笑
2026-07-26 10:52:03
菲律宾摆鸿门宴迎接中国外长,中方釜底抽薪巧妙周旋,菲阴谋落空

菲律宾摆鸿门宴迎接中国外长,中方釜底抽薪巧妙周旋,菲阴谋落空

光辉与阴暗
2026-07-26 20:28:53
深圳高中录取线出炉,深中592分,翠园重回10大!

深圳高中录取线出炉,深中592分,翠园重回10大!

牛锅巴小钒
2026-07-26 19:45:55
重庆“黄色法拉利”这一拦,打脸了多少遇事只会踩刹车的怂人?

重庆“黄色法拉利”这一拦,打脸了多少遇事只会踩刹车的怂人?

音乐时光的娱乐
2026-07-26 15:31:00
钱学森晚年说了句大实话:中国丢掉这两样东西,后果不堪设想

钱学森晚年说了句大实话:中国丢掉这两样东西,后果不堪设想

别人都叫我阿腈
2026-07-25 15:35:12
LV因楼盘雕花起诉开发商?官方通报

LV因楼盘雕花起诉开发商?官方通报

闪电新闻
2026-07-26 16:25:25
明天,两大龙头来了

明天,两大龙头来了

第一财经资讯
2026-07-26 14:31:06
越来越多车主选择直接弃车!不报废不销户,懂行的都说太明智

越来越多车主选择直接弃车!不报废不销户,懂行的都说太明智

沙雕小琳琳
2026-07-26 11:54:10
92.6%!一场比赛未打,詹姆斯已在76人创下历史纪录

92.6%!一场比赛未打,詹姆斯已在76人创下历史纪录

童叔不飙车
2026-07-26 20:14:36
小舅子带人砸坏我新车,岳母劝我算了,我淡定报警:一个不放过

小舅子带人砸坏我新车,岳母劝我算了,我淡定报警:一个不放过

晓艾故事汇
2026-07-24 14:34:20
CCTV5直播申花VS海牛,斯卢茨基指望吴曦,1主3客全是硬仗,叶博亚复出找状态

CCTV5直播申花VS海牛,斯卢茨基指望吴曦,1主3客全是硬仗,叶博亚复出找状态

替补席看球
2026-07-20 12:18:28
2026-07-26 21:40:49
我是一个粉刷匠2
我是一个粉刷匠2
有态度网友ytd
370文章数 150关注度
往期回顾 全部

科技要闻

传DeepSeek 100亿元新一轮融资突然放缓

头条要闻

女子实名举报、人社局查实:项目套取农民工工资37.2万

头条要闻

女子实名举报、人社局查实:项目套取农民工工资37.2万

体育要闻

詹姆斯的最后一集,依旧最艰难的路?

娱乐要闻

演员王建隆在家中去世,年仅43岁

财经要闻

232亿,巴黎水被卖了

汽车要闻

轿跑姿态+大空间/标配655km续航 奇瑞风云A9置换价10.68万起

态度原创

时尚
艺术
家居
教育
公开课

7年亏2亿,“败家女”冉莹颖,太冤了

艺术要闻

中美协新文艺群体会员美展 油画选(二)

家居要闻

2026建博会(广州) 公装联探展交流活动

教育要闻

国能神东煤炭2026年春招拟录用457人深度分析:这些院校和专业受欢迎

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版