C# 用于在WinForms中检测SQL注入的正则表达式
我想要cach输入,这看起来像SQL注入。所以我写了这个方法:C# 用于在WinForms中检测SQL注入的正则表达式,c#,regex,sql-injection,C#,Regex,Sql Injection,我想要cach输入,这看起来像SQL注入。所以我写了这个方法: public static bool IsInjection(string inputText) { bool isInj = false; string regexForTypicalInj = @"/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix"; Regex reT = new Rege
public static bool IsInjection(string inputText)
{
bool isInj = false;
string regexForTypicalInj = @"/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix";
Regex reT = new Regex(regexForTypicalInj);
if (reT.IsMatch(inputText))
isInj = true;
string regexForUnion = @"/((\%27)|(\'))union/ix";
Regex reUn = new Regex(regexForUnion);
if (reUn.IsMatch(inputText))
isInj = true;
string regexForSelect = @"/((\%27)|(\'))select/ix";
Regex reS = new Regex(regexForSelect);
if (reS.IsMatch(inputText))
isInj = true;
string regexForInsert = @"/((\%27)|(\'))insert/ix";
Regex reI = new Regex(regexForInsert);
if (reI.IsMatch(inputText))
isInj = true;
string regexForUpdate = @"/((\%27)|(\'))update/ix";
Regex reU = new Regex(regexForUpdate);
if (reU.IsMatch(inputText))
isInj = true;
string regexForDelete = @"/((\%27)|(\'))delete/ix";
Regex reDel = new Regex(regexForDelete);
if (reDel.IsMatch(inputText))
isInj = true;
string regexForDrop = @"/((\%27)|(\'))drop/ix";
Regex reDr = new Regex(regexForDrop);
if (reDr.IsMatch(inputText))
isInj = true;
string regexForAlter = @"/((\%27)|(\'))alter/ix";
Regex reA = new Regex(regexForAlter);
if (reA.IsMatch(inputText))
isInj = true;
string regexForCreate = @"/((\%27)|(\'))create/ix";
Regex reC = new Regex(regexForCreate);
if (reC.IsMatch(inputText))
isInj = true;
return isInj;
}
但我似乎犯了一些错误,因为我的代码没有检测到注入。我做错了什么?我想在定义正则表达式时有些错误?不要试图用正则表达式来做这件事-有太多的方法可以解决这个问题。请参阅关于使用正则表达式解析的答案-它特定于HTML,但仍然适用 您应该使用,这些都在BCL中,并且内置了反SQL注入措施 更新:(以下评论) 如果您真的必须解析SQL,请不要出于链接文章中概述的原因使用正则表达式。RegEx不是解析器,不应作为解析器使用 使用SQL解析器-这将有助于清理尝试。这里是,这里是
你可以用这些继续你的科学研究。不要用字符串解析或正则表达式来处理这类事情。SQL语法太复杂,无法用正则表达式可靠地解析 相反,使用带占位符的参数化查询并避免字符串连接。这将从根本上击败SQL注入
var command = new SqlCommand(connection);
command.Text = "INSERT INTO foo (a, b, c) VALUES (@a, @b, @c)";
command.Parameters.AddWithValue("a", "this is invulnerable");
command.Parameters.AddWithValue("b", "to any sort of SQL injection");
command.Parameters.AddWithValue("c", "--'; DROP DATABASE");
command.ExecuteNonQuery();
如果您真的想帮助您的“经验不太丰富的程序员”,最好尝试检测他们何时在代码中执行内联sql。编写一个FxCop规则来发现它应该不会太难。如果您将其作为构建后流程的一部分,或者如果您有team system,则将规则设置为使构建失败,他们很快就会发现问题所在。SQL注入的问题是,用户输入被用作SQL语句的一部分。通过使用准备好的语句,可以强制将用户输入作为参数的内容处理(而不是作为SQL命令的一部分)。查询参数通过将文本值与SQL语法分离来帮助避免这种风险 大多数客户端API(包括.NET)支持查询的参数化。这允许将用户输入嵌入为参数。这些参数是用户输入值的占位符,在执行时会被替换。这样,用户就不能插入SQL代码,因为整个用户条目被视为参数的值,而不是附加到查询中的字符串
参数化是SQL注入攻击的最佳解决方案。首先不使用参数化查询的原因是什么?没错。参数化查询=已清理。玩正则表达式来做解析器的工作=疯狂。我这样做是为了调查(科学)目的。稍后,我的框架将用于开发win forms应用程序。其他开发人员通常是初学者,有时不使用参数。因此,首先我需要以某种方式在C#code中进行保护。@Vytas999-现在有一种方法可以在框架中使用隐藏的参数?在我看来,检测到有人正在使用字符串连接来构建SQL查询并报告在静态代码分析中可能存在的安全风险比尝试工作更有用我这样做是为了调查(科学)的目的。稍后,我的框架将用于开发win forms应用程序。其他开发人员通常是初学者,有时不使用参数。因此,首先我需要以某种方式在C#代码中进行保护。@Vytas999-根据您的评论,我已经更新了我的答案。