Escape специальные символы в SQL INSERT INTO через C#
Я искал в Google и еще не нашел решения по моей проблеме. По сути, у меня есть лента комментариев, настроенная в галерее изображений (аналогично комментариям в facebook или stackru). Пользователи могут оставлять комментарии и читать комментарии других пользователей. Это работает нормально. Однако, если пользователь пытается опубликовать комментарий с апострофом, я получаю небольшую ошибку в веб-приложении:
Неверный синтаксис рядом с 's'. Незакрытая кавычка после символьной строки ')'.
Комментарий, который я публикую в SQL, относится к 81-му. Мне нужно решение, которое будет экранировать все специальные символы, чтобы все, что вводит пользователь, несмотря ни на что, не вызывало ошибок.
Код позади
Fetcher.postUserComments(connectionString, imagePath, comments.ToString(), userId);
Fetcher
sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES ('" + userId + "', '" + imagePath + "', '" + comments + "', '" + theDate + "')";
Тип данных - строка, и я также попытался сделать .ToString()
но не повезло. Заранее спасибо за любой полезный вклад.
3 ответа
Вы всегда должны использовать параметризованные запросы. Они помогают вам избежать ситуаций, подобных той, которая у вас есть, а также атак SQL-инъекций.
sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES (@userId, @imagePath, @userComments, @dateCommented)";
sqlCom.Parameters.AddWithValue("@userId", userId);
sqlCom.Parameters.AddWithValue("@imagePath", imagePath);
sqlCom.Parameters.AddWithValue("@userComments", comments);
sqlCom.Parameters.AddWithValue("@dateCommented", theDate);
Вам нужно продублировать символ 'в комментариях
comments = comments.Replace("'", "''");
В качестве альтернативы, но более безопасно, использовать параметр Sql, например:
cmd.CommandText = "SELECT * FROM Client, Project WHERE Client.ClientName = @ClientName AND Project.ProjectName = @ProjectName";
cmd.Parameters.Add(new SqlParameter("@ClientName",client.SelectedValue));
cmd.Parameters.Add(new SqlParameter("@ProjectName",projnametxt.Text));
Вы никогда не должны делать это... потому что это позволяет легко вводить SQL. Я мог бы вводить вредоносные запросы SQL через комментарий, что-то вроде...
;drop database master;
вместо этого используйте параметры, чтобы избежать внедрения SQL
command.Parameters.Add(new SqlParameter("@Param", value));