当前位置:编程学习 > C#/ASP.NET >>

实现SQL用户验证登陆,这样可以不?

刚写了个登陆验证,大家看看还有什么要修改或者优化的么?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace abtSystem
{
    public partial class Login : Form
    {
        SqlConnection conn;
        SqlCommand cmd; 

        public Login()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //数据库连接部分
            string connstring = "server=.;uid=sa;pwd=sa;database=datas";
            conn = new SqlConnection(connstring);
            conn.Open();
        }

        private void butEnter_Click(object sender, EventArgs e)
        {
            try
            {
                string sql = "select count(*) from users where username='"+txtusername.text+"' and password='"+txtpassword.text+"'";
                cmd = new SqlCommand(sql, conn);
                string counts = Convert.ToString(cmd.ExecuteScalar());
                if(counts==1)
                {
                    MessageBox.Show(“成功登陆”);
                }
                else
                {
                    MessageBox.Show("登陆错误");
                }
            }
            catch (SqlException ex)
            {
                MessageBox.Show("错误类型:" + ex);
            }
            catch
            {
                MessageBox.Show("未知错误");
            }
        }
    }
}
--------------------编程问答-------------------- 不好   我们看看  
select count(*) from users where username='"+txtusername.text+"' and password='"+txtpassword.text+"'"
如果 我在文本框里面 输入 ' or 1=1 则
select count(*) from users where username='' or 1=1 ' and password='"+txtpassword.text+"'" 
这句话永远返回一行--! 你的验证没有任何效果! --------------------编程问答--------------------

 string counts = Convert.ToString(cmd.ExecuteScalar());


cmd.ExecuteScalar()  返回的是 第一行 第一列的数据    而这里返回的就是一个单元格  count(*)   为什么不可以呢?

这里不做安检,只讨论数据访问及结果 --------------------编程问答-------------------- 大家都睡觉去了吗? --------------------编程问答--------------------                 string counts = Convert.ToString(cmd.ExecuteScalar());
                if(counts==1)
不行  这里的数据类型要转换下 --------------------编程问答-------------------- 不说安全性的话:
int counts = (int)cmd.ExecuteScalar();
if (counts >= 1)
--------------------编程问答-------------------- 你的程序的安全性漏洞有以下两点:

1、密码不应以明文的形式存放在数据库中,而是应该经过MD5或SHA加密后存放。验证时把用户输入的密码经过同样加密后与存放在数据库中的密文比较。

2、为了防止SQL注入,应该使用SqlParameter,而不是接接SQL语句。
--------------------编程问答-------------------- 很明显的问题,LZ的Connection打开后就没关闭过。

还有,判断建议用

SqlDataReader reader = (new SqlCommand("Select password From users Where username='"+txtusername.text+"'", conn)).ExecuteReader();
if ((reader.FieldCount == 1) && reader.Read())
{
  if (txtpassword.text == reader.GetString(0))
  {
    MessageBox.Show(“成功登陆”);
    return;
  }
}
MessageBox.Show("登陆错误");
--------------------编程问答-------------------- 1.应使用参数(SqlParameter)
2.如果登录不成功,应该return --------------------编程问答--------------------
private void butEnter_Click(object sender, EventArgs e)
{
  int counts;
  string connstring = "server=.;uid=sa;pwd=sa;database=datas";
  using (SqlConnection conn = new SqlConnection(connstring))
  {
    conn.Open();
    string sql = "select count(*) from [users] where [username]=@username and [password]=@password";
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlParameter para1 = new SqlParameter("@username", SqlDbType.NVarChar);
    para1.Value = txtusername.Text.Trim();
    cmd.Parameters.Add(para1);
    SqlParameter para2 = new SqlParameter("@password", SqlDbType.Binary);
    para2.Value = (new MD5CryptoServiceProvider()).ComputeHash(Encoding.UTF8.GetBytes(txtpassword.Text));
    cmd.Parameters.Add(para2);
    counts = (int)cmd.ExecuteScalar();
  }
  MessageBox.Show(counts >= 1 ? "成功登陆" : "登陆错误");
}
--------------------编程问答-------------------- 注意,以上程序是假设password是经过MD5加密后以二进制的格式存放在数据库中。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,