制动器对正则表达式锚点的验证警告不足

时间:2017-09-21 20:26:32

标签: ruby-on-rails ruby regex ruby-on-rails-4 brakeman

我试图在这样的模型中实现验证。

validates_format_of :field, with: /[0-9]/, message: 'must have at least one number (0-9)'

Brakeman检测到这是一个Format Validation安全问题,它建议在正则表达式之间添加锚点。

  

'字段'的验证不足使用/ [0-9] /。使用\ A和\ z作为第54行附近的锚点

如果我添加这些锚点,正则表达式将停止工作,因此我不知道在这种情况下该怎么做。这是我使用rails c进行的测试。

"asdf1234".match(/\A[0-9]\z/) # => nil
"foobar1".match(/\A[0-9]\z/) # => nil

我需要在两种情况下返回#<MatchData "1">方法。

有什么想法吗? 感谢。

1 个答案:

答案 0 :(得分:1)

如果你需要匹配一个内部至少有1位数的字符串,以及之前和之后的任何其他字符,你可以使用

/\A[^0-9]*[0-9].*\z/m

或只是

/\A.*[0-9].*\z/m

<强>详情

  • \A - 字符串开头
  • [^0-9]* - 除ASCII数字以外的零个或多个字符
  • [0-9] - ASCII数字
  • .* - 任意0个字符,尽可能多,直到
  • \z - 字符串结束。

m修饰符使.匹配任何字符,包括换行符。

实际上,/\A.*[0-9].*\z/m会慢一点,因为第一个.*会一次抓取所有字符串,然后会回溯以找到最后一个数字。第一个更优化。