写入数据库时​​字符串不接受“s”

时间:2013-02-12 11:00:13

标签: sql asp.net-mvc type-conversion

大家好我正在使用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 ''.

请建议我可以采取哪些措施来避免这种情况。我们将不胜感激。

3 个答案:

答案 0 :(得分:4)

永远不要这样做 - 它不安全并允许sql injection

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);

答案 1 :(得分: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();
}

答案 2 :(得分: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ławomirRosiek和Kaf提出的解决方案更全面,更安全,并且是最佳实践。

您正在使用的方法会让您对SQL注入攻击持开放态度。