Как предотвратить «инъекцию регулярных выражений»? - PullRequest
5 голосов
/ 07 июля 2011

Как предотвратить то, что я бы назвал «инъекцией регулярных выражений»?

Я использую регулярные выражения для разбора строк, которые могут выглядеть - один из примеров -

Размер: 10, Кол-во: 20

Написание регулярного выражения для захвата "10" и "20" само по себе не сложно. «Размер» и «Кол-во», однако, можно настраивать - пользователь может вместо этого выбрать другие слова.

Итак, что я делаю:

var pattern = String.Format(
                    @"{0}[ \t]*(?<size>{1}|\d*)[ \t]*:[ \t]*{2}:[ \t]*(?<quantity>[\d]*)",
                    sizeSign,
                    univerSizeAbbrev,
                    qtySign);

Но как мне «санировать» sizeSign, qtySign (или, если на то пошло, univerSizeAbbrev)?

Regex не имеет параметров процедуры, как в SQL (?), Поэтому как мне убедиться в том, что sizeSign и qtySign всегда рассматриваются как литералы, какими бы они ни были .

Ответы [ 3 ]

9 голосов
/ 07 июля 2011

Использование Regex.Escape :

Экранирует минимальный набор символов (\, *, +,?, |, {, [, (,), ^, $,., # И пробел), заменяя их кодами перехода. Это указывает механизму регулярных выражений интерпретировать эти символы буквально, а не как метасимволы.

3 голосов
/ 07 июля 2011

Убедитесь, что вы включили:

using System.Text.RegularExpressions;

А затем экранируйте переменные следующим образом:

sizeSign = Regex.Escape(sizeSign);
qtySign = Regex.Escape(qtySign);
0 голосов
/ 07 июля 2011

Если вам разрешено предполагать, что идентификаторы могут состоять только из буквенных символов, это становится легко.Просто проверьте каждый с помощью

str.Any(ch => ! Char.IsLetter(ch));

и отклоните любые варианты, для которых это возвращает false.

...