Member 12462239 Ответов: 2

Синтаксическая ошибка C# SQL при попытке вставить данные с помощью Microsoft access .mdb


static OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["dbProject"].ConnectionString);




Я получаю синтаксическую ошибку SQL при выполнении запроса.
public static void InsertLogins(User u)
      {
          conn.Open();
          OleDbCommand cmd = new OleDbCommand("Insert into tblLogin(Username,Password,CharPreset) values ('" + u.Username + "','" + u.Password + "','" + u.CharPreset + "')", conn);

          cmd.ExecuteNonQuery();

          conn.Close();

      }



Я могу читать из базы данных с помощью этого запроса
OleDbCommand cmd = new OleDbCommand("Select * From tblLogin", conn);


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

Все, что я мог придумать. Он работает при использовании SQL server но я хочу чтобы он работал с Microsoft Access

Richard MacCutchan

И, пожалуйста, не говорите нам, что вы храните пароли в открытом тексте.

Gerry Schmitz

Просто потому, что "select" работает, не означает, что "insert" будет.

"Жесткий код" вашей вставки, пока она не заработает; затем "параметризуйте" ее.

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Во-первых, Google для "атаки SQL-инъекций", чтобы выяснить, почему то, что вы делаете, так плохо.

Затем найдите в Google "параметризованные запросы C# sql", чтобы узнать, как решить эту проблему и с какой проблемой вы столкнулись.


Рейтинг:
1

Richard Deeming

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


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


Немедленное исправление уязвимости SQLi:

using (OleDbCommand cmd = new OleDbCommand("INSERT INTO tblLogin (Username, Password, CharPreset) VALUES (?, ?, ?)", conn))
{
    cmd.Parameters.AddWithValue("p0", u.Username);
    cmd.Parameters.AddWithValue("p1", u.Password);
    cmd.Parameters.AddWithValue("p2", u.CharPreset);
    
    cmd.ExecuteNonQuery();
}

Но не игнорируйте проблему хранения паролей!

Да, и хранение объекта соединения в static поле-это ужасная идея, особенно если это веб-приложение. Соединения не являются потокобезопасными, и если два запроса попадают одновременно, лучшее, на что вы можете надеяться,-это сбой.


Member 12462239

Эй сделал то, что вы сказали, и использовал свой код, но все равно получил синтаксическую ошибку при выполнении запроса. У меня такое чувство, что это потому, что я использую Microsoft Access