Member 14559674 Ответов: 1

Как вставить ответы пользователей в базу данных вместе с их идентификатором.


Я хочу сохранить имя пользователя, questionid и ответа, выбранного пользователем в базе данных. Я отобразил вопросы и параметры из базы данных на форме. Ниже приведен мой код до сих пор.у меня есть таблица с именем UserResponses в котором содержится идентификатор пользователя,questionid и ответы.
protected void Page_Load(object sender, EventArgs e) {  SqlConnection con = new SqlConnection(connecst);

        //Getting All Questions

        SqlDataAdapter dr = new SqlDataAdapter("select QId, Text from Questions", con);
        DataSet ds = new DataSet();
        dr.Fill(ds, "QId");
        DataList1.DataSource = ds.Tables["QId"];

        dr.Fill(ds, "Text"); 
        DataList1.DataSource = ds.Tables["Text"];

        DataList1.DataBind();


}

    protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {


            RadioButtonList RadioButtonList1 = (RadioButtonList)e.Item.FindControl("RadioButtonList1");
            //Get questionID here
            int QuestionID = Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "QId"));

            SqlConnection con = new SqlConnection(connecst);
            con.Open();

            sql = "SELECT ID,Answer FROM [Options] inner join Questions on " + "Questions.QId= Options.QID  where Questions.QId=" + QuestionID;
            //Bind the RadiobUttonList here  
            SqlDataAdapter da = new SqlDataAdapter(sql, con);
            DataSet ds = new DataSet();
            da.Fill(ds); DataTable dt = ds.Tables[0];
            RadioButtonList1.DataSource = dt;
            RadioButtonList1.DataTextField = dt.Columns[1].ToString();
            RadioButtonList1.DataValueField = dt.Columns[0].ToString();
            RadioButtonList1.DataBind();

        }
    }


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

private void SaveAnswer(int UId, int Qid, string ans)
       {
           foreach (ListItem item in RadioButtonList1.Items)
           {
               if (item.Selected)
               {

                   SqlConnection con = new SqlConnection(connecst);
                   SqlCommand cmd = new SqlCommand();
                   cmd.CommandType = System.Data.CommandType.StoredProcedure;
                   cmd.CommandText = "Insert into UserResponses values(@QuestionID,@Answer)";
                   //simple hiden field no repeater
                   cmd.Parameters.AddWithValue("@UserID", UId);
                   cmd.Parameters.AddWithValue("@QuestionID", Qid);
                   cmd.Parameters.AddWithValue("@Answer", ans);

                   cmd.Connection = con;
                   con.Open();
                   cmd.ExecuteNonQuery();

                   con.Close();

               }

           }

1 Ответов

Рейтинг:
0

Patrice T

Вы знаете, как делать запросы безопасными для SQL-инъекций:

cmd.CommandText = "Insert into UserResponses values(@QuestionID,@Answer)";

но вы все еще используете запросы, подверженные SQL-инъекции:
sql = "SELECT ID,Answer FROM [Options] inner join Questions on " + "Questions.QId= Options.QID  where Questions.QId=" + QuestionID;

Почему?

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


Richard Deeming

Что ж, технически этот запрос не является уязвимым, поскольку конкатенируемое значение является int Если пользователь попытается ввести SQL в значение, код упадет на экран . Convert.ToInt32 строчка выше.

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

Patrice T

Я согласен с вами, мое решение состоит в том, чтобы отговорить опа делать это, потому что рано или поздно он будет пойман с инъекцией.