如何防止我称之为“正则表达式注射”的东西?
我正在使用正则表达式来解析可能看起来像的字符串 - 其中一个示例 -
大小: 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 始终被视为文字,无论如何他们是。
答案 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的选项。