Member 14083059 Ответов: 3

Как решить эту проблему - в позиции 0 нет строки.


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


ошибка показывает эту строку-
username = ds.Tables[0].Rows[0]["Name"].ToString();
          repass = ds.Tables[0].Rows[0]["Re_password"].ToString();

Пожалуйста, кто-нибудь, помогите мне.Спасибо...
мой служит таблица базы данных-
id	numeric(18, 0)	Unchecked
Name	nvarchar(100)	Checked
Gender	nvarchar(MAX)	Checked
Contcats	nvarchar(100)	Checked
EmailId	nvarchar(100)	Checked
Address	nvarchar(MAX)	Checked
Password	nvarchar(50)	Checked
Re_password	nvarchar(50)	Checked
		Unchecked


где id-это первичный ключ и значение idtenification. в связи с этим я использую имя и Re_password coloumn для входа в систему

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

  protected void Button1_Click(object sender, EventArgs e)
        {
            String con = "Data Source=HOME-PC\\SQLEXPRESS;Initial Catalog=NoveltySystem;Integrated Security=True;Pooling=False";
            SqlConnection scon = new SqlConnection(con);
            String myquery = "select * from userSignup_db where Name='"+ uname.Text +"'";
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = myquery;
            cmd.Connection = scon;
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataSet ds = new DataSet();
            da.Fill(ds);
            String username;
            String repass;

            if (ds.Tables[0].Rows.Count > 0)
            {
            username = ds.Tables[0].Rows[0]["Name"].ToString();
            repass = ds.Tables[0].Rows[0]["Re_password"].ToString();
            scon.Close();
            if (username == uname.Text && repass == TextBox2.Text)
            {
                Session["Name"] = username;
            
               
                Response.Redirect("UserCPanel.aspx");
            }
            else
            {
                ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Please Check Your Login Details..')</script>");
            }
}
}

F-ES Sitecore

Используйте отладчик, чтобы узнать, сколько строк находится в ds.Таблицы[0].Строки

3 Ответов

Рейтинг:
25

Dave Kreskowiak

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

Там "нет строки в позиции 0", потому что в таблице нет данных.

Кроме того, никогда не создавайте SQL-запрос с помощью такой конкатенации строк. Всегда используйте параметры. Google для "SQL Inject Attack", чтобы узнать, почему то, что вы сделали, так плохо. Затем Google для "параметризованных запросов C#", чтобы узнать, что с этим делать.


Maciej Los

5ed!

Рейтинг:
2

Member 14083059

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

protected void Button1_Click(object sender, EventArgs e)
       {
           String constring = ConfigurationManager.ConnectionStrings["NoveltySystemConnectionString"].ConnectionString;

           SqlConnection  con = new SqlConnection(constring);
           str = "Select count(*) from userSignup_db where Name='" + uname.Text + "'and Re_password='" + repsw.Text + "'";
           cmd = new SqlCommand(str, con);
           cmd.Parameters.AddWithValue("Name",uname.Text);
           cmd.Parameters.AddWithValue("Re_password",repsw.Text);
           SqlDataAdapter sda = new SqlDataAdapter(cmd);
           DataTable dt = new DataTable();
           sda.Fill(dt);
           con.Open();
           cmd.ExecuteNonQuery();
           con.Close();
           if(dt.Rows.Count>0)

               {
                   Session["id"] = uname.Text;
                   Response.Redirect("UserCPanel.aspx");
                   Session.RemoveAll();
               }

               else
               {
                   ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Please Check Your Login Details..')</script>");
               }
           }


Richard Deeming

Значит, вы не читали ни одно из других решений? 🤦‍♂️

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

Вы храните пароли в виде обычного текста. Не делай этого:
Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

И почему вы заново изобретаете колесо? ASP.NET имеет несколько совершенно хороших встроенных систем аутентификации - например, Личность ASP.NET [^]

Рейтинг:
0

OriginalGriff

Проблема 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:
Никогда не храните пароли в открытом виде - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]

Задача 3:
Это тот самый случай, который вы заметили, и он самый тривиальный: никакие записи не соответствуют вашему запросу, поэтому строки не возвращаются. Отсутствие возвращенных строк означает, что вы получаете сообщение об ошибке "вы не можете использовать строку, которая не существует", что означает "в позиции 0 нет строки".

Но исправьте первые два в вашем приложении, или ваша БД будет тостом (и вы широко открыты для огромных штрафов за сбои GDPR).


Maciej Los

5ed!