Дополнительная информация: выражение не булева типа, указанное в контексте, где ожидается условие, рядом с: - PullRequest
0 голосов
/ 20 апреля 2020

ребята, я пытаюсь выполнить эту страницу Multi-входа в систему и в c# wpf я новичок в программировании, и я следил за каждым шагом из каналов YouTube и не мог заставить его работать никакой помощи !!

private void button_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(@"Data Source=root**strong text**\SQLEXPRESS;Initial Catalog=Log-In;Integrated Security=True");
        SqlCommand cmd = new SqlCommand("select * from Login where username"+txt_usr.Text+"password"+txt_pass.Text+"", con);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        string cmbitemvalue = comboBox1.SelectedItem.ToString();
        if (dt.Rows.Count > 0)
        {
            for(int i = 0; i<dt.Rows.Count; i++)
            {
              if(dt.Rows[i]["usertype"].ToString()==cmbitemvalue)
                {
                    MessageBox.Show("you are login as " + dt.Rows[i][2]);
                    if (comboBox1.SelectedIndex == 0)
                    {
                        Admin aa = new Admin();
                            aa.Show();
                        this.Hide();
                    }else
                    {
                        Student ss = new Student();
                        ss.Show();
                        this.Hide();
                    }
                }
            }
        }

    }
}

}

1 Ответ

1 голос
/ 21 апреля 2020

Ваш SQL Запрос, который вы создаете, выглядит недействительным

Давайте сосредоточимся на части имени пользователя.

Я могу представить, что txt_usr.Text содержит имя пользователя, скажем, leo. Как вы это написали, это даст:

"select * from Login where username"+txt_usr.Text

, что:

select * from Login where usernameleo

(следовательно, причина ошибки, здесь нет условия, просто имя неверный столбец)

Правильный запрос выглядит следующим образом:

select * from Login where username='leo'

или этот

select * from Login where username="leo"

в зависимости от используемого типа базы данных (SQL Server, SQLite, MYSQL, Postgresql, et c ....).

Если вы хотите 2 условия, правильный синтаксис (обычно) должен использовать AND

select * from Login where username="leo" and password='secret'

Итак, вам не хватает знака равенства, логического И и правильной цитаты.

Это еще не все.

!!! Ваш запрос SQL уязвим для инъекции SQL, используйте. NET SQL Параметры !!!

obligatory XKCD illustration of SQL injection

иллюстрация : https://xkcd.com/327/

Вместо использования того, что пользователь вводит в текстовое поле (включая потенциальный вредоносный код), правильный способ сделать это в C# должен использовать SQL параметры .

Они позаботятся о санации ввода для вас, и это также будет более понятным в коде, и вам не нужно беспокоиться о цитате:

SqlCommand cmd = new SqlCommand("select * from Login where username=@username AND password=@password", con);
cmd.AddParameter('@username', txt_usr.Text);
cmd.AddParameter('@password', txt_pass.Text);

Даже если это домашнее задание, мы все видели слишком много взломанных сайтов / компаний и настолько легко уничтожаемых или украденных данных, потому что такая уязвимость стала возможной, я думаю, большинство db и эксперты по безопасности постоянно подчеркивают, что вам нужно учиться так быстро, и никогда не используйте неантифицированный ввод для sql запросов.

Другие соображения безопасности

Тот факт, что пароль кажется быть открытым текстом в базе данных также является источником беспокойства, пожалуйста, ищите «открытый текстовый пароль» и «правильно ha sh и соленые пароли», чтобы узнать больше об этом.

Но это немного больше работы, чтобы понять, чем SQL параметры и несколько строк дополнительного кода в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...