2013-02-12 59 views
-1

大家好,我正在爲使用mvc4的另一個應用程序創建一個設置頁面。在設置頁面中:字符串在寫入數據庫時​​不能接受「's」

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(最大)

我的問題是當我在文本區域輸入撇號它給我錯誤。例如,如果我鍵入「世界的」它會給點擊提交按鈕時出錯。

這是錯誤:

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

請建議我能做些什麼來避免this.Any幫助將不勝感激。

+4

使用參數。不要(重複不要)通過字符串連接來建立你的查詢。參數化您的UPDATE語句將修復您的非轉義輸入,並確保沒有人可以將未經授權的SQL注入到您的代碼中。 – Matt 2013-02-12 11:03:25

回答

3

你的方法,使您的查詢sql injection攻擊。使用參數化查詢可以更好地解決您的'問題。

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

using (SqlConnection con = new SqlConnection(connString)) 
{ 
    SqlCommand cmd = new SqlCommand("Update dbo.Partner_Design " + 
            "Set [email protected], " + 
             "[email protected] " + 
            "Where [PartnerID][email protected]", con); 

    cmd.Parameters.AddWithValue("@pinfo1", model.PartnerInfo1); 
    cmd.Parameters.AddWithValue("@pinfo2", model.PartnerInfo2); 
    cmd.Parameters.AddWithValue("@partnerId", "cs"); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
} 
+0

如果我使用你的方法數據庫不更新。但如果我用我的方法它工作正常 – nitinvertigo 2013-02-12 11:32:31

+0

那有線,請查看此[MSDN](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx)示例。 – Kaf 2013-02-12 11:38:35

+0

我的意思是怪異的... – Kaf 2013-02-12 12:19:01

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 [email protected], [email protected] where [PartnerID]='cs'", con); 
cmd.Parameters.AddWithValue("@pinfo1", pinfo1); 
cmd.Parameters.AddWithValue("@pinfo2", pinfo2); 
+0

如果我使用你的方法,數據庫不會更新。但用我的方法它更新正常。 – nitinvertigo 2013-02-12 11:31:55

+0

@nitinvertigo:您仍然需要調用'cmd.ExecuteNonQuery()'來實際運行鍼對數據庫的查詢。然後它應該執行得很好... – 2013-02-12 11:59:10

+0

@ArjanEinbu我打電話cmd.ExecuteNonQuery()但仍然不更新 – nitinvertigo 2013-02-13 10:14:00

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注入攻擊。

+0

感謝你的代碼工作正常。但上面提出的防止注入攻擊的方法不會更新我的數據庫。使用我的代碼沒有問題。 – nitinvertigo 2013-02-12 11:34:14

+1

我仍然強烈建議找出爲什麼這些其他方法不能正常工作並堅持讓它們工作,否則你的代碼是一個等待發生的安全漏洞。 – Xefan 2013-02-12 11:44:41

+0

由Kaf提供的解決方案現在正在工作......所以我將他的答案標記爲正確。你的解決方案也很好,但我不能接受2個答案 – nitinvertigo 2013-02-13 11:17:46