前端注册时怎么防字典攻击?

UE丶成娟 阅读 11

我最近在做一个用户注册页面,后端同事说要防止字典攻击,但我作为前端有点懵。现在只是简单校验了密码长度和复杂度,比如用正则/^(?=.*[a-z])(?=.*[A-Z])(?=.*d).{8,}$/,但听说这根本挡不住字典攻击。

是不是应该在前端加个常见弱密码列表比对?比如”123456″、”password”这些?但我又担心把弱密码库写在前端会被别人看到,反而帮了攻击者。有没有安全又实用的做法?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
打工人星语
这个问题其实挺有意思的,我前段时间也遇到过类似的困扰。咱们分几个步骤来说说解决方案。

第一步,你得明白字典攻击是啥。简单说就是攻击者用常见密码列表(比如top 1000弱密码)不断尝试注册或登录。你现在的正则只能保证密码复杂度,但挡不住"Qwerty123"这种符合规则但依然很弱的密码。

关于前端弱密码校验,我建议这样做比较安全:

// 不要直接存储明文弱密码列表
// 改用hash后的值,这样即使被看到也无法直接利用
const commonPasswordHashes = [
'5f4dcc3b5aa765d61d8327deb882cf99', // password
'e10adc3949ba59abbe56e057f20f883e', // 123456
// 其他常见密码的md5值...
];

function isCommonPassword(input) {
const inputHash = md5(input);
return commonPasswordHashes.includes(inputHash);
}

// 在表单提交时检查
registerForm.addEventListener('submit', (e) => {
const password = document.getElementById('password').value;
if(isCommonPassword(password)) {
alert('密码太常见,请换一个');
e.preventDefault();
}
});


这样有几个好处:
1. 攻击者看到的是hash值,无法直接知道原始弱密码
2. 前端可以快速过滤掉大部分常见弱密码
3. 配合你现有的复杂度校验,效果更好

但必须提醒你,前端防护永远只是辅助!真正的防护要靠后端,因为攻击者完全可以绕过前端直接调接口。建议你做这些:

1. 后端必须实现请求频率限制,比如同一个IP每分钟最多5次注册尝试
2. 后端也应该有自己的弱密码检测,可以用更大的密码库
3. 重要操作要加验证码,特别是多次失败后

另外关于密码hash,现在md5已经不够安全了,实际项目中可以用sha256之类的更安全的hash算法。不过在前端这个场景下,md5也够用了,毕竟我们只是要做个初步过滤。

最后说个真实案例,之前我们项目没做这些防护,结果有人用脚本疯狂注册了几千个账号,用的全是"123456"这种密码,把数据库都塞爆了...从那之后我们就加了这个前端过滤+后端频率限制的组合拳。
点赞
2026-03-06 07:00