控制验证登陆次数

为了防止暴力破解 ,通常使用验证码,现在加入一种新的防暴力破解方法,限制验证登陆错误次数,并封锁IP
代码如下
     /// <summary>
    
/// Login 的摘要说明。
    
/// </summary>

     public   class  Login : System.Web.UI.Page
    
{
        
protected System.Web.UI.WebControls.RequiredFieldValidator rfvUsername;
        
protected System.Web.UI.WebControls.RequiredFieldValidator rfvPassword;
        
protected System.Web.UI.WebControls.Label lblErrorMessage;
        
protected System.Web.UI.WebControls.TextBox txtUserName;
        
protected System.Web.UI.WebControls.TextBox txtPassWord;
        
protected System.Web.UI.WebControls.TextBox txtYanzheng;
        
protected System.Web.UI.WebControls.RequiredFieldValidator Requiredfieldvalidator1;
        
protected System.Web.UI.WebControls.ImageButton btnLogin;
        
protected System.Web.UI.WebControls.Image Image1;
        
        
string strIp="";
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
            if(!Page.IsPostBack)
            
{
                Session[
"CheckCode"= "";
            }

        }


        
Web 窗体设计器生成的代码

        
        

        
private void ImageButton2_Click(object sender, System.Web.UI.ImageClickEventArgs e)
        
{
            
            WebJTJ.Components.IPLock ip
=new WebJTJ.Components.IPLock();
            
bool IPLocked=ip.IPLockCheck(GetIP());
            
if(IPLocked)
            
{
                lblErrorMessage.Text
="您的ip地址已经被锁定,请联系管理员!"    ;
            }

            
else
            
{
                
if(Convert.ToInt16(Session["LoginTimes"])<1)
                
{
                    
if(txtYanzheng.Text.Trim()==Session["CheckCode"].ToString())
                    
{
                        
string UserID ="";
                        
                        WebJTJ.Components.Staff staff
=new WebJTJ.Components.Staff();
                        
string CheckString = staff.Login(txtUserName.Text, txtPassWord.Text);
                
                        
if(CheckString!=null)
                        
{
                            
string LoginChecked;
                            
if(CheckString.IndexOf("-")>=0)
                            
{
                                UserID
=CheckString.Substring(0,CheckString.IndexOf("-"));
                                LoginChecked 
= CheckString.Substring(CheckString.IndexOf("-")+1);

                                
if(LoginChecked=="True")
                                
{
                                    Session[
"UserName"]=txtUserName.Text;
                                    Session[
"UserID"]=UserID;
                                    Session[
"WebManager"]=LoginChecked;
                                    Response.Redirect(
"Admin_Main.aspx");
                                }

                            }

                        }

                        
else
                        
{
                            Session[
"LoginTimes"]=Convert.ToInt16(Session["LoginTimes"])+1;
                            lblErrorMessage.Text
="您输入的用户名或密码错误,请重新输入!";    
                        }

                    }

                    
else
                    
{
                        lblErrorMessage.Text
="您输入的验证码错误!请重新输入!";
                    }

                }

                
else
                
{
                    
if(Request.ServerVariables["HTTP_VIA"]!=null)
                    
{       
                        strIp
=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();       
                    }

                    
else
                    
{       
                        strIp
=Request.ServerVariables["REMOTE_ADDR"].ToString();       
                    }

                    
if(strIp.Length>0)
                    
{
                                            
                        WebJTJ.Components.Staff IPLock
=new WebJTJ.Components.Staff();
                        IPLock.IPLock(strIp);
                    
                    }

                    lblErrorMessage.Text
="对不起,您的密码输入次数已经收到限制,您的IP地址已经被记录封锁,请联系管理员给您解除锁定!";
                }

        
            }

            
        

        }


        
public string GetIP()
        
{
            
if(Request.ServerVariables["HTTP_VIA"]!=null)
             
{       
               strIp
=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();       
             }

            
else
             
{       
               strIp
=Request.ServerVariables["REMOTE_ADDR"].ToString();       
             }

            
return strIp ;

        }

    }

}
### 设置 MySQL 登录失败次数限制 在 MySQL 中,可以通过配置插件 `validate_password` 和使用账户管理功能来实现对登录失败尝试次数的限制。以下是具体方法: #### 使用 `MAX_USER_CONNECTIONS` 或 `max_user_connections` 虽然 MySQL 本身不直接提供针对登录失败次数的功能,但可以间接通过连接数限制以及错误处理机制达到类似效果。管理员可利用 `GRANT` 命令中的参数控制用户的最大并发连接数量。 ```sql -- 将用户 'testuser' 的最大连接数设为 5 GRANT USAGE ON *.* TO 'testuser'@'localhost' WITH MAX_USER_CONNECTIONS 5; ``` 此命令会限制指定用户的最大连接数[^2]。 #### 配置密码验证插件 启用并配置 `validate_password` 插件可以帮助加强安全策略,尽管它主要关注于密码复杂度而非登录失败次数。安装该插件后可以根据需求调整其强度级别和其他选项。 ```sql INSTALL PLUGIN validate_password SONAME 'validate_password.so'; SET GLOBAL validate_password.policy=STRONG; -- 设定强密码政策 ``` 上述 SQL 片段展示了如何加载插件并将密码策略设定为更强模式[^3]。 对于更精确地追踪和阻止过多连续失败登录,则需依赖外部工具或者自定义脚本配合操作系统层面的日志监控完成进一步的安全防护措施实施工作。 #### 自动化故障转移 (Failover) 当数据库服务不可用时,如主库因意外被终止 (`pkill -9 mysqld`) 而无法响应请求的情况下,高可用架构下的自动 failover 功能显得尤为重要。这通常涉及部署复制集群环境,并借助第三方软件比如 MHA(MySQL HA), Orchestrator 来简化切换流程[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值