Rails 4 schützt Nutzer vor Regex-Schwachstellen

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.