通过C#转义SQL INSERT INTO中的特殊字符
我搜索过谷歌,但尚未找到任何解决方案。 基本上我有一个在图库中设置的评论供稿(类似于facebook或stackoverflow评论)。 用户可以发表评论并阅读其他用户发布的评论。 这工作正常。 但是,如果用户尝试使用撇号发布评论,我会得到一个不错的小Web应用程序错误:
‘s’附近的语法不正确。 字符串’)’后面的未闭合引号。
我发布到SQL的评论是81。 我想要一个能够逃脱所有特殊字符的解决方案,这样无论用户输入什么,无论什么,都不会出错。
代码背后
Fetcher.postUserComments(connectionString, imagePath, comments.ToString(), userId);
提取程序
sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES ('" + userId + "', '" + imagePath + "', '" + comments + "', '" + theDate + "')";
数据类型是字符串,我也尝试过.ToString()
但没有运气。 提前感谢任何有用的输入。
您应该始终使用参数化查询。 它们可以帮助您避免使用您所拥有的情况以及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));