.NET 函数:检测 SQL 注入风险
以下是一个用 C# 编写的 .NET 函数,用于检测用户输入是否存在潜在的 SQL 注入风险:
using System;
using System.Text.RegularExpressions;public class SqlInjectionChecker
{// 常见 SQL 注入关键词和模式private static readonly string[] SqlKeywords = {"--", ";", "/*", "*/", "@@", "@", "char", "nchar", "varchar", "nvarchar","alter", "begin", "cast", "create", "cursor", "declare", "delete", "drop", "end", "exec", "execute", "fetch", "insert", "kill", "open", "select", "sys", "sysobjects", "syscolumns", "table", "update", "union", "where", "xp_"};// 检测输入是否可能包含 SQL 注入public static bool IsSqlInjectionRisk(string input){if (string.IsNullOrWhiteSpace(input)){return false;}// 检查 SQL 注释和语句分隔符if (input.Contains("--") || input.Contains(";") || input.Contains("/*") || input.Contains("*/")){return true;}// 检查常见 SQL 关键词(不区分大小写)foreach (var keyword in SqlKeywords){if (Regex.IsMatch(input, $@"\b{keyword}\b", RegexOptions.IgnoreCase)){return true;}}// 检查可疑的 SQL 表达式模式if (Regex.IsMatch(input, @"\bexec\s*\(|\bexecute\s*\(|\bselect\b.*\bfrom\b|\binsert\b.*\binto\b|\bdelete\b.*\bfrom\b|\bupdate\b.*\bset\b|\bdrop\b|\balter\b|\btruncate\b", RegexOptions.IgnoreCase)){return true;}// 检查可疑的字符串拼接模式if (Regex.IsMatch(input, @"['""]\s*\+\s*['""]|\bconcat\b", RegexOptions.IgnoreCase)){return true;}return false;}// 更严格的检测方法(可选)public static bool IsStrictSqlInjectionRisk(string input){if (string.IsNullOrWhiteSpace(input)){return false;}// 检查任何看起来像 SQL 语句的模式return Regex.IsMatch(input, @"\b(select|insert|update|delete|drop|alter|truncate|create|exec|execute|declare|fetch|open|close|union)\b.*\b(from|into|set|where|table|database|procedure|function)\b", RegexOptions.IgnoreCase);}
}
使用示例
string userInput = "admin'; DROP TABLE users;--";if (SqlInjectionChecker.IsSqlInjectionRisk(userInput))
{Console.WriteLine("警告:检测到可能的 SQL 注入风险!");// 在这里处理不安全输入,如拒绝请求或记录日志
}
else
{Console.WriteLine("输入看起来是安全的");// 继续处理
}
重要说明
- 这不是万无一失的解决方案:没有任何方法可以 100% 检测所有 SQL 注入攻击,此函数只能检测常见的注入模式。
- 最佳实践:
- 始终使用参数化查询(如
SqlCommand.Parameters
)而不是字符串拼接 - 实施最小权限原则,数据库用户只应有必要的最低权限
- 结合其他安全措施,如输入验证、输出编码等
- 始终使用参数化查询(如
- 误报可能性:此函数可能会产生误报(将合法输入标记为危险),特别是在处理包含技术术语的文本时。
- 性能考虑:对于高频或大数据量场景,可能需要优化正则表达式性能。
- 定期更新:随着新的 SQL 注入技术出现,需要定期更新检测模式。