Sicherheit - Ein Gedanke der sich durch alle Kundenschichten hindurchzieht
Heutzutage denken viele Kunden über verschiedene Sicherheitsaspekte in ihren Online-Shops nach und kommen zu dem Schluss, dass hier dringend etwas getan werden muss. Natürlich sind diese Sicherheitsaspekte auf ein Spektrum konzentriert, das sich oft mit dem Frontend beschäftigt und weniger mit serverseitigen Prozessen. Genau aus diesem Anlass kam mir kürzlich eine Kundenanfrage auf den Tisch, in der darum gebeten wurde im Rahmen der EHI-Zertifizierung, verschärfte Vorgaben für Kundenpasswörter umzusetzen.
Während dieser Arbeit habe ich mich verstärkt mit Magentos Formularverifizierungen auseinandergesetzt und möchte das hier ein wenig ausbreiten.
Really Easy Field Validation
Magento benutzt für die Validierung von Formularen validation.js - diese Bibliothek entstammt dem Projekt Really Easy Field Validation (im Folgenden REFV genannt). Diese Bibliothek ist in der Lage, über CSS-Selektoren Formularfelder nach bestimmten Regeln zu validieren. Diese Regeln können dynamisch erweitert oder ersetzt werden und bieten damit die ideale Grundlage, die Regeln für Passwörter oder beispielsweise Benutzernamen anzupassen, bevor diese an Magento geschickt werden.
Um die eingangs erwähnte Problemstellung zu lösen, habe ich eine kleine Extension erstellt, die die bestehende Passwort-Validierung auf den customer/account/create-Seiten überschreibt und mit einem RegExp auf etwas aufwändigere Regeln prüft.
- Nicht nur Buchstaben, auch Sonderzeichen und Ziffern müssen verwendet werden
- Die Zeichenfolge des Passwortes darf nicht gleich dem Benutzer-Identifier sein (sprich, das Passwort darf nicht die Anmelde-Email-Adresse sein)
- Einfachstmuster a lá "aaaaaaaaa" oder "1234567" dürfen nicht verwendet werden
- Das Passwort muss zwischen 8 und 20 Zeichen lang sein
Ein kleines Modul übernimmt das Einbinden des erweiterten Validators per layout.xml. Wie das geht, werde ich hier allerdings nicht erklären - vielmehr werde ich den Inhalt des zusätzlichen Validators etwas genauer unter die Lupe nehmen.
Ein zusätzlicher Validator
var pattern = '^(?=.*\\d)(?=.*[A-Z])(?=.*[!@#\\$%\\^&\\*()_\\+\\-={}\\[\\]\\\\:;"'+"'"+'<>,./]).{8,20}$';
if (Validation) {
Validation.addAllThese([
[
'validate-password',
'Your password must contain at least a letter, a number and a specialcharacter. I needs to contain 8-20 characters and cannot be the same as your first or last name',
{
pattern: new RegExp(pattern)
}
]
])
};
Was haben wir hier vor uns? Im Prinzip nicht viel - ein pattern, das ausgelagert wurde, da die Übergabe in den RegExp-Konstruktor mit den verschiedenen Anführungszeichen nicht zurechtkommt und das stark maskiert wurde, um die Funktion des RegExps zu gewährleisten. Dazu kommt eine Prüfung, ob das Validation-Objekt bereits existiert. Im positiven Falle wird über die addAllThese()-Methode ein weiterer Validator zur Validierung hinzugefügt. Da wir hier validate-password verwenden, wird die bestehende Passwort-Validierung schlicht überschrieben.
Weiterhin übergeben wir einen Text, der im Falle einer fehlgeschlagenen Validierung ausgegeben wird und wir übergeben die Validierungsregel pattern, die unser RegExp enthält.
Was kann validation.js noch?
Mit REFV ist man in der Lage, beliebige Felder in Formularen nach bestimmten Regeln zu validieren. Hier ein kleiner Auszug aus der Github-Seite von REFV:
Validation.add('class-name', 'Error message text', {
pattern : new RegExp("^[a-zA-Z]+$","gi"), // only letter allowed
minLength : 6, // value must be at least 6 characters
maxLength : 13, // value must be no longer than 13 characters
min : 5, // value is not less than this number
max : 100, // value is not more than this number
notOneOf : ['password', 'PASSWORD'], // value does not equal anything in this array
oneOf : ['fish','chicken','beef'], // value must equal one of the values in this array
is : '5', // value is equal to this string
isNot : 'turnip', //value is not equal to this string
equalToField : 'password', // value is equal to the form element with this ID
notEqualToField : 'username', // value is not equal to the form element with this ID
include : ['validate-alphanum'] // also tests each validator included in this array of validator keys (there are no sanity checks so beware infinite loops!)
});
Hier sind die verschiedenen Parameter, die man zum Validieren verwenden kann einmal kurz erklärt. Um einen ganz eigenen Validator zu erstellen und zu verwenden, benötigt man ein