大家好我正在使用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 ''.
请建议我可以采取哪些措施来避免这种情况。我们将不胜感激。
答案 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注入攻击持开放态度。