在密码校验中,防止连续或重复字符是一个常见的安全要求。下面我将介绍几种JavaScript实现方法。
function validatePassword(password) {
// 检查连续字符 (如123, abc)
const sequentialRegex = /(012|123|234|345|456|567|678|789|890|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)/i;
// 检查重复字符 (如111, aaa)
const repeatRegex = /(.)\1{2,}/;
// 检查键盘相邻字符 (如qwe, asd)
const keyboardRegex = /(qwerty|asdfgh|zxcvbn|poiuyt|lkjhgf|mnbvcx)/i;
if (sequentialRegex.test(password)) {
return { valid: false, message: "密码包含连续字符" };
}
if (repeatRegex.test(password)) {
return { valid: false, message: "密码包含重复字符" };
}
if (keyboardRegex.test(password)) {
return { valid: false, message: "密码包含键盘相邻字符" };
}
return { valid: true, message: "密码有效" };
}
function isPasswordValid(password) {
// 最小长度检查
if (password.length < 8) {
return { valid: false, message: "密码至少需要8个字符" };
}
// 检查连续字符
for (let i = 0; i < password.length - 2; i++) {
const char1 = password.charCodeAt(i);
const char2 = password.charCodeAt(i + 1);
const char3 = password.charCodeAt(i + 2);
// 检查数字连续 (如123)
if (char2 === char1 + 1 && char3 === char2 + 1) {
return { valid: false, message: "密码包含连续数字" };
}
// 检查字母连续 (如abc)
if (Math.abs(char2 - char1) === 1 && Math.abs(char3 - char2) === 1) {
const isLower = char1 >= 97 && char1 <= 122;
const isUpper = char1 >= 65 && char1 <= 90;
if ((isLower && char2 === char1 + 1 && char3 === char2 + 1) ||
(isUpper && char2 === char1 + 1 && char3 === char2 + 1)) {
return { valid: false, message: "密码包含连续字母" };
}
}
}
// 检查重复字符
for (let i = 0; i < password.length - 2; i++) {
if (password[i] === password[i+1] && password[i] === password[i+2]) {
return { valid: false, message: "密码包含重复字符" };
}
}
return { valid: true, message: "密码有效" };
}
对于更全面的密码策略,可以考虑使用现成的库如:
- zxcvbn
(Dropbox开发的密码强度评估库)
- password-validator
// 使用password-validator示例
const passwordValidator = require('password-validator');
const schema = new passwordValidator();
schema
.is().min(8)
.is().max(100)
.has().not().spaces()
.has().not().sequentialLetters(3) // 不允许3个连续字母
.has().not().sequentialDigits(3) // 不允许3个连续数字
.has().not().repeating(3); // 不允许3个重复字符
function validateWithLibrary(password) {
const result = schema.validate(password, { details: true });
if (result.length > 0) {
return { valid: false, message: result[0].message };
}
return { valid: true, message: "密码有效" };
}
这些方法可以根据你的具体需求进行调整和组合使用。