2014-09-30 34 views
0

我正在計數AUTHORIZED_USERS表中登錄的用戶ID存在的實例的數量。我正在查找的值位於UNAME字段中,它是一個包含以下格式的字符串:COMPANYNAME \ 111222333。如果該值存在於表中,則表示該用戶有權訪問該應用程序/視圖。否則,他們會被重定向到拒絕訪問頁面。下面我的代碼是接近的工作,但提供了以下錯誤對條件的計數值

Incorrect syntax near '\601011307'. 

\ 601011307爲包含表UNAME領域的條目的一部分。它應該識別的全部價值是COMPANYNAME \ 601011307。

如何防止此錯誤並將計數值分配給變量,以便可以在條件中使用它?

public ActionResult HolidayDateTable() 
    { 
     string whoareyoupeople = User.Identity.Name.ToString(); 
     DateTime date = DateTime.Now; 
     string myerrorstring = "User " + whoareyoupeople + " attempted unauthorized access on " + date + "."; 
     SqlConnection conn = new SqlConnection("Data Source=SWDB10DSQL;Initial Catalog=BillingUI;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework"); 
     conn.Open(); 
     SqlCommand cmd = conn.CreateCommand(); 
     { 
      cmd.CommandText = string.Format("SELECT COUNT(*) FROM AUTHORIZED_USERS WHERE UNAME = "+whoareyoupeople+")"); 

      int count = (int)cmd.ExecuteScalar(); 

      if (count == 0) 
      { 
       return RedirectToAction("AccessDenied"); 
      } 
      else 
      { 
       return View(db.HOLIDAY_DATE_TABLE); 
      } 
     } 
     }   
+2

使用參數化查詢 – Steve 2014-09-30 21:18:43

+1

我在連接字符串中看到實體框架。你真的在你的應用程序中使用EF嗎?如果是這樣,有一種更清潔的方式來做到這一點與LINQ – SnareChops 2014-09-30 21:18:59

+1

如果你絕對不得不像這樣建立你的SQL,那麼你缺少用戶名參數周圍的引號。 – DavidG 2014-09-30 21:20:25

回答

7

你必須改掉正確的paranthesis,敷在單引號,如:

SELECT COUNT(*) FROM AUTHORIZED_USERS WHERE UNAME = '" + whoareyoupeople + "'"; 

但你應該真正使用sql參數來防止sql注入。

SELECT COUNT(*) FROM AUTHORIZED_USERS WHERE UNAME = @UNAME 
// ... 
cmd.Parameters.Add("@UNAME", SqlDbType.VarChar).Value = whoareyoupeople; 
1

你缺少引號括文字與字符串

cmd.CommandText = string.Format("SELECT COUNT(*) FROM AUTHORIZED_USERS WHERE UNAME = '"+whoareyoupeople+"'"); 
+0

添加引號解決了一個問題,但沒有解決Sql Injection – Steve 2014-09-30 21:22:52

+0

這取決於User.Identity.Name是否有被操作的風險。儘管我原則上同意僅使用SQL參數。 – 2014-09-30 21:27:35