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.