Muhammad nur Ihsan Ответов: 2

C# visual studio с sqlconnection как это сделать?.


я новичок
я пытаюсь создать формы входа и регистрации с данными имени пользователя и пароля,хранящимися в localhost..
могу ли я получить пример, как это сделать.. спасибо

Что я уже пробовал:

я плохо умею кодировать
public partial class Login : Form
    {
		public Login()
        {
            InitializeComponent();
            txtPassword.PasswordChar = '*';
            txtPassword.MaxLength = 10;

        }

        MySqlConnection connection = new MySqlConnection("datasource=localhost;port=3307;Initial Catalog='dblogin';username=root;password=320139");
        MySqlDataAdapter adapter;
        DataTable table = new DataTable();

        private void btnLogin_Click(object sender, EventArgs e)
        {
            adapter = new MySqlDataAdapter("SELECT `username`, `password` FROM `users` WHERE `username` = '" + TxtUsername.Text + "' AND `password` = '" + txtPassword.Text + "'", connection);

            if (TxtUsername.Text == username)
            {
                if (txtPassword.Text == password)
                {
                    ListMeja lm = new ListMeja();
                    this.Hide();
                    lm.ShowDialog();
                }
                else
                {
                    MessageBox.Show("Username/password incorrect", "alert!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }


ошибка в этой строке
if (TxtUsername.Text == username)

Имя username не существует в текущем контексте

F-ES Sitecore

Каким, по-вашему, должно быть "имя пользователя"? Поле имени пользователя из базы данных? Все, что вы сделали, это создали MySqlDataAdapter, вы не выполнили запрос или не прочитали результаты, .net волшебным образом не знает, что он должен выполнить ваш запрос, и "имя пользователя" - это результат из первой строки этого запроса.

Вам нужно написать немного больше кода, Вы должны фактически выполнить запрос в адаптере, а затем прочитать результаты в переменную .net, которую затем можно использовать. Google MySqlDataAdapter, чтобы увидеть примеры того, как вы используете его для чтения данных.

2 Ответов

Рейтинг:
2

OriginalGriff

Нет. Не делай этого так!.
Во-первых: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
И сделать это с помощью логина? Это просто напрашивается на неприятности, так как любой может обойти вашу защиту логина, введя такое имя пользователя:
Admin';--


Во - вторых: никогда не храните пароли в открытом тексте- это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]

Третье: с какой стати вы сверяете имя пользователя с именем пользователя и пароль с паролем? Они даже не существуют, и вы вообще не используете результаты из БД.

Перестаньте гадать, что вы делаете, и читайте о БД и о том, как их использовать - это текстовое поле недостаточно велико, чтобы научить вас всему, что вам нужно знать, и вы, похоже, еще не поняли ничего из этого достаточно, чтобы взяться за проект.


Рейтинг:
0

Jochen Arndt

Вы должны выполнить SQL-запрос, хранящий результат. Поскольку запрос уже ограничивает результат совпадением имени пользователя и пароля, будет возвращена только одна строка или только одна строка при условии, что комбинация уникальна (что и должно быть). Таким образом, количество возвращаемых строк можно использовать для проверки правильности значений:

adapter = new MySqlDataAdapter("SELECT `username`, `password` FROM `users` WHERE `username` = '" + TxtUsername.Text + "' AND `password` = '" + txtPassword.Text + "'", connection);
DataSet dataset;
if (adapter.Fill(dataset) == 0)
{
    MessageBox.Show("Username/password incorrect", "alert!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
    // Valid data
}

Обратите внимание также, что ваш запрос склонен к SQL-инъекция - Википедия[^]. Никогда не создавайте SQL-команды путем конкатенации строк. Вместо этого используйте параметризованные запросы:
adapter = new MySqlDataAdapter("SELECT `username`, `password` FROM `users` WHERE `username` = @username AND `password` = @password", connection);
adapter.SelectCommand.Parameters.Add("@username", MySqlDbType.VarChar).Value = TxtUsername.Text;
adapter.SelectCommand.Parameters.Add("@password", MySqlDbType.VarChar).Value = TxtPassword.Text;
DataSet dataset;
int rows = adapter.Fill(dataset);