js判断用户名是否合法不能出现admin
```html 直接说结论:前端校验用户名不能包含"admin",判断靠正则或者字符串匹配就能做到。用户但真正麻烦的名否不是写法,而是合法“admin”这个词的变体——比如“Admin”、“ADMIN”、出现“aDmIn”,判断还有“admin123”、用户“admin_2024”这种带后缀的名否。 去年我接手一个后台系统,合法用户注册时填“admin001”居然成功了。出现查了代码,判断人家只写了`if(username === 'admin')`。用户这跟没写有啥区别?名否攻击者稍微改个大小写或者加个数字就绕过去了。后来我改成这样: 有人可能会问:“那用户叫‘jadminsky’怎么办?名字里带admin但不是管理员。” 这种确实误伤。但我个人建议,在后台管理系统里,宁可错杀不可放过——因为“admin”太敏感了,哪怕出现在用户名中间,也会让运维人员在排查日志时多花两秒去确认。你想想,每天几千条登录日志,突然看到“jadminsky”成功登录,第一反应是不是去查他权限? 还有个细节是大小写。JavaScript的`toLowerCase()`对英文没问题,但如果你允许用户名里有土耳其文或德文特殊字符,就得小心了。比如土耳其语里“I”转小写是“ı”(无点),而不是“i”。不过咱们做中文系统的,一般允许的字符集就限定在`[a-zA-Z0-9_]`,所以用`toLowerCase()`没毛病。 再进一步,你不能只在前端校验。前端是给人看的,后端才是真防线。我见过一个项目,前端写得严严实实,但后端接口直接用`request.body.username`存库,没任何校验——结果有人用Postman直接发请求,用户名填“admin”就成功了。所以这篇文章标题虽然写js判断,但你心里得明白:js只是用户体验,真正的安全在后端。 说回js本身。如果你要更精细的控制,比如允许“admin”作为子串但禁止完全匹配,可以这样写: 这里用了正则的`i`标志,省得手动转小写。但注意,`/^admin[\d_]/i`只能匹配“admin123”这种,拦不住“myadmin”这种把admin放中间的。看你的业务场景——如果是禁止任何包含admin的,就用`includes`;如果只禁止“admin”或“admin+数字”,用上面的正则。 最后说个真实案例。有个同事觉得用`includes`太粗暴,改成了`indexOf('admin') > -1`,结果忘了转小写,导致“Admin”直接通过。测试用例也没写这场景,上线两周后被人注册了“Admin_System”账号,还好没给权限。后来我加了一条:所有校验函数必须同时跑三个用例——“admin”、“Admin”、“admin123”,少一个都算bug。 所以,别小看这几行代码。用户名合法性校验,看起来是技术活,其实是业务敏感度的体现。你拦的是“admin”,护的是整个系统的权限边界。写的时候多问自己一句:这个规则能防住所有“看起来像管理员”的名字吗?function isValidUsername(name) { // 先做常规校验:长度、合法允许字符 if (!/^[a-zA-Z0-9_]{ 4,出现16}$/.test(name)) return false; // 核心:不区分大小写检查是否包含admin const lower = name.toLowerCase(); if (lower.includes('admin')) { // 但允许“administrator”这种合法词?看业务需求 // 这里我选择直接拒绝所有含admin的 return false; } return true; }function isAdminName(name) { // 完全匹配admin(忽略大小写) if (name.toLowerCase() === 'admin') return true; // 或者以admin开头且后面紧跟数字/下划线 if (/^admin[\d_]/i.test(name)) return true; return false; }
-
上一篇
-
下一篇
- 随机阅读
- 搜索
-
- 友情链接
-