系统的账号密码如果被破解了,对我们的整个系统都是巨大隐患。
通常情况下,我们会使用以下方法阻止黑客破解账号密码:
1、网站管理入口禁止使用弱口令帐号,建议使用复杂口令,比如:大小写字母与数字的组合,口令长度不小于8位等;
2、验证码在服务端校验;
3、建议采用防高频策略,针对同一IP短时间内的高频请求进行限时锁定;
4、第三方WEB防火墙来加固整个网站系统。
5、诱导/模糊提示。
具体操作:
方案1
在前端或后台对密码进行校验
前端校验
<html>
<head>
<meta charset="utf-8">
<title>密码验证</title>
</head>
<body>
</br>
<input type="text" id="test1">
<input type="button" id="te" οnclick="test()">
<script>
function test(){
var text= document.getElementById("test1").value;
var re =/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,20}$/;
//正则表达式,大小写及数字,8-20位
var result= re.test(text);
if(result)
{
alert("输入正确");
//发送请求给后台修改密码。
}else
{
alert("密码至少包含大写字母,小写字母,数字,且不少于8位");
}
}
</script>
</body>
</html>
java后台校验
第一种:
String check = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z_]{8,20}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(password);
if(!matcher.matches()){
throw new MyParameterException(187, ApiConfirm._187);
}
不符合直接抛出异常,异常为自定义异常。
第二种:
/**
* 包含大小写字母及数字且在8-20位
* 是否包含
* @param str
* @return
*/
public static boolean isLetterDigit(String str) {
boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字
boolean isLetter = false;//定义一个boolean值,用来表示是否包含字母
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) { //用char包装类中的判断数字的方法判断每一个字符
isDigit = true;
} else if (Character.isLetter(str.charAt(i))) { //用char包装类中的判断字母的方法判断每一个字符
isLetter = true;
}
}
String regex = "^[a-zA-Z0-9]{8,20}$";
boolean isRight = isDigit && isLetter && str.matches(regex);
return isRight;
}
方案2
从java后台做一个验证码给前端展示,在java后台进行校验验证码。
方案3
防高频策略,说白了就是记录一下登录人的次数,如果失误了多少次就要冻结账号。
该防御是后台防御。
关键字段,status,fault。
status存放是否冻结。0不冻结。1冻结。
fault存放错误次数。
先进行校验验账号是否存在。
select count(1) from user where loginID =‘(具体账号)’
不存在,返回false。
存在,校验是否冻结。
select count(1) from user where loginID =‘’ and status =‘0’
冻结,返回false。
存在,且不冻结,校验密码:
select count(1) from user where loginID =‘(具体账号)’ and password = ‘(输入的密码)’
密码准确,允许登录。
密码不准确,且非冻结状态:
执行 select fault from user where loginID =‘(具体账号)’
后台判断fault是否大于等于3(譬如我设定密码不能错3次)
如果是,执行:
update user set status = ‘1’,fault=‘0’ where loginID =’(具体账号)’
值得注意的是,我在这里是冻结账号同时清空错误次数的操作。也可以是解除冻结的时候再清除错误次数。
如果fault不大于3,则执行
fault +=1;
update user set fault=‘fault’ where loginID =’(具体账号)’
方案4
该方案,想要效果好,是需要购买第三方防火墙,一般来说,很少有公司愿意花钱去搞,我所在的公司也没有这个,具体操作,尚未清楚。
方案5
这是个最为简单又实用的方案
修改前端alert提示。
前端不提示:
1、密码错误
2、账号有误
而是改为提示:账号或密码有误,使攻击者无法获知账号是否存在,密码是否有误,增加暴力破解的难度。
如果非要有提示密码错误的次数,则需要配合方案3一起实施。