2014-01-08 48 views
1

我在嘗試剝離AD中的域名時遇到錯誤。這是我的代碼:IndexOutOfRangeException:索引位於數組邊界之外

 string strAccount = HttpContext.Current.User.Identity.Name.ToString(); 
     string strUserName = strAccount.Split("\\\\".ToCharArray())[1]; 
     txtStrName.Text = strUserName; 

     string selectSQL = "SELECT sAMAccountName, mail FROM ActiveDirectories WHERE mail Is Not Null and sAMAccountName = '" + txtStrName.Text + "'"; 
     SqlConnection con = new SqlConnection(connString); 
     SqlCommand cmd = new SqlCommand(selectSQL, con); 
     SqlDataReader reader = default(SqlDataReader); 
     try 
     { 
      con.Open(); 
      reader = cmd.ExecuteReader(); 
      reader.Read(); 


      txtADName.Text = reader["sAMAccountName"].ToString(); 
      txtEmail.Text = reader["mail"].ToString(); 
     } 
     finally 
     { 
      reader.Close(); 
      con.Close(); 
     } 

這似乎是我在做拆分的地方。我無法弄清楚這一點。有人可以幫忙嗎?謝謝!!

+8

您有一個SQL注入漏洞。 – SLaks

+0

[漏洞利用](http://xkcd.com/327/) – Filburt

+0

我認爲你是對的,但我似乎無法弄清楚。通過看看我的代碼,你能看到我可能做錯的任何事情嗎?提醒你,這隻發生在IIS 7中。 – sshackles

回答

1

HttpContext.Current.User.Identity.Name可能不包含「\」char?

0

您可以訪問拆分中的第二項。你確定你不是指[0]? 你應該檢查它是否有任何元素。

var elements = strAccount.Split("\\\\".ToCharArray()); 
var strUserName = elements.Count() > 1 ? elements[1] : ""; 
2

爲什麼不只是"\\"而不是"\\\\"?它看起來像是在2個反斜線上分開,它應該只是一個。

此外,請確保在您嘗試處理第二個項目之前,結果數組中有多個項目。

0

假設你strAccount將始終保證看起來像「域\用戶」將拆分應該是這樣的:

string strUserName = strAccount.Split('\\')[1]; 

你可以簡寫通過檢查拆分所需的部分(如BartVG指出)使用Linq:

string strUserName = strAccount.Split('\\').Last(); 

如果它不包含預期的分隔符char,它將簡單地返回strAccount的值。

+0

我試過.Last,現在我只在IIS 7發佈時收到一個錯誤,指出無數據存在時無法讀取數據。我對IIS 7非常陌生,並且設置了SQL數據連接,所以我不知道我在做什麼錯誤。當我在本地進行調試時它工作正常,但發佈時我不斷收到數據未連接的錯誤。如果你能解決這個問題,請幫忙。 – sshackles

+0

@sshackles你正面臨一個與原來的問題不同的問題。據我可以看到你的代碼很可能你的數據庫查詢不會返回任何結果。繼續閱讀關於數據庫查詢的一些教程 - 只需指向'SqlDataReader'並點擊'F1',Visual Studio將帶您到MSDN的相關部分。 – Filburt

相關問題