я uwant для ловли входа, который, кажется, похож на Внедрение SQL. Таким образом, я записал метод:
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;
}
Но кажется, что я сделал некоторые ошибки, потому что мой код не делает обнаруживает инжекции. Что я делаю неправильно? Я предполагаю, что существует что-то не так в определении выражений Regex?
Не попробуйте сделать это с помощью RegEx - слишком много способов обойти это. См. этот классический ответ SO о синтаксическом анализе с помощью RegEx - он специфичен для HTML, но все еще применим.
Вы должны использовать Параметры , они находятся в BCL и имеют встроенные меры защиты от SQL-инъекций.
Обновление: (следующие комментарии)
Если вам действительно необходимо проанализировать SQL , не используйте RegEx по причинам, указанным в связанной статье. 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, чтобы его обнаружить. Если вы включите его как часть процесса пост-сборки или если у вас есть командная система, установите правило, чтобы сборка провалилась, они скоро с ней повесятся.