使用正则表达式指定浮点范围

时间:2013-09-17 10:00:22

标签: regex mod-security

我需要一个正则表达式来检查特定参数是否在浮点范围内。例如,我希望Param仅在0.01到999.9范围内。我已经配置了以下规则,但它无法正常工作。

SecRule ARGS:Param "![0.01-999.9]" "deny,id:2200"

如果param的值为1000,则会被拒绝,这是正确的,如果Param的值为0,那么它将被接受,但情况并非如此。请让我知道确切的为其配置正则表达式的方法。

2 个答案:

答案 0 :(得分:1)

这听起来像是一个商业逻辑规则 - 应该在服务器逻辑中完成,而不是mod_security,但无论如何:

范围[0..999.9]中的浮点数是

的数字
  • 以可选的零序列开始(您可能允许或不允许)
  • 后跟最多三位数字,其中第一位数字不为零
  • 可选地后跟一个点,只有数字(你可能要求至少有一个数字,最后一个数字为非零)
  • 除了以999.9开头的数字和所谓的可选零
  • 之外的数字
  • 除了999.9本身是允许的(如果范围是从右边开始)

限制性最小的变体,编译成正则表达式:

^0*(?:(?!999\.9\d*$)\d{0,3}(?:\.\d*)?|999\.0*)$
  • ^ - 字符串的开头(不确定它是否由mod-security添加)
  • 0* - 0-n zeroes
  • (?:...) - 非捕获组
    • (?!...) - 如果没有跟着......
      • 999.\9 - 文字999.9
      • \d* - 0位数和
      • $ - 字符串
      • 的结尾
    • \d - 数字
    • {0,3} - 零至三次
    • (?:...) - 非捕获组
      • \. - 文字.
      • \d* - 0-n位数
    • ? - 可选
    • | - 或
    • 999\.9 - 999.9本身
    • 0* - 可选的零
  • $ - 字符串
  • 的结尾

答案 1 :(得分:1)

(^0\.0?[1-9]\d*|^[1-9]{1,3}\.\d+)

第一个匹配替代方案将所需数字与较小的一个匹配,第二个匹配为一个或更大但小于一千个。不匹配不包含点的数字,并且匹配999.999之类的数字,但只有小于1000的数字(这就是我想要的)。