0 голосов
спросил от в категории Другие
Вы должны выполнить 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 }

Обратите внимание, что ваш запрос подвержен
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 }
# [1 ## ##]. Никогда не создавайте команды 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);

Пожалуйста, войдите или зарегистрируйтесь чтобы ответить на этот вопрос.

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

Когда вы объединяете строки, вы вызываете проблемы, потому что 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';
Совершенно корректный SELECT
DROP TABLE MyTable;
Совершенно корректная команда «удалить таблицу»
--'
И все остальное - комментарий.
Таким образом, он: выбирает любые соответствующие строки, удаляет таблицу из БД и игнорирует что-либо еще.

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


Во-вторых: никогда не храните пароли в ясном тексте - это серьезный риск для безопасности. Существует некоторая информация о том, как это сделать здесь:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
# [
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
#]

В-третьих: почему вы проверяете имя пользователя на имя пользователя , и пароль от пароля? Они даже не существуют, и вы вообще не используете результаты из базы данных.

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

Категории

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

Связанных вопросов не найдено

...