在一些舊專案中,可能有些Sql仍然使用字串相加或是插值語法,這確實會造成不小的隱憂,如果沒有辦法改為參數化,那盡可能提升安全性的方式就是去檢查輸入的字串,以下紀錄。
/// <summary>
/// 檢查SQL非法字元
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public bool IsSafeSqlString(string input)
{
string[] riskTokens = new string[] { "--", ";--", ";", "/*", "*/", "@@",
"@", "char", "nchar", "varchar", "nvarchar",
"alter", "begin", "cast", "create", "cursor",
"declare", "delete", "drop", "end", "exec",
"execute", "fetch", "insert", "kill", "select",
"sys", "sysobjects", "syscolumns", "table",
"update" };
foreach (var token in riskTokens)
{
if (input?.ToLower()?.IndexOf(token, StringComparison.OrdinalIgnoreCase) != -1)
return false;
}
return true;
}