Member 14016038 Ответов: 2

Форма входа в систему не работает при вводе правильной информации


Привет! я новичок в .net и сталкиваюсь со следующей проблемой,в которой, когда я использую "Count (*)", я могу войти в систему, даже если я ничего не ввожу, а когда я использую только" * after select", я не могу войти в систему, даже если я предоставляю имя пользователя corrct и пароль heri-это мой код.

//код

private void button1_Click(object sender, EventArgs e)
      {
          SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Mohammad Fahad\Documents\data.mdf;Integrated Security=True;Connect Timeout=30");
          SqlDataAdapter sda = new SqlDataAdapter("SELECT Count(*) FROM login WHERE user='" + textBox1.Text + "' AND pass ='" + textBox3.Text + "'", con);
          DataTable dt = new DataTable();
          sda.Fill(dt);
          if (dt.Rows.Count > 0)
          {
              this.Hide();
              Main ss = new Main();
              ss.Show();
          }
          else {
              MessageBox.Show("Please Check your usernmae and password");
          }
      }


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

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

2 Ответов

Рейтинг:
1

ZurdoDev

Обратите внимание, что вы проверяете, есть ли какие-либо строки. SELECT COUNT(*) всегда возвращает строку.

То, как вы передаете имя пользователя и пароль, означает, что кто-то может взломать вашу БД, передав команды SQL. Вы должны использовать параметры, а также лучший способ-использовать оператор using. Что-то вроде

bool userIsValid = false;
using (SqlConnection sqlCon = new SqlConnection(connString)){
  sqlCon.Open();
  using (SqlCommand cmd = new SqlCommand("LoginUser", sqlCon)){
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@userid", txtUserId.Text);
    cmd.Parameters.AddWithValue("@password", txtPassword.Text);
    using (SqlDataReader dr = cmd.ExecuteReader()) {
      userIsValid = dr.HasRows;
    }
  }
}


А потом есть хранимая процедура что-то вроде
CREATE PROCEDURE LoginUser
(
  @userid    NVARCHAR (50)
  @password  NVARCHAR (50)
)
AS
BEGIN
  SELECT * FROM users WHERE userid = @userid AND password = @password COLLATE SQL_Latin1_General_CP1_CS_AS -- to make password case sensitive
END


И если это возможно, зашифруйте или даже хэшируйте поле пароля.


Member 14016038

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

ZurdoDev

Если вы используете COUNT так, как описано выше, он всегда будет регистрировать вас.

Member 14016038

ладно но теперь я убрал графа
а теперь код есть

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
Объект sqlconnection кон = новое sqlconnection(@"источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=С:\Пользователи\Мохаммад Фахад\документы\сведения.МДФ;Комплексная безопасность=true;в подключения таймаут=30");
SqlDataAdapter ПДД = новый SqlDataAdapter("Select * из входа в систему, где пользователь ='" + текстовое поле textbox1.Текст + "' и Pass ='" + textbox3 и.Текст + "'", кон);
DataTable dt = новый DataTable();
ПДД.Заполнить(ДТ);
если (ДТ.Строк.Count > 0)
{
этот.Скрыть();
Main ss = новый главный();
ПС.Показать();
}
еще {
Ящик для сообщений.Показать("пожалуйста, проверьте свой usernmae и пароль");
}
}

но теперь он не входит в систему даже у меня есть правильное имя пользователя и пароль

я могу отправить вам скриншоты на facebook или по электронной почте

ZurdoDev

1. я не верю, что вы на самом деле используете правильное имя пользователя и пароль.
2. то, как вы пишете код, неправильно, и я предлагаю вам использовать то, что я вам дал.
3. Отлаживать свой код. Обязательно откройте базу данных и проверьте, что это за данные. Мы не можем сделать отладку для вас.

Richard Deeming

- у меня нет проблем с безопасностью."

Неужели?

Попробуйте ввести следующие учетные данные:
Пользователь: ' or 1 = 1 --
Пароль: (все, что вам нравится)

Это позволяет вам войти в систему?

Теперь попробуйте эти учетные данные:
Пользователь: '; delete from login; --
Пароль: (не имеет значения)

Куда делись все ваши регистрационные записи?!


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Member 14016038

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

Richard Deeming

Сначала исправьте проблемы безопасности, особенно уязвимость SQL-инъекции.

В противном случае вам придется прыгать через множество обручей, чтобы исправить проблемы с вашими запросами, которые не были бы проблемой, если бы вы использовали параметры. :)

Member 14016038

я даже не прошу тебя отлаживать его
то, что я просил для предложения
а если я пишу код неправильно
вот почему я спрашиваю, какую ошибку я совершаю
и я проверил базу данных
пользователь ха Фахад хранится в нем и пароль ха Фахад хранится в нем

ZurdoDev

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

Member 14016038

я могу отправить вам скриншоты, если вы предоставите мне свой адрес электронной почты или идентификатор facebook

ZurdoDev

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

Member 14016038

хорошо и спасибо за ваше время

Рейтинг:
0

OriginalGriff

Две вещи, в дополнение к тому, что сказал 011111100010:
1) Никогда не объединяйте строки для построения 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

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


Member 14016038

ладно