Rails 4 warnt seine Nutzer vor einer weit verbreiteten Sicherheitslücke, die durch falsche Anwendung von regulären Ausdrücken auftritt. So sind Validatoren wie der folgende nicht mehr erlaubt:
validates :phone, format: { with: /^[0-9]+$/ }
Dies wirft einen Argument-Error wie diesen:
`check_options_validity': The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option? (ArgumentError)
Hintergrund ist, dass reguläre Ausdrücke in Ruby von Haus aus mehrere Zeilen matchen:
"0123456789" =~ /^[0-9]+$/
=> 0
"0123456789<script>alert('42!');</script>" =~ /^[0-9]+$/
=> nil
# aber:
"0123456789\n<script>alert('42!');</script>" =~ /^[0-9]+$/
=> 0
Die Begrenzer ^ und $ matchen hier Zeilenanfang und -ende. In aller Regel will man jedoch Anfang und Ende des Gesamtstrings adressieren, wozu Ruby \A und \z bereitstellt:
"0123456789" =~ /\A[0-9]+\z/
=> 0
"0123456789\n<script>alert('42!');</script>" =~ /\A[0-9]+\z/
=> nil
Mit diesem Ausdruck läuft der obige Validator fehlerfrei durch.
Will man wirklich einzelne Zeilen validieren, kann man die obige Fehlermeldung mit der Option multiline: true deaktivieren.