zoukankan      html  css  js  c++  java
  • 应用SqlParameter防止注入式攻击,打开主窗体关闭登录窗体

    在创建登录窗体时,如果不注意很可能写出代码出现问题。再设计登录窗体时,初学者喜欢用这种方式进行登录设计

    string sqlcon = "data source=.\\sqlexpress;database=MyCy;uid=sa;pwd=123456;"

    string sql = "select *from tb_user where username = '"+txtuser.text+"' and userpwd = '"+txtpwd.text+"'";

    SqlCommand cmd = new SqlCommand(sql, sqlcon);

    这种方式在用户输入单引号等字符:如txtpwd为 1'or'1'='1 时,则此时sql=select *from tb_user where username = "username" and userpwd = '1'or'1'='1' ,此时显然恒成立,则起不到密码的验证作用,这种情况考虑使用SqlParameter防止注入攻击。

    登录窗体详细设计过程如下:

    在btnOK的click事件下添加如下代码

      string sqlcon = "data source=.\\sqlexpress;database=MyCy;uid=sa;pwd=123456;"

      SqlConnection sqlcon = new SqlConnection(sqlcon);

      if (sqlcon.State == ConnectionState.Closed)
        sqlcon.Open();
      string sql = "select username,userpwd from tb_user where username = @username and userpwd = @userpwd";

      try
      {
        SqlParameter[] parms = new SqlParameter[2];
               parms[0] = new SqlParameter("@username", SqlDbType.VarChar, 50);
               parms[0].Value = txtUser.Text;
               parms[1] = new SqlParameter("@userpwd", SqlDbType.VarChar, 50);
               parms[1].Value = txtPwd.Text;
               SqlCommand cmd = new SqlCommand(sql, sqlcon);
               cmd.Parameters.AddRange(parms);
               using (SqlDataReader dr = cmd.ExecuteReader())
               {
                    dr.Read();
                    if (dr.HasRows)
                    {
                          MainForm mainForm = new MainForm();
                          DialogResult = DialogResult.OK;  //设置登录窗体成功后LoginForm关闭时用到
                    }
                    else

           {
            MessageBox.Show("用户名密码错误!");
                    }
        }

        sqlcon.Close();
          }
          catch (Exception ex)
          {
                MessageBox.Show(ex.Message);
          }

     这样就可以防止上面错误发生,当用户输入1'or'1'='1 时,1'or'1'='1当做一个整体进行验证,sql语句被解析为:sql=select *from tb_user where username = "username" and userpwd = 1'or'1'='1,提示用户密码错误,达到预防的目的。

    顺便说一下,要想登录成功后关闭登录窗体,需要在Program的Main()入口点函数加上如下代码:         

          LoginForm login = new LoginForm();
          if (login.ShowDialog() == DialogResult.OK)
               Application.Run(new MainForm()); 就可以达到关闭登录窗体的效果。

  • 相关阅读:
    “图”以致用组
    水体频率小组
    2021年云开发组三等奖作品展示
    毫秒级百万数据分页存储过程[欢迎转载]
    SQL Server 数据备份存储过程[原创]
    博客园居然被中国电信提醒有病毒,有图为证
    网络文件夹例子
    小技巧:在DropDownList数据绑定前插入固定文字
    ASP.NET整合Discuz!NT3.5实例说明(含用户登录、评论等)
    Visual Studio 2008的性能改进以及十大新功能(转)
  • 原文地址:https://www.cnblogs.com/PaulMa/p/1872464.html
Copyright © 2011-2022 走看看