是有什麼樣確保一個字符串不是一個SQL命令
CheckStringForSql(string);
爲C#?
我知道我可以使用參數,但其中一個存儲過程使用sp_executeSQL和來自xml文檔的參數。所以理論上任何人都可以運行sql命令,如果他們知道把它們放在哪裏。
任何想法?
是有什麼樣確保一個字符串不是一個SQL命令
CheckStringForSql(string);
爲C#?
我知道我可以使用參數,但其中一個存儲過程使用sp_executeSQL和來自xml文檔的參數。所以理論上任何人都可以運行sql命令,如果他們知道把它們放在哪裏。
任何想法?
避免SQL注入的正確方法是通過parameterized queries,它實際上編碼的任何值都不適合注入到要注入的SQL上下文中。
假設存在大量遺留代碼,您知道這些代碼很容易受到SQL注入攻擊,但您仍然可以嘗試在代碼的另一部分中檢查輸入中的可疑值。例如,默認ASP.NET tries to prevent javascript/HTML注入在每個請求上使用過濾器。
但是這種方法對於誤報是開放的,在這種情況下您拒絕完全合法的數據,因爲它看起來像是要注入攻擊。而且它不如使用最佳實踐編寫數據訪問代碼一樣可靠。
對於如何編寫避免SQL注入的安全代碼,存在數千個問題。一個瘋狂的數額blog posts甚至comics talking about this problem
長話短說,你不能做到這一點安全。您需要保護該XML文件,或者重寫您的代碼。任何人都不會建議你。
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
它有助於證明這一點。
然後這是一個***真的很糟糕的主意。 – TheNorthWes
如果可能的話,我真的會真的很努力。儘可能多地限制sql /參數的數量 – Pseudonym
我會以相反的方式來處理它,那麼該字段的有效輸入是什麼?它可以有分號嗎? SQL關鍵字?如果沒有,你可以檢查那些。據我所知,沒有內置功能。當然,一般來說這是一個糟糕的主意。 – BradleyDotNET