正则表达式网络安全

时间:2013-02-21 13:28:38

标签: regex security

我有一个成像库,它接受查询字符串参数来动态操作图像,我使用正则表达式来解析参数,以确定在传递的图像上运行哪些方法。

对于我所有的其他过滤器,我有非常严格的表达式,以确保处理器只会尝试对明确的模式匹配,但对于一种方法“水印”,表达式被分解为更小的部分,因为它太大而且太乱了玩它自己,因为每个可能的匹配是可选的。

我担心进行初始匹配的父级正则表达式watermark=[^&]*过于宽松,会让我受到XXS攻击。

最好的办法是什么?我应该只是咬紧牙关,创造一个大规模的表达,还是有更好的选择?

我正在解析的示例字符串:

yourimage水印=测试?|色FFF |尺寸-36 |风格斜体|不透明度-80 |位置30-150 |阴影真|字体Arial字体

我的表情:

/// <summary>
/// The regular expression to search strings for.
/// </summary>
private static readonly Regex QueryRegex = new Regex(@"watermark=[^&]*",
                                                     RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the text attribute.
/// </summary>
private static readonly Regex TextRegex = 
                                  new Regex(@"text-[^/:?#\[\]@!$&'()*%\|,;=]+",
                                            RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the position attribute.
/// </summary>
private static readonly Regex PositionRegex = new Regex(@"position-\d+-\d+",
                                                        RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the color attribute.
/// </summary>
private static readonly Regex ColorRegex = 
                                      new Regex(@"color-([0-9a-fA-F]{3}){1,2}",
                                                RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the fontsize attribute.
/// </summary>
private static readonly Regex FontSizeRegex = new Regex(@"size-\d{1,3}",
                                                        RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the fontstyle attribute.
/// </summary>
private static readonly Regex FontStyleRegex = 
                 new Regex(@"style-(bold|italic|regular|strikeout|underline)",
                           RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the font family attribute.
/// </summary>
private static readonly Regex FontFamilyRegex = 
                              new Regex(@"font-[^/:?#\[\]@!$&'()*%\|,;=0-9]+",
                                        RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the opacity attribute.
/// </summary>
private static readonly Regex OpacityRegex = 
                                new Regex(@"opacity-(?:100|[1-9]?[0-9])",
                                          RegexOptions.Compiled);

/// <summary>
/// The regular expression to search strings for the shadow attribute.
/// </summary>
private static readonly Regex ShadowRegex = new Regex(@"shadow-true",
                                                      RegexOptions.Compiled);

1 个答案:

答案 0 :(得分:2)

无论你使用一个正则表达式还是多个正则表达式都没关系。重要的是,在以可能导致漏洞的方式使用输入之前,请充分检查输入。只要您在以任何方式使用输入之前应用所有这些正则表达式,它就不会比在一步中完成所有操作更容易受到攻击。

在这种情况下,我认为多重正则表达式方法显然更优越。单个正则表达式将太复杂和混乱(特别是如果参数可以以可变顺序出现)。代码越清晰,出错就越不可能导致安全问题。

我没有看到你的正则表达本身存在任何错误,尽管我同意Capilé你应该积极地说明你想要允许的内容而不是禁止大量的特殊字符列表。

但最终的答案取决于它们在代码中的使用方式。