Member 12679198 Ответов: 1

Я получаю эту ошибку...... когда я создаю веб-сайт для страницы регистрации


ошибка: System.Data.SqlClient.SqlException (0x80131904): неправильный синтаксис рядом с "france". в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThataningException .SqlClient.TdsParser.Run (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) при System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String имяМетод, булева асинхронный) при System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery ( Результат DbAsyncResult, String methodName, Boolean sendToPipe) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в Registrtion.Button1_Click (отправитель объекта, EventArgs e) в c: \ Users \ adcc \ Documents \ Visual Studio 2010 \ WebSitesk \ Regist. aspx.cs: строка 42

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

мой код

использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
использование системы.Сеть;
используя системы.Веб.ИП;
используя системы.Веб.Пользовательского интерфейса.WebControls;
используя системы.Данных.Поставщики sqlclient;
использование системы.Конфигурация;

общественный разделяемого класса Регистрация : системы.Веб.Пользовательского интерфейса.Страницы
{
protected void Page_Load(отправитель объекта, EventArgs e)
{
if (IsPostBack)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings ["ConnectionString"].Параметр connectionString);
против.Открыть();

Команда sqlcommand ком=новая команда sqlcommand( "выбрать количество(*) из данных, где имя пользователя='" + TextBoxun + "' и пароль='" + TextBoxpass + "'",кон);
int temp = конвертировать.ToInt32 (com. ExecuteScalar ().Метод toString());
если (temp==1)
{
Ответ.Write ("пользователь уже существует");
}
против.Закрывать();
}
}
охраняемых недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
пробовать
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings ["ConnectionString"].Параметр connectionString);
против.Открыть();

SqlCommand cmd = new SqlCommand ("вставить в userdata(username,passward,mobileno,emailid,country) значения('"+TextBoxun.Text+"','"+TextBoxpass+"','"+TextBoxmno+"', '" +TextBoxeid.Текст+"',' " + dropcountry.SelectedValue+"'", con);

/ * cmd.параметры.AddWithValue ("@uname", TextBoxun. Text);
УМК.Параметры.AddWithValue ("@passward", TextBoxpass.Текст );
УМК.Параметры.AddWithValue ("@mno", TextBoxmno.Текст );
УМК.Параметры.AddWithValue ("@email", TextBoxeid. Text);
УМК.Параметры.AddWithValue ("@ucountry", dropcountry.SelectedValue);*/
УМК.Метод executenonquery();
Ответ.Перенаправление ("Default. aspx");
Ответ.Напишите ("успешно зарегистрирован");
против.Закрывать();


}
поймать (исключение бывший)
{
Ответ.Write ("error:" + ex. ToString());
}
}
}

1 Ответов

Рейтинг:
1

Richard Deeming

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

Исправьте эту уязвимость, и вы также исправите ошибку:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
        using (SqlCommand com = new SqlCommand("select count(*) from userdata where username = @Username and passward = @Password",con)
        {
            com.Parameters.AddWithValue("@Username", TextBoxun.Text);
            com.Parameters.AddWithValue("@Password", TextBoxpass);
            
            con.Open();
            int temp = Convert.ToInt32(com.ExecuteScalar());
            if (temp == 1)
            {
                Response.Write("user already exists");
            }
        }
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    using (SqlCommand cmd = new SqlCommand("insert into userdata (username, passward, mobileno, emailid, country) values (@username, @password, @mobileno, @emailid, @country)", con))
    {
        cmd.Parameters.AddWithValue("@username", TextBoxun.Text);
        cmd.Parameters.AddWithValue("@password", TextBoxpass.Text);
        cmd.Parameters.AddWithValue("@mobileno", TextBoxmno.Text);
        cmd.Parameters.AddWithValue("@emailid", TextBoxeid.Text);
        cmd.Parameters.AddWithValue("@country", dropcountry.SelectedValue);
        
        con.Open();
        cmd.ExecuteNonQuery();
        Response.Redirect("Default.aspx");
    }
}


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

Было бы гораздо проще перестать изобретать велосипед и использовать одну из встроенных систем аутентификации:



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

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]