OleDbException не было обработано пользовательским кодом в С#

Вот файл cs:

public int CheckExisting(String sqlDbQry, String sTable)
    {
        Qry = sqlDbQry;
        con = new OleDbConnection(connectionstr);
        if (con.State == ConnectionState.Open)
            con.Close();
        con.Open();
        cmd = new OleDbCommand(Qry, con);
        dr = cmd.ExecuteReader();
        while (dr.Read())
            rQry = Convert.ToInt32(dr[0].ToString());
        con.Close();
        return rQry;
    }

Вот еще мой кс:

protected void btnsub_Click(object sender, EventArgs e)
        {
            if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Email='" + Textemail.Text.Trim() + "'", "Temp") > 0)
            {
                lblmail.Text = "Your EmailId already Registered, Please Login!";
                return;
            }
            if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Phone_num='" + Textphone.Text.Trim() + "'", "Temp") > 0)
            {
                lblmail.Text = "Mobile number already exists, Please Login!";

                return;
            }
}

Когда я ввожу данные для ввода и нажимаю «Отправить», появляется примерно такая ошибка:

Вот ошибка Скриншот

Может ли кто-нибудь помочь мне исправить это?


person pcs    schedule 26.10.2015    source источник
comment
У вас есть уязвимость SQL-инъекции.   -  person SLaks    schedule 26.10.2015
comment
Я использую msaccess..   -  person pcs    schedule 26.10.2015
comment
У вас все еще есть уязвимость SQL-инъекции.   -  person SLaks    schedule 26.10.2015
comment
извините, я не могу понять..   -  person pcs    schedule 26.10.2015
comment
en.wikipedia.org/wiki/SQL_injection   -  person SLaks    schedule 26.10.2015
comment
Я не использую сервер sql, я создал базу данных в msaccess..   -  person pcs    schedule 26.10.2015
comment
Используйте try{} catch (OleDbException ex){} в своем коде, а затем попытайтесь найти уязвимость sql.   -  person MarcS    schedule 26.10.2015
comment
Я новичок в .net, не могли бы вы уточнить, где я могу добавить попытку и поймать? Благодарность   -  person pcs    schedule 26.10.2015
comment
1. попробуйте sql непосредственно в базе данных, чтобы увидеть, работает ли он. 2. Поместите try/catch вокруг ExecuteReader. 3. Детали исключения? На скриншоте не видно никаких подробностей.   -  person radarbob    schedule 26.10.2015
comment
Внедрение SQL применяется к любому оператору SQL; это не имеет ничего общего с SQL Server.   -  person SLaks    schedule 26.10.2015
comment
Итак, что я могу следовать вашим инструкциям ..   -  person pcs    schedule 26.10.2015
comment
Остановитесь и проведите небольшое исследование. Возможно, с этого можно начать   -  person radarbob    schedule 26.10.2015
comment
Да, есть проблема с SQL-инъекцией, но это второстепенно.   -  person radarbob    schedule 26.10.2015
comment
@radarbob: Этот снимок экрана может показать ошибку..   -  person pcs    schedule 26.10.2015
comment
@radarbob: я не могу понять, какую ссылку вы предоставили, пожалуйста, уточните... спасибо   -  person pcs    schedule 26.10.2015


Ответы (4)


Вы вручную создаете строку sql из текстового поля с надписью «электронная почта». Адреса электронной почты обычно содержат «@». Поскольку вы создаете необработанный SQL-запрос, вы помещаете «@» непосредственно в запрос. OleDb интерпретирует это как параметр SQL и ожидает, что вы предоставите его, а это не так, что и вызывает ошибку. Вы получите аналогичную ошибку, если какое-либо из ваших текстовых полей содержит ' (одинарную кавычку).

Вам следует изучить использование OleDbCommand и OleDbParameter для передачи ваших параметров вместо отправки необработанных строк. Это также устранит вашу уязвимость атаки SQL-инъекций, о которой упоминали другие.

person Bradley Uffner    schedule 26.10.2015

Я не могу отредактировать ваш пост, поэтому делаю это здесь.

public int CheckExisting(String sqlDbQry, String sTable)
{
    try
    {
        Qry = sqlDbQry;
        con = new OleDbConnection(connectionstr);
        if (con.State == ConnectionState.Open)
            con.Close();
        con.Open();
        cmd = new OleDbCommand(Qry, con);
        dr = cmd.ExecuteReader();
        while (dr.Read())
            rQry = Convert.ToInt32(dr[0].ToString());
        con.Close();
        return rQry;
    }
    catch (OleDbException ex)
    {
        string message = ex;
        //put your message on a texbox or alert handler error on the web
        //or while debugging use a breakpoint on the exception handler
        //use log
        Console.WriteLine(message);
    }
}
person MarcS    schedule 26.10.2015

Имейте в виду, что в OleDb параметры являются позиционными, а не именованными. Вы можете назвать свои параметры, но вы не можете использовать синтаксис @ в своей команде (он выдает ошибку о необходимости объявить скалярную переменную) ... правильный синтаксис - использовать ? ... и он будет принимать параметры в том порядке, в котором вы их добавили.

Кроме того, я предпочитаю синтаксис .AddWithValue, который, как мне кажется, даже более удобочитаем.

person Sagar Patel    schedule 26.10.2015

protected void btnsub_Click(object sender, EventArgs e)
    {
        if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Email='" + this.Textemail.Text.Trim() + "'", "Temp") > 0)
        {
            lblmail.Text = "Your EmailId already Registered, Please Login!";
            return;
        }
        if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Phone_num='" + this.Textphone.Text.Trim() + "'", "Temp") > 0)
        {
            lblmail.Text = "Mobile number already exists, Please Login!";

            return;
        }

}

Просто поместите this.Textemail.Text и this.Textphone.Text , надеюсь, это будет вам полезно.

person Sagar Patel    schedule 26.10.2015
comment
Он добавил this перед всеми ссылками на элементы управления, что ничего не делает, поскольку оно присутствует неявно. - person Bradley Uffner; 26.10.2015
comment
@BradleyUffner: все ответы мне не помогли, а твой ответ не могу понять .. потому что не понимаю .. :( - person pcs; 26.10.2015
comment
Я постараюсь сделать пример для вас - person Bradley Uffner; 26.10.2015