-1

大家好,我正在使用 mvc4 为另一个应用程序创建一个设置页面。在设置页面中:

1.它包含两个文本区域,用户可以在其中输入任何内容。

2.如果用户点击提交按钮,输入后,他写的文本被保存在一个sql数据库中。

3.主应用程序将从数据库中读取该数据并显示它。

以下是我各自的代码:

模型:

 public string PartnerInfo1 { get; set; }
 public string PartnerInfo2 { get; set; }

控制器:

[HttpPost]
        public ActionResult Index(AddDetailModel model)
        {
            pinfo1 = model.PartnerInfo1;
            pinfo2 = model.PartnerInfo2;
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Sample"].ConnectionString);
            con.Open();
            SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1='" + pinfo1 + "',PartnerInfo2='" + pinfo2 + "' where [PartnerID]='cs'", con);
            cmd.ExecuteNonQuery();
            return RedirectToAction("Index");
        }

在视图中:

 @Html.TextAreaFor(m => m.PartnerInfo1)
@Html.TextAreaFor(m => m.PartnerInfo2)

在数据库中,对应的表包含两列PartnerInfo1,PartnerInfo2 ,它们的数据类型是nvarchar(max)

我的问题是当我在文本区域中输入撇号时,它给了我错误。例如,如果我输入“world's”,它会在单击提交按钮时出错。

这是错误:

Incorrect syntax near 's'.
Unclosed quotation mark after the character string ''.

请建议我可以做些什么来避免这种情况。任何帮助将不胜感激。

4

3 回答 3

4

永远不要那样做 - 这是不安全的,并且允许进行sql 注入

SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1='" + pinfo1 + "',PartnerInfo2='" + pinfo2 + "' where [PartnerID]='cs'", con);

而不是使用以下参数语法:

SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1=@pinfo1, PartnerInfo2=@pinfo2 where [PartnerID]='cs'", con);
cmd.Parameters.AddWithValue("@pinfo1", pinfo1);
cmd.Parameters.AddWithValue("@pinfo2", pinfo2);
于 2013-02-12T11:05:45.200 回答
3

您的方法将您的查询暴露给sql injection攻击。使用参数化查询会更好,它也可以解决您的'问题。

string connString = ConfigurationManager.ConnectionStrings["Sample"].ConnectionString;

using (SqlConnection con = new SqlConnection(connString))
{
   SqlCommand cmd = new SqlCommand("Update dbo.Partner_Design " +
                                    "Set PartnerInfo1=@pinfo1, " +
                                        "PartnerInfo2=@pinfo2 " +
                                    "Where [PartnerID]=@partnerId", con);

   cmd.Parameters.AddWithValue("@pinfo1", model.PartnerInfo1);
   cmd.Parameters.AddWithValue("@pinfo2", model.PartnerInfo2);
   cmd.Parameters.AddWithValue("@partnerId", "cs");
   con.Open();
   cmd.ExecuteNonQuery();
}
于 2013-02-12T11:10:06.500 回答
1

您可以通过在单引号前面加上另一个单引号来转义单引号,这需要在将字符串添加到查询之前对字符串进行替换,即:

pinfo1 = pinfo1.Replace("'", "''");
pinfo2 = pinfo2.Replace("'", "''");
SqlCommand cmd = new SqlCommand("update dbo.Partner_Design set PartnerInfo1='" + pinfo1 + "',PartnerInfo2='" + pinfo2 + "' where [PartnerID]='cs'", con);

但是,我强烈建议不要这样做,并听取其他响应的建议,而不是使用更安全的参数化 SQL。另请注意,此解决方案只会解决您的单引号问题,并且仍会导致其他需要单独转义的特殊字符出现问题。因此,虽然这应该回答您的问题,但 Sławomir Rosiek 和 Kaf 提出的解决方案更全面、更安全,并且是最佳实践。

您使用的方法使您容易受到 SQL 注入攻击。

于 2013-02-12T11:13:00.830 回答