rezaeti Ответов: 5

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


всем привет. у меня есть 3-уровневая архитектура asp.net
я хочу выбрать свои данные и проверить их на логин.
но


мой код дал :

public DataTable findrecords(string UserName)

       {
               connect.Open();
               SqlCommand cmd = new SqlCommand("Select * from UserInfo where UserName= '" + UserName + "'", connect);
               DataTable dt = new DataTable();
               SqlDataAdapter sda = new SqlDataAdapter(cmd);
               sda.Fill(dt);
               return dt;
       }


и BLL код:
public void selectRecords()
       {
           da.findrecords(UserName);

       }


или :
cmd.Parameters.AddWithValue("@UserName", UserName);
            da.findrecords(UserName);


и мой отделенного кода:
bll.UserName = UserNameTextBox.Text;
bll.selectRecords();
if (bll.UserTyp == 0)
{
    Session.Add("Msg_", "user you are un active");
    Response.Redirect("~/ShowMessage.aspx");
}
else
    if (bll.UserTyp == 1)
    {
        Response.Redirect("~/index.aspx");
    }


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

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

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

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

public DataTable findrecords(string UserName)
{
    using (SqlCommand cmd = new SqlCommand("Select * from UserInfo where UserName= @UserName", connect))
    {
        cmd.Parameters.AddWithValue("@UserName", UserName);
        
        DataTable dt = new DataTable();
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        sda.Fill(dt);
        return dt;
    }
}

5 Ответов

Рейтинг:
2

Dave Kreskowiak

Итак, вы вызываете хранимую процедуру в базе данных под названием "tbl_User_SelectRow", которая ожидает передачи параметра под названием "@UserName". Ваш код не предоставляет этот параметр.

Быстрый Гугл для "Параметризованный запрос C# sql[^] "имеет тонны информации о том, как это сделать.


Рейтинг:
1

Graeme_Grant

Бизнес-логика обычно проверяется перед отправкой в БД.:

if (!string.IsNullOrEmpty(UserNameTextBox.Text)
{
    bll.UserName = UserNameTextBox.Text;
    bll.bl_bind();
    if (bll.UserTyp == 0)
    {
        Response.Redirect("~/ShowMessage.aspx");
    }
else
{
   // handle invalid (empty) username...
}


rezaeti

привет, спасибо за ответ.

[код удален]

но почему это не работает ? ошибка заключается в следующем :
Ошибка 1 отсутствие перегрузки для метода 'SelectDataUser' принимает 1 аргумент

Graeme_Grant

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

Чтобы ответить на этот вопрос, это синтаксическая ошибка - вы неправильно вызываете функцию с правильными параметрами.

Рейтинг:
0

Patrice T

SqlCommand cmd = new SqlCommand("Select * from UserInfo where UserName= '" + UserName + "'", connect);

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]


Рейтинг:
0

Karthik_Mahalingam

Вы будете иметь, чтобы проверить UserName для null значения, прежде чем использовать их

cmd.Parameters.AddWithValue("@UserName", UserName);

или же измените свою процедуру, чтобы принять null ценности
@UserName nvarchar(x) = null,


Karthik_Mahalingam

вы не передаете никаких параметров в коде

rezaeti

УМК.Параметры.AddWithValue ("@UserName", Имя Пользователя);
да.selectDataUser(УМК);

но ошибка в : (bl_bind ()) показана.
Ошибка: 'BLL. bllUsers. bl_bind ()': не все пути кода возвращают значение

Dave Kreskowiak

Основываясь на приведенном выше коде, почему вы передаете объект SqlCommand в метод selectDataUser? Он должен создавать свою собственную SqlCommand.

Почему вы не передаете пользователя, что бы это ни было, чтобы метод selectDataUser мог создать сам параметр?

Почему вы добавляете параметр в бизнес-слой вместо уровня данных?

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

rezaeti

Привет, Дэйв Кресковяк .

На самом деле у меня был этот код:
DataTable dt = новый DataTable();
SqlDataAdapter da = new SqlDataAdapter ("select * from UserInfo where UserName=@UserName", connect);
да.Команды selectcommand.Параметры.AddWithValue ("@UserName", UserNameTextBox. Text);
да.Команды selectcommand.CommandTimeout = 0;
да.Заполнить(ДТ);
если (ДТ.Строк.Count = = 0)
{

}
Я хочу знать, как сделать 3-слойную архитектуру для этого кода
Я не знаю, как я могу da. Fill (dt) использовать уровень данных и бизнес-уровень ?
спасибо. можешь ли ты выучить его у меня?..

Karthik_Mahalingam

это означает, что вы не возвращаете значение
опубликуйте свой код метода.

rezaeti

привет Картик

На самом деле у меня был этот код:
DataTable dt = новый DataTable();
SqlDataAdapter da = new SqlDataAdapter ("select * from UserInfo where UserName=@UserName", connect);
да.Команды selectcommand.Параметры.AddWithValue ("@UserName", UserNameTextBox. Text);
да.Команды selectcommand.CommandTimeout = 0;
да.Заполнить(ДТ);
если (ДТ.Строк.Count = = 0)
{

}
Я хочу знать, как сделать 3-слойную архитектуру для этого кода
Я не знаю, как я могу da. Fill (dt) использовать уровень данных и бизнес-уровень ?
спасибо. можешь ли ты выучить его у меня?..

rezaeti

Привет, Дэйв Кресковяк .

На самом деле у меня был этот код:
DataTable dt = новый DataTable();
SqlDataAdapter da = new SqlDataAdapter ("select * from UserInfo where UserName=@UserName", connect);
да.Команды selectcommand.Параметры.AddWithValue ("@UserName", UserNameTextBox. Text);
да.Команды selectcommand.CommandTimeout = 0;
да.Заполнить(ДТ);
если (ДТ.Строк.Count = = 0)
{

}
Я хочу знать, как сделать 3-слойную архитектуру для этого кода

Dave Kreskowiak

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

Он не должен проверять количество строк. Это бизнес-правило.

Рейтинг:
0

Member 13390764

вы можете использовать IAthourizationFilter mvc для решения этой проблемы