2016-11-16 32 views
-3

我在DNN PortalSecurity.cs中找到了這段代碼。這應該使輸入字符串sql注入安全。我想知道這段代碼是否可以清理用戶輸入,以便在非參數化查詢中安全使用,即可以防止SQL注入?你看到這裏有什麼問題嗎?此代碼可以使SQL注入變得不可能嗎?

private string FormatRemoveSQL(string strSQL) 
{ 
    const string BadStatementExpression = ";|--|create|drop|select|insert|delete|update|union|sp_|xp_|exec|/\\*.*\\*/|declare|waitfor|%|&"; 
    return Regex.Replace(strSQL, BadStatementExpression, " ", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace("'", "''"); 
} 
+12

爲什麼不參數化查詢? – adt

+1

爲什麼'select'是一個「糟糕的陳述」? '%'是一樣的嗎?看起來它太過分了,不能成爲一個「普通」的喧賓奪主。 –

+0

@mybirthname閱讀第一句。它從[DotNetNuke/PortalSecurity.cs](https://searchcode.com/codesearch/view/3358680/) –

回答

2

正在做的就是刪除共同的語言關鍵字。因爲這是足夠安全,它必須由供應商虔誠維護,所以從管理的角度來看,這是一場噩夢。

此外,我高度懷疑該列表包含所有潛在危險的關鍵字。它也可能會限制你輸入某些字符串的能力(儘管這可能是需要的)。但是,它可能會阻止偶然的黑客 - 想要。

我會稱之爲外行的方式,使輸入字符串有點安全。

+0

的確,在一般情況下,輸入過濾器無法阻止SQLi。這是不夠的保護,而攻擊者很有可能繞過它。它也是數據庫特有的,確切的攻擊取決於所使用的DBMS。 –