如何防止"正则表达注射"?

Kon*_*ski 6 c# regex sanitization user-input code-injection

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

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

大小: 10,数量: 20

编写正则表达式以捕获"10"和"20"本身并不难.但是,"大小"和"数量"是可自定义的 - 用户可以选择其他一些单词.

所以我做的是:

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

但是我如何'清理'sizeSign,qtySign(或者univerSizeAbbrev)呢?

正则表达式没有像SQL那样的过程参数(?),所以我如何确保sizeSignqtySign始终被视为文字,无论它们是什么.

spe*_*der 10

使用Regex.Escape:

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