2014-06-20 46 views
-2

是有什麼樣確保一個字符串不是一個SQL命令

CheckStringForSql(string); 

爲C#?

我知道我可以使用參數,但其中一個存儲過程使用sp_executeSQL和來自xml文檔的參數。所以理論上任何人都可以運行sql命令,如果他們知道把它們放在哪裏。

任何想法?

+3

然後這是一個***真的很糟糕的主意。 – TheNorthWes

+0

如果可能的話,我真的會真的很努力。儘可能多地限制sql /參數的數量 – Pseudonym

+0

我會以相反的方式來處理它,那麼該字段的有效輸入是什麼?它可以有分號嗎? SQL關鍵字?如果沒有,你可以檢查那些。據我所知,沒有內置功能。當然,一般來說這是一個糟糕的主意。 – BradleyDotNET

回答

4

避免SQL注入的正確方法是通過parameterized queries,它實際上編碼的任何值都不適合注入到要注入的SQL上下文中。

假設存在大量遺留代碼,您知道這些代碼很容易受到SQL注入攻擊,但您仍然可以嘗試在代碼的另一部分中檢查輸入中的可疑值。例如,默認ASP.NET tries to prevent javascript/HTML注入在每個請求上使用過濾器。

但是這種方法對於誤報是開放的,在這種情況下您拒絕完全合法的數據,因爲它看起來像是要注入攻擊。而且它不如使用最佳實踐編寫數據訪問代碼一樣可靠。

0

對於如何編寫避免SQL注入的安全代碼,存在數千個問題。一個瘋狂的數額blog posts甚至comics talking about this problem

長話短說,你不能做到這一點安全。您需要保護該XML文件,或者重寫您的代碼。任何人都不會建議你。

0

StriplingWarrior通過參數化的字符串得到了正確的結果。但作爲一個額外的安全級別,我認爲還可以根據白名單字符來檢查輸入字符串。你會做到這一點的檢查與正則表達式的用戶輸入,因爲這樣的:

public bool validateUserInputAgainstWhiteList(String pword) 
    { 

     // Gets only a string with letters of any size and any amount of numbers 
     var positiveIntRegex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9]*$"); 

     // if pword does not meet regular expression then return false 
     if (!positiveIntRegex.IsMatch(pword)) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 

如果你去到周圍的5:30分鐘標記在下面的視頻https://www.youtube.com/watch?v=8mSImYK3824

它有助於證明這一點。

相關問題