2011-07-23 93 views
2

此代碼是否安全的SQL注入?爲什麼?此代碼是否安全的SQL注入? (以及爲什麼)

public void AddPlayer(string username) 
    { 
     var query = "INSERT INTO dbo.Player(Username, RegisterDate) VALUES(@Username, @RegisterDate)"; 
     using (var connection = new SqlConnection(connectionString)) 
     using (var command = new SqlCommand(query, connection)) 
     { 
      command.Parameters.AddWithValue("@Username", username); 
      command.Parameters.AddWithValue("@RegisterDate", DateTime.Now); 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 
    } 

    public DateTime GetRegisterDate(string username) 
    { 
     var query = "SELECT RegisterDate FROM dbo.Player WHERE Username = @Username"; 
     using (var connection = new SqlConnection(connectionString)) 
     using (var command = new SqlCommand(query, connection)) 
     { 
      command.Parameters.AddWithValue("@Username", username); 
      command.Connection.Open(); 
      return (DateTime)command.ExecuteScalar(); 
     } 
    } 

編輯:能否注射安全的等效代碼使用存儲過程寫?如果是這樣,存儲過程會是什麼樣子?

回答

9

是的,它看起來很安全。

因爲它使用參數。當您使用存儲過程你總是使用參數,使他們安全過一個

當你創建了
baseQueryText + " WHERE Username =" + TextBox.Text;

Reguarding編輯查詢您運行的SQL注入的風險。不需要特別的努力,但您仍然可以/應該過濾傳入的數據。

+0

+1。構建易受攻擊的存儲過程是可能的,但使用像你所說的參數仍然是安全的。 @asmo:您應該能夠或多或少地將現有代碼複製到存儲過程中。 – Eric

+0

非常感謝你們兩位! – asmo

6

是的。您正在使用參數化查詢,通常認爲這對SQL注入來說是安全的。

無論如何,您仍然可能會考慮過濾您的輸入。

+0

你*** ***想繼續過濾。畢竟當查詢「'不太可能找到播放器時,發回到用戶界面(假設網絡在這裏)...... – Richard

+0

正確的,但這不是SQL注入,但腳本注入。處理它的正確方法是視圖中的HtmlEncoding。並不是說它會限制用戶名。 –

4

是的,所有非靜態數據都是通過綁定參數輸入的。

相關問題