1

このようなモデルに検証を実装しようとしています。

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">どちらの場合もメソッドが戻る必要があります。

何か案は?ありがとう。

4

1 に答える 1

1

内部に少なくとも 1 桁の数字があり、前後に他の文字がある文字列に一致させる必要がある場合は、

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

あるいは単に

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

詳細

  • \A- 文字列の開始
  • [^0-9]*- ASCII 数字以外の 0 個以上の文字
  • [0-9]- ASCII 数字
  • .*- 任意の 0+ 文字、可能な限り多く、
  • \z- 文字列の終わり。

m修飾子は、.改行文字を含む任意の文字に一致させます。

実際には、最初はすべての文字列を一度に取得し、バックトラックして最後の桁を見つけるため/\A.*[0-9].*\z/m、少し遅くなります。.*最初のものはより最適化されています。

于 2017-09-21T20:31:09.907 に答える