2012-07-17 40 views
1

可能重複:
Will using LINQ to SQL help prevent SQL injectionLINQ和SQL注入

我使用LINQ來訪問SQL數據庫。下面的代碼是否安全?

var addRec = (from p in db.5544 
          where p.ID == newAddID 
          select p).Single(); 

      addRec.Address1 = comAddTxt1.Text;                    //create address record 
      addRec.Address2 = comAddTxt2.Text; 
      addRec.Address3 = comAddTxt3.Text; 
      addRec.Address4 = comAddTxt4.Text; 
      addRec.PostCode = pstCdeTxt.Text; 
      addRec.Town = twnTxt.Text; 
      addRec.County = cntyTxt.Text; 
      addRec.Country = cntComBox.SelectedItem.Text; 

      db.SubmitChanges(); 

感謝,

+4

確認!它*安全*。 – adatapost 2012-07-17 07:58:38

回答

10

是的,它從SQL注入攻擊是安全的。

不,它可能對其他形式的攻擊是不安全的,即:相關的跨站點腳本等。

+0

我將如何防範這些其他形式的攻擊? – 2012-07-17 08:08:24

+1

這取決於你的情況和你的應用程序,但一般來說,消毒和驗證你的輸入。 – podiluska 2012-07-17 08:11:30

1

爲了減少XSS的攻擊風險在Web應用程序的數據庫中檢索時,你應該的HTMLEncode數據。

+0

...如果這是一個web應用程序 – podiluska 2012-07-17 07:59:04

+0

...如果這是一個web應用程序;) – tutts 2012-07-17 08:00:05

+2

我想說數據庫應該包含實際的純文本,而不是與特定輸出格式綁定的編碼。如果您想要支持其他格式(例如PDF導出或類似格式),您就會頭疼。當然,除非輸出的所有編碼在應用程序中花費很長時間,並且您從不需要純文本。但在大多數情況下,這是不太可能的。 – Joey 2012-07-17 08:00:47

1

我建議嘗試調用一個存儲過程,並將值作爲參數發送,以便它可以爲您提供參數檢查。例如,如果將'@ Address1'聲明爲varchar(200),那麼如果該參數包含sql語句,存儲過程將不會執行。

您也可以在時間之前通過比較它與正則表達式來檢查字段,但這可能會花費更多的精力,並且不像使用存儲過程那樣安全。

+2

LINQ對於注射也是完全安全的;存儲過程對IMO沒有任何好處。 – 2012-07-17 08:03:32

+1

除了數據庫安全權限等 – podiluska 2012-07-17 08:09:45