如何防止我称之为"正则表达式注入"?
我正在使用正则表达式来解析字符串,这些字符串可能看起来像-其中一个示例-
大小:, 数量: 20
编写一个正则表达式来捕获"10"one_answers"20"本身并不难。然而,"Size"one_answers"qty"是可定制的——用户可以选择其他单词代替。
所以我要做的是:
var pattern = String.Format(
@"{0}[ t]*(?<size>{1}|d*)[ t]*:[ t]*{2}:[ t]*(?<quantity>[d]*)",
sizeSign,
univerSizeAbbrev,
qtySign);
但是我如何"消毒"sizeSign, qtySign(或universzeabbrev)?
Regex不像SQL那样有过程参数(?),所以我如何确保,积极地确保sizeSign和qtySign始终被视为字面量,无论它们是什么
使用正则表达式。逃脱:
逃最小的一组字符 (, *, +, ?, |, {, [, (,), ^, $,., #和空格),将它们替换为它们的转义码。这指示正则表达式引擎按字面意思解释这些字符,而不是作为元字符。
确保包含:
using System.Text.RegularExpressions;
然后像这样转义变量:
sizeSign = Regex.Escape(sizeSign);
qtySign = Regex.Escape(qtySign);
如果允许您假设标识符只能由字母字符组成,这就变得容易了。用
分别测试一下str.Any(ch => ! Char.IsLetter(ch));
并拒绝任何返回false的选项