Member 12950401 Ответов: 2

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


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

когда я нажимаю кнопку входа в систему, система показывает ниже ошибку.

Неправильный синтаксис рядом с ','

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

SqlConnection con = новый SqlConnection();
против.Параметр ConnectionString = "Источник Данных=.\\именем sqlexpress;начальный каталог=college_education;идентификатор пользователя=СА;пароль=система;";
против.Открыть();
строки Q = "выбрать * из user_details где пользователь='" + текстовое поле textbox1.Текст + "', пароль='" + поле textbox2.Текст + "',user_type='"+textbox3 и.Текст+"'";
SqlCommand com = new SqlCommand(q, con);
SqlDataReader sdr = com.Метода executereader();
если (СДР.Читать())
{
Сеанс["пользователь"] = СДР["имя_пользователя"];
Session ["password"] = sdr ["password"];
Session ["user type"] = sdr ["user_type=1"];
Ответ.Перенаправление ("adminfilerecord. aspx");

Jon McKee

Я не вижу никаких очевидных проблем с первого взгляда. Какая строка вызывает эту ошибку? Вы сделали какую-нибудь отладку? Каковы были результаты? То есть очевидные проблемы, выходящие за рамки конкатенации SQL-запроса.

TextBox1.Text = "user123'; drop table user_details; --";

Member 12950401

ошибка отображается на нижней строке.

SqlDataReader sdr = com.Метода executereader();

Jon McKee

Помимо использования while вместо if (если это явно не то, что вы хотите) и то, что я упомянул выше, я честно не вижу проблемы с этим кодом. Я не вижу никаких проблем с вашим цитированием. Вы поставили точку останова в строке, которая выдает ошибку, и изучили, как выглядит SQL-запрос и связанные с ним объекты?

OriginalGriff

*кашель*
выберите * от user_details где имя_пользователя='Моеимя',='пароль Мойпароль', user_type='тип'

Допустимый SQL?
SQL-инъекция?
Текстовые пароли, хранящиеся в clear?

Jon McKee

Я уже упоминал SQL-инъекцию в своем первом ответе =P "user123'; drop table user_details; -- " =D Raw password storage я не упомянул, хотя. Также хороший момент о самом SQL, я совершенно упустил, что это была запятая, а не "и": thumbsup: я слишком привык к LINQ =(

2 Ответов

Рейтинг:
1

avinashkumar0509

использовать переключатель чехол и инструкция Break, как

строка пользовательского=СДР["user_type];

switch(userType)
{
    case "Admin":
          Response.Redirect("adminPage.aspx");
          break;
    case "GeneralUser":
          Response.Redirect("genUserPage.aspx");
          break;
    default:
          Response.Redirect("SomePage.aspx");
          break;
}


Рейтинг:
0

OriginalGriff

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

Во-вторых, ваш SQL-запрос-это мусор. Если я удалю текстовые поля и запишу их так, как они будут представлены SQL:

select * from user_details where user_name='MyName', password='MyPassword', user_type='MyType'
Это неверный синтаксис SQL: он встречается с первой запятой и говорит: "что это здесь делает?" Вероятно, вы хотели сказать, что:
select * from user_details where user_name='MyName' AND password='MyPassword' AND user_type='MyType'
Но даже тогда возникают проблемы: зачем вашим пользователям вводить "пользователь"," администратор " или что-то еще, чтобы войти в систему? Ваша система знает, каким классом им разрешено быть, поэтому извлеките это из БД, а не из пользователя.

В-третьих, вы храните пароли в открытом тексте. Это плохо, очень плохо: Криминальный Кодекс 1[^]- смотри сюда, это может помочь: Хранение паролей: как это сделать.[^]


Jon McKee

Очень хорошая мысль! Я совершенно пропустил запятую вместо "и". 5ed!