如何防止“正则表达注射”?

时间:2011-07-07 08:36:37

标签: c# regex user-input code-injection sanitization

如何防止我称之为“正则表达式注射”的东西?

我正在使用正则表达式来解析可能看起来像的字符串 - 其中一个示例 -

  

大小: 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 个答案:

答案 0 :(得分:9)

使用Regex.Escape

  

通过将其替换为转义码来转义一组最小字符(\,*,+,?,|,{,[,(,),^,$ ,.,#和空格)。这指示正则表达式引擎按字面解释这些字符而不是元字符。

答案 1 :(得分:3)

确保包括:

using System.Text.RegularExpressions;

然后逃避这样的变量:

sizeSign = Regex.Escape(sizeSign);
qtySign = Regex.Escape(qtySign);

答案 2 :(得分:0)

如果允许您认为标识符只能包含字母字符,这就变得很容易了。只需用

测试每个
str.Any(ch => ! Char.IsLetter(ch));

并拒绝任何返回false的选项。