#asp.net #mysql
#asp.net #mysql
Вопрос:
я настроил редактор для ввода его содержимого в базу данных, а затем я могу повторно просмотреть, отредактировать его и сохранить снова, и вот что я использовал:
string user = Page.User.Identity.Name;
MySqlConnection conn = new MySqlConnection(@"connection string;");
MySqlCommand cmd = new MySqlCommand("UPDATE copy SET cv='" '"' Editor1.Content.Replace("'", "''") '"' "' WHERE id = '" user "' ", conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
вставка и выбор работают нормально, а обновление — нет, оно не выдает ошибок, но оно просто не изменяет содержимое (независимо от того, что я изменяю, оно всегда остается тем же содержимым);
я знаю, что это открыто для sql-инъекции, и я должен переключиться на параметризованный запрос, и я сделаю именно это после того, как все заработает
я использую asp.net 3.5, mysql 5.0
я определил проблему и задаю новый вопрос по ней спасибо всем за вашу помощь
Комментарии:
1. Ага… Чувствуем запах внедрения кода , не так ли?
2. пожалуйста, поставьте точку останова и скажите мне, является ли
Editor1.Content
обновленное значение, которое вы хотите, и сообщите мне значение `user`.3. @just_name я попробовал точку останова, и по какой-то причине содержимое редактора всегда пустое, хотя в нем есть содержимое
Ответ №1:
Не имеет значения, почему это не работает, это просто неправильно.
Вы широко открыты для атак с использованием SQL-инъекций, и это должно быть вашей первой заботой.
Вы исправляете это, используя вместо этого параметры, что-то вроде этого:
MySqlCommand cmd = new MySqlCommand("UPDATE copy SET cv=?cv WHERE id = ?id", conn);
cmd.Parameters.AddWithValue("cv", Editor1.Content);
cmd.Parameters.AddWithValue("id", user);
Комментарии:
1. спасибо, я на самом деле собираюсь переключиться на параметризованный запрос, но после того, как у меня все заработает
2. Вы на самом деле используете строку подключения, как показано? ie. внутри строки?
3. Почему бы вам не попробовать параметризованный способ сейчас и посмотреть, не поможет ли это также волшебным образом решить ваши проблемы?
4. нет, «строка подключения» заменена на фактическую, и она протестирована, и хорошо, я попробую
5. Вы получаете какие-либо ошибки, исключения, еще много чего? Кроме того, что возвращает ExecuteNonQuery? Он должен возвращать количество измененных строк. Возвращает ли он 0, или 1, или что?
Ответ №2:
ExecuteNonQuery должен возвращать количество выполненных строк, имея это в виду, вы можете отладить код. можете ли вы написать sql statment, который вы создаете, в string, чтобы мы могли вам помочь?
кроме того, первое, что приходит на ум, это то, что id = ‘user’ может быть неправильным, id предполагает целое число, но name выглядит как строковое значение.
Комментарии:
1. имя пользователя правильное, поскольку я использую его для извлечения содержимого из базы данных