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));
Другие вопросы по тегам