2012-01-10 51 views

回答

4

有幾件事你可以做。

  1. 開始的時候使用parameterized queries還是不錯的ORM
  2. 調查C# AntiXSS library
  3. Sanitize您的輸入。

preventing SQL Injection

閱讀了進一步閱讀

SQL注入大於您所詢問的部分。你想知道進出數據庫的所有數據。實施上述建議,你應該「相當」。

當涉及到原始問題(?id=[guid])的主題時,您希望在提交查詢時確保使用的數據類型爲System.Guid。如果string不是一個有效的GUID,那麼你知道有一個問題,你不應該完成請求(IE:甚至不發送請求到你的存儲庫以後,肯定不發送它就數據庫而言)。

0

聽起來像ID會是一個數字。如果這很容易 - 只需將內容轉換爲數字,然後使用此類型變量即可。如果內容中有其他內容,系統將只返回一個錯誤。

+0

同樣可以用'System.Guid'完成 – 2012-01-10 16:52:37

0

您應該做的第一件事是使SQL注入不可能。根據我的理解,這種方法不會導致SQL注入。這被稱爲「參數化輸入」。

string commandText = "UPDATE Sales.Store SET Demographics = @demographics " 
    + "WHERE CustomerID = @ID;"; 
SqlCommand command = new SqlCommand(commandText, connection); 
    command.Parameters.Add("@ID", SqlDbType.Int); 
    command.Parameters["@ID"].Value = customerID; 

    // Use AddWithValue to assign Demographics. 
    // SQL Server will implicitly convert strings into XML. 
    command.Parameters.AddWithValue("@demographics", demoXml); 

第二種方法是讓GUID不通過URL傳遞。這使得修改非常容易,因此您可能希望通過POST而不是GET來傳遞此值。這樣做不會防止SQL注入,但會使它更加困難,並且有助於確保數據的完整性。

的更多信息:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx

1

簡單。 始終清理輸入。切勿隱式信任或執行從外部來源(用戶,客戶端機器等)收到的內容。

對於GUID,請使用System.Guid數據類型而不是字符串。也就是說,在SQL查詢中使用它時,不要只將GUID的字符串表示形式連接到查詢中。使用query parameters並傳遞一個實際的System.Guid對象,該對象是從收到的字符串創建的。

如果在解析字符串時無法創建實際的System.Guid,則表示輸入無效。此時,您甚至不應該試圖以任何方式構建SQL查詢或使用數據訪問層,只需向用戶返回錯誤即可。

0

只是不要將ID查詢字符串參數中的值直接傳遞到數據庫中。

你正在使用C#,所以你可以使用查詢參數或類似的實體框架,這將確保數據格式正確的SQL Server(雖然它可能不檢查它是否是一個有效的GUID - 除非你的基礎字段或查詢類型勢力)

有關SQL注入攻擊的詳細信息,這裏是一個文章,我幾年前寫的:http://colinmackay.co.uk/blog/2005/04/23/sql-injection-attacks-and-some-tips-on-how-to-prevent-them/