mikeoabban Ответов: 3

проверьте имя пользователя и пароль в форме c#


Привет я хочу, чтобы моя форма входа в систему проверяла, есть ли имя пользователя и пароль в базе данных, тогда она должна отображать frmMain, если нет, то она должна отображать "неверное имя пользователя или пароль"

он работает, если имя пользователя и пароль верны, но отображает примечание, если имя пользователя и пароль неверны
пожалуйста, помогите мне


private void btnLogin_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.txtUsername.Text) | string.IsNullOrEmpty(this.txtPassword.Text))
            {
                MessageBox.Show("provide User Name and Password");
            }

            if (string.IsNullOrEmpty(cboUsertype.Text))
            {
                MessageBox.Show("Select User Type");
            }
            

            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = "Data Source=pc101;Initial Catalog=SMS;User ID=sa;Password=mike";
            conn.Open();

            string UserName = txtUsername.Text;
            string Password = txtPassword.Text;
            string UserType = cboUsertype.Text;

            SqlCommand cmd = new SqlCommand("SELECT * FROM tbluser WHERE username = '" + txtUsername.Text + "' and usertype = '" + cboUsertype.Text + "' and mypassword = '" + txtPassword.Text + "'", conn);

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);

            System.Data.SqlClient.SqlDataReader dr = null;
            dr = cmd.ExecuteReader();
         
            if (dr.Read())
            {
                SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
                con.ConnectionString = "Data Source=pc101;Initial Catalog=SMS;User ID=sa;Password=mike";
                con.Open();

                if (this.cboUsertype.Text == dr["UserType"].ToString() & this.txtUsername.Text == dr["UserName"].ToString() & this.txtPassword.Text == dr["mypassword"].ToString() & this.cboUsertype.Text == "Data Entry Clerk")
                 {
                     MessageBox.Show("*** Login Successful ***");
                     frmMain f = new frmMain();
                     f.Show();
                    // f.CreateUserAccountToolStripMenuItem.Enabled = false;
                     this.Hide();
                 }

                  else if (this.cboUsertype.Text == dr["UserType"].ToString() & this.txtUsername.Text == dr["UserName"].ToString() & this.txtPassword.Text == dr["mypassword"].ToString())
                 {
                     MessageBox.Show("*** Login Successful ***");
                     frmMain g = new frmMain();
                     g.Show();
                     this.Hide();
                 }

                 else
                 {
                    MessageBox.Show("Invalid UserName or Password", "Login", MessageBoxButtons.OK, MessageBoxIcon.Information);
                     MessageBox.Show("Access Denied!!");
                   
                 }              
            }
        }

[no name]

Форматируйте фрагменты кода при публикации

Member 12389023

Не могли бы вы добавить снимки экрана frontend design

3 Ответов

Рейтинг:
6

OriginalGriff

Пожалуйста, не делай этого.
1) не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
2) Никогда не храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]

Кроме этого, все, что вам нужно, это показать форму:

if (sucessfullLogin)
   {
   frmMain f = new frmMain();
   Hide();
   f.ShowDialog();
   Show();
   }


mikeoabban

Большое спасибо
я попробую прямо сейчас

Sergey Alexandrovich Kryukov

Хорошие моменты, но.....
Я взглянул на вашу статью о хранении паролей. Я бы предостерег от MD5-он считается сломанным. Поэтому я проголосовал за 4 и добавил свой ответ: некоторые разъяснения по хранению паролей, предупреждение против MD5 и ссылку на SQL-инъекцию.
--СА

Рейтинг:
25

Not Active

Не КОГДА-ЛИБО примите непроверенный пользовательский ввод и объедините команду Sql. КОГДА-ЛИБО Читатель об атаках SQL-инъекций.

Узнайте больше о предложении using, например

using(SqlCommand cmd = new SqlCommand(...))
{

}


Вы создаете и открываете два SqlConnection и никогда не используете второй. Почему?

Напишите хранимую процедуру, которая принимает имя пользователя и пароль и возвращает значение, указывающее, являются ли они допустимыми. Гораздо проще, гораздо чище.


Sergey Alexandrovich Kryukov

Хорошие очки, 5.
Опять же, я добавил ссылку на SQL-инъекцию и другие разъяснения в своем ответе.
--СА

Рейтинг:
17

Sergey Alexandrovich Kryukov

В дополнение к ответам Гриффа и Марка: смотрите это:
http://en.wikipedia.org/wiki/SQL_injection[^].

Теперь об использовании рекомендаций Гриффа по криптографическому алгоритму хэширования. Мне нужно добавить предупреждение против использования MD5.

Во - первых, пароль никогда и нигде не хранится. Разве вы не видите, что хранение пароля неправильно и совершенно небезопасно?

Вам никогда не понадобится пароль в его первоначальной форме аутентификации. Одной из обычных и простых техник является использование криптографическая хэш-функция о пароле. Вы храните только хэш пароля в своей базе данных, вычисляете хэш пароля на основе ввода пользователя каждый раз, когда пользователь пытается аутентифицироваться, и сравниваете вновь вычисленное хэш-значение с хэш-значением, хранящимся в вашей базе данных. Хорошую хэш - функцию практически невозможно инвертировать, поэтому никто не может вычислить исходный пароль, даже имея полный доступ к базе данных.

Пожалуйста смотрите:
http://en.wikipedia.org/wiki/Cryptographic_hash_function[^].

Не используйте MD5 для какой-либо безопасности: этот алгоритм считается сломанным, пожалуйста, смотрите:
http://en.wikipedia.org/wiki/MD5[^].

Вместо этого вы можете использовать один из следующих способов: Безопасные Хэш-Алгоритмы (ША):
http://en.wikipedia.org/wiki/SHA2[^].

Классы, реализующие этот алгоритм, доступны в .NET:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx-файл[^].

Если вы хотите выполнить вычисление криптографической хэш-функции только в .NET, это означает, что только на стороне сервера, это означает, что исходный пароль все равно должен быть передан через сеть, чтобы шпион мог его забрать. Поэтому сохраненная аутентификация должна использовать только безопасный протокол HTTPS, а не HTTP.

Пожалуйста смотрите:
http://en.wikipedia.org/wiki/HTTPS[^].

—СА


Mohamed Mitwalli

5+

Sergey Alexandrovich Kryukov

Спасибо тебе, Мохаммед.
--СА