在C#中通过转义特殊字符来进行SQL INSERT INTO操作

7
我已经在谷歌上搜索了,但还没有找到解决我的问题的方法。基本上,我有一个评论反馈,它设置在图像库中(类似于Facebook或Stack Overflow评论)。用户可以发布评论并阅读其他用户发布的评论。这方面工作得很好。然而,如果用户尝试发布带撇号的评论,我会收到一个很好的网络应用程序错误:
“Incorrect syntax near 's'. Unclosed quotation mark after the character string ')'。”
我要发布到SQL的评论是81's。我想要一个解决方案,它将转义所有特殊字符,以便无论用户输入什么,都不会出错。
代码后端
Fetcher.postUserComments(connectionString, imagePath, comments.ToString(), userId);

抓取器

sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES ('" + userId + "', '" + imagePath + "', '" + comments + "', '" + theDate + "')";

数据类型是字符串,我也尝试过使用 .ToString() 但没有成功。非常感谢您提供的任何有帮助的意见。

1
不要这么做!你会打开自己遭受SQL注入攻击的风险。修改你的代码,使所有查询都被参数化处理。否则你将会后悔。 - Jim Mischel
3个回答

17

你应该始终使用参数化查询。它们可以帮助您避免像您遇到的这种情况,以及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);

谢谢您提供的信息和更正。现在一切都运作良好。 - frank billy

4
你需要在注释中将 ' 字符复制一次。
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));

那只是一个权宜之计。我将不得不为所有特殊字符做同样的处理。我正在寻找更加永久的解决方案。谢谢你的建议。不过,我需要更新问题以说明“所有特殊字符”。 - frank billy
“Like”有特殊字符。也许需要转义。 - Kiquenet

3

绝对不要这样做......因为它会导致易受SQL注入攻击。我可以通过评论注入恶意的SQL查询,例如...

 ;drop database master;

使用参数来避免SQL注入

command.Parameters.Add(new SqlParameter("@Param", value));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接