一次SQL注入的自查

软件登录界面

登录界面

登陆代码实现

private void btnLogin_Click(object sender, EventArgs e)
        {            
            string user = username.Text.Trim().Replace("请输入用户名", "");  //取得输入的用户名
            string pass = password.Text.Replace("请输入密码", "");  //取得输入的密码
            if (string.IsNullOrEmpty(user))
            {
                MessageBox.Show("请输入用户名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else if (string.IsNullOrEmpty(pass))
            {
                MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                //创建sql语句,其中密码采用md5加密
                string sql = string.Format(@"SELECT TOP 1 UserRoleId FROM T_Users WHERE UserId='{0}' AND UserPassword='{1}' AND Status=1 AND IsDel=0", user, DES.MD5Encrypt(pass));
                //执行查询,返回表里的数据
                DataTable dt = SqlHelper.ExecuteSelect(SqlHelper.ConnSqlServerString, sql);
                if (dt != null && dt.Rows.Count > 0)
                {
                    FrmMain frmmain = new FrmMain(dt.Rows[0]["UserRoleId"].ToString());
                    Hide();
                    IniHelper.UpdateConfigValue("登录设置", "登录账号", user);
                    UserId = user;
                    frmmain.Show();
                    return;
                }
                else
                {
                    MessageBox.Show("用户名或密码有误,请重新输入!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
            }
        }

注入操作

//创建sql语句,其中密码采用md5加密
string sql = string.Format(@"SELECT TOP 1 UserRoleId FROM T_Users WHERE UserId='{0}' AND UserPassword='{1}' AND Status=1 AND IsDel=0", user, DES.MD5Encrypt(pass));
  • 从代码sql来看,用户登录输入的信息只验证用户名和密码,用户名采用明文验证,密码采用MD5加密后的32位哈希值验证,因此密码框输入的任何符号都会被加密,密码框不存在注入的风险,存在注入风险的是用户名输入框,根据sql语句,可以构造出用户名:root'--,密码随便输,这样查询语句就变成了:
SELECT TOP 1 UserRoleId FROM T_Users WHERE UserId='root'--' AND UserPassword='c4ca4238a0b923820dcc509a6f75849b' AND Status=1 AND IsDel=0
  • 也就是密码后面的验证全部被注释掉,相当于:
SELECT TOP 1 UserRoleId FROM T_Users WHERE UserId='root'
  • 这样在确保已经存在该用户名的情况下,就能正常登陆,一般可能尝试使用root、admin等用户去登录。

注入防范

  • 方法1:过滤用户名特殊字符;
  • 方法2:sql查询where条件调整
WHERE UserPassword='{0}' AND Status=1 AND IsDel=0 AND UserId='{1}'
  • 方法3:用户名加密验证
    数据库增加新的字段,用于存储加密后的用户名,软件上登陆验证的时候使用新的字段去验证。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值