Das Content-Management-Framework "NowCMS"
Im Dezember 2015 habe ich nach reiflicher Abwägung begonenn, ein neues CMS zu schreiben. Seit September 2017 läuft es bereits auf dellekom.de.
Mir ist völlig klar daß man nicht "das Rad neu erfinden sollte" - andererseits liefern alle CMS die ich bisher gesehen habe nicht die Funktionen die ich schon für die "Dellekom" dringend benötige. Wenn das Rad also nicht mehr rund läuft, kann Neuerfindung Sinn machen - wenn das Sicherheitswissen und "Best practice" Praktiken ausreichen, um meine Installation sowie die Kundendaten zu schützen.
Für mich hat sich das Schreiben schon fast dadurch gelohnt, daß die "Vorversion" des CMS mir seit 2005 gute Dienste als Fakturierung geleistet hat, die mir bis heute (Juli 2018) bereits 22247 Rechnungen geschrieben und größtenteils per Lastschrift eingezogen hat.
Was hat mich bei der Arbeit am CMS geleitet?
- Jede Firma oder sogar ein Verein hat Kunden oder Mitglieder, wir benötigen eine mächtige Nutzerverwaltung die wir auch für die Anmeldung nutzen,.
- Beliebig tief verschachtelte Menüebenen spiegeln die Baumstrukur der URLs.
- Auf den ersten Blick sieht es so aus als wären die Anforderungen von Firmen sehr verschieden, bei genauerer Betrachtung benötigen alle denselben wichtigen Kern an Funktionen: Schutz von Inhalten, fein granulierte Benutzerrechte, Mailingmöglichkeiten, Gruppen und "Etiketten", Internbereiche, Tabellen von Daten um nur das Nötigste zu nennen.
- Natürlich muß ein CMS dennoch erweiterbar sein nach individuellem Bedarf der Auftraggeber.
- Funktionserweiterungen des CMS sollten größtenteils allein dadurch möglich sein, daß im "Backend" einfach weitere Datenfelder und Tabellen "hinzugeklickt" werden, Schreiben von Code sollte wo möglich vermieden werden. NowCMS startet mit einigen Tabellen und Datenobjekten wie Ticketsystem, Aufgabenliste, Adress- und Kontodatenbank, Rechnungen sowie einen Kalender. Nutzer die diese Funktionen nicht benötigen haben eine einfache Möglicheit die Tabellen ganz oder teilweise zu löschen, zu deaktivieren oder auszubauen.
- Wir sollten darauf achten wenig Code zu erzeugem denn wenig Code bedeutet leichter zu pflegenden Code der besser auditiert werden kann.
- Die Nutzerliste muß direkt auf der Webseite pflegbar sein denn niemand will Daten aus einer Mail die durch ein Kontaktformular veranlasst wurde in eine Excel-Tabelle übertragen und dann wieder ins Web etc.
- Es sollte trivial sein, automatisiert z.B. Begrüßungsmails senden zu lassen z.B. nach einer erfolgreichen Registrierung.
- Automatische PDF-Erzegung für Tabellen sowie für einzelne Datensätez egal welchen Formats.
- Außer der Ausgabe von Listen und einzelnen Listenelementen (wie z.B. eine Produktbeschreibung) sollten auch automatisches Blättern (Paginierung) unterstützt werden ebenso wie eine Blog-artige Abfolge von kleinen Artikeln oder Kommentarstil oder auch Versionierung von Artikeln.
- Durchgehende Mehrsprachigeit ist selbstverständlich bei allen Menüs und Meldetexten. NowCMS ensteht schon vom Start in vier Sprachen (deutsch, englisch, französisch und italienisch)
- Auto-Erzeugung von Inhaltsverzeichnissen und Sitemaps
- Nutzer sollten in der Lage sein, auf einen gesicherten Link in einer Mail zu klicken, um z.B. ihre Präferenzen für den Newsletter-Empfang festzulegen oder auch für Umfragen.
- Es soll eine beliebige Anzahl von Gruppen / Etiketten (Tags) angelegt werden können; Nutzer können einer beliebigen Menge solcher Gruppen zugeordnet werden.
- Es sollte keine festen "Rollen" wie "Autor" ,"Redakteur" geben -nicht alles ist ein Blog. Zu schützende Bereiche der Webseite (wie jede einzelne Seite und die darunterliegenden) kann zum Lesen und / oder Schreiben / Ändern nur für Mitgleder einer bestimmten Gruppe geschlossen werden. Auf diese Weise ist eine sehr fein granulierte Rechteverwaltung möglich.
- Gruppen haben keine feste Bedeutung und sind zunächst beliebigen Etiketten ("Labels") vergleichbar, die man Nutzern oder einer Menge von Nutzern zuweisen kann.
- Dateien oder Bilder die nicht öffentlich abrufbar sind müssen durch geeignete Maßnahmen und zufällig aussehende Dateinamen vor unberechtigtem Zugriff geschützt werden.
- Es soll auch mögch sein, verschiedene Versionen derselben Datei mehrfach zu speichern - auch bei übereinstimmendem Dateinamen.
- Automatische Deduplikation von Dateien
- Um die Zahl von Downloads messen zu können und Berechtigungen des Downloads zu prüfen muß versteckter Inhalt durch ein Skript ausgeliefert werden, welches Berechtigungen prüft und eventuell Dateinamen für den Download erzeugt.
- Nur ein Skript "index.php" darf im öffentlichen Bereich des Webservers neben den öffentlich sichtbaren Dateien wie manche Bilder CSS, Icon usw. sichtbar sein. Geschützte Dateien müssen im nichtöffentlichen Teil gespeichert sein, eventuell verschlüsselt.
- Saubere suchmaschinenfreundliche und merkbare URLs (ohne .php - Endungen)
- Mailings sollen mithilfe der Gruppenmitgliedschaften einfach abgewickelt werden können.
- Durch das Mailing-Werkzeug sollen durch sukzessive Filterung eine genau definierte Menge an Nutzern erstellt werden können. Aus dieser Menge kann wiederum eine neue Gruppe erzeugt werden.
- Angemeldete Nutzer müssen in der Lage sein, ihre Stammdaten selbst zu pflegen (Eventuell entstehen dabei zur Beweissicherung alte Versionen).
- Das "Backend" (Administrationsoberfläche) eines CMS muß genauso aussehen wie das "Fronend" (öffentlicher Teil der Webseite) - nur sieht der Administrator mehr Menüs und hat mehr Knöpfe, Eingabemasken und Optionen um den Content zu ändern.
- Nicht zugängliche Optionen oder Datenfelder und Knöpfe dürfen nur für Berechtigte sichtbar sein.
- Der Nutzer soll in der Lage sein, möglichst viele Dinge seines Vertrages oder seiner Daten selbst regeln zu können, wie z.B. Newsletter-Abonnement, Tickets und Aufgaben.
- Das CMS muß sich sehr gut und frühzeitig gegen alle Arten von Angriffe verteidigen können (brute force, DDoS-Angriffe, sogar langsame "Spider") um frühzeitig und effezient Angreifer sperren und sich schützen zu können.
- Das CMS muß sehr schnell sein (wenige Millisekunden pro Aufruf einer normalen Seite) - um die Angriffsfläche möglichst klein zu halten.
- Alles ist eine Tabelle: Es muß einfach sein, zu bestehenden Tabellen (wie der Benutzertabelle) weitere Datenfelder hinzuzufügen.
- Es soll möglichst vermieden werden, für neue Funktionen neuen Code in Form von Erweiterungsmodulen hinzuzufügen: Ist eine Idee gut genug, wird sie vielen Nutzern interessant erscheinen, dann sollte die Funktion in den Kern von NowCMS aufgenommen werden..
- "Training on the job": Das CMS startet mit vielen vordefinierten Inhalts- und Datentypen. Der Integrator einer neuen Webseite modifiziert und löscht dann nach Belieben. Durch die Beispiele sollten kaum Blicke ins Handbuch nötig sein - überall sollte Hilfe in Form von "Tooltips" verfügbar sein.
- Komplexe Datenformate: Ein Nutzer kann mehrere Postadressen, mehre Bankverbidnungen und Kontakte haben können. Die Postadressen sollen durch Bemerkungen wie "Privat" "Geschäftlich", "Bisherige Adresse", "Rechungsadresse" voneinander unterschieden werden können, ähnlich die anderen Kontakte (Mobil, Fax, Privat Festnetz, Skype, Web, Email, WhatsApp usw..
- Neue Nutzer sollen sich selbst registrieren können - aus eine Frage im Kontaktformular kann gleich ein neuer Nutzeraccount angelegt werden.
- Nicht jede Firma ist ein "Shop", deshalb greifen viele Standard-Web-CMS nicht. Spezialisierte Dienstleistungen wie meine kleine Telefongesellschaft benötigen spezielle Softwaretools um Datenströme wie Verbindungsdaten zu verwalten. Die Fakturierung muß wiederkehrende Rechnungspositionen ebenso verwalten können wie automatisch PDFs erzeugen udn versenden.
- Zahlungsdaten (Lastschrift) können mit dem europäischen SEPA-XML-Format erzeugt und übertragen werden.
- Teile der Webseite dürfen nur für speziell Berechtigte zugänglich sein - ebenso darf geschützter Content nur nach Prüfung der Berechtigungen ausgeliefert werden und nicht durch Dateinamen raten möglich sein.
- Die Zugänglichkeit der einzelnen Seiten kann sehr genau an Gruppen gebunden sein Dies ist der wichtigste Mechanismus um Zugang und Berechtigung zu regeln.
- Das CMS implementiert eine Programmierschnittstelle (API) welche "RESTful " gestaltet ist oder sehr nahe dran. Auf diese Weise ist JSON / XML / CSV oder sogar ein OpenDocument -Export von Dateien einfach möglich.
- Das CMS muß sehr sicher sein, Hinzufügen von externen Code-Modulen sollte vermieden werden da die synchrone Weiterentwicklung durch Drittentwickler nicht sichergestellt ist.
- Funktion und Benutzerfreundlichkeit geht über Design-Flexibilität.
- Das CMS wird zusätzlich dadurch abgesichert daß Dateien in wichtigen Ordnern nicht verändert werden können - ebenso wichtige statische Konfigurationsvariablen und Texte.
- Durch das Auslagern von Texten und Konfigrationsvariablen in PHP-Dateien wird eine starke Beschleunigung erreicht.
- Das Installationsskript prüft stets das Vorliegen sämtlicher Vorbedingungen und versucht fehlende Einstellungen oder Daten zu "reparieren". Er lädt sogar aktuellen Code nach oder prüft ob Code modifiziert wurde.
- Während des Installationsprozeses wird Code über ein verschlüsseltes und abgesichertes Verfahren überprüft und ggfs. aktualisiert.
- Wir nutzen keine extern geladenen Skripte, auch werden Fonts lokal gespeichert. Dadurch kann auch mithilfe der "Security headers" ein Maximum a Sicherheit erreicht werden.
- Wir nutzen zwar eien JacaScript-Werkzeug für das Editieren von HTML, für Frontendbenutzer ist jedoch JavaScript nicht nötig. Auch im Backend kann ohne JavaScript problemlos gearbeitet werden.
- Die Suchfunktion ist stark kontextabhängig: Es werden nur Ergebnisse gezeigt die der angemeldete Besucher durch seine Berechtigungen zugängllich sind.
- Das CMS enthält von Anfang an Tabellen wie Postadressen, Bankkontakte, weitere Kontakte, Inventarliste, Kalender, ein Ticketsystem, Aufgabenliste, Kontaktformulardaten, Liste der Weiterletungen bei nicht gefundenen URLs, usw. - es ist für Integratoren einfach nicht benötigte Dinge zu löschen oder anzupassen.
- Ein globales CSS Datei wird automatisch aus allen Einzelteilen erzeugt.
Probleme die ich versuche zu vermeiden
- Ich habe mich über viele Jahre gut in die Programmiersrache PHP und Sicherheitsaspekte eingearbeitet aber keine Lust noch eine weitere Programmiersparche (JavaScript) zu lernen und zu beherrschen. Auch daher verzichte ich weitestgehend auf JavaScript und die dadurch unvermeidlichen Abhängigkeiten von der (Un-)Sicherheit anderer Projekte. Später hinzustoßende Entwickler werden mögicherweise JavaScript ergänzen, aber für sicherheitsrelevante Umgebungen muß es immer möglich sein das CMS gänzlich ohne JS zu verwenden.
- Da ich Abhängigkeiten (vor allem unnötige) für den Fluch der Softwareentwicklung halte, setze ich nur "gut abehangene" fremde Klassen ein. Im MOment sind die einzigen Abhängigkeiten: Eine Mailklasse, die PDO Datenbankabstraktion, eine PDF-Klasse, einen HTML-Editor (mit JavaScript).
- Sogar ohne "composer" und andere "moderne" Tools um Abhängigkeiten zu beherrschen ist der Installer in der Lage, den kompletten Code zu prüfen und ggfs. zu aktualsiieren.
- Ich denke es ist falsch zwischen einem "Backend" und einem "Frontend" zu unterscheiden. Man muß dann zwei Stile pflegen, hat doppelten Orientierunsgaufwand und verschiedenes Layout.
- Ich denke eine unendliche Vielfalt beim optischen Webdesign wird überbewertet. Durch NowCMS erstellte Webseiten werden immer dieselbe "langweilige" Navigation haben- später kann dort aufgesetzt werden.
Das neue CMS ist in PHP (7.x) geschrieben und nutzt Datenbanken wie MySQL und MariaDB, kann aber auch mit anderen SQL-Datenbanken betrieben werden.
NowCMS ist nicht Open Source (was die Zukuft bringt werden wir sehen), ich benutze es bereits für mehrere Kunden. Das Hauptziel von "NowCMS" ist es nicht, die bekannten anderen CMS zu ersetzen, es soll immer dann zum Einsatz kommen, wenn die bekannten CMS wegen der Komplexität der Datenflüsse oder der Vielzahl besonderer Datentabellen und Businss-Logik nicht mehr verwendet werden können.
Pate gestanden hat phpMyAdmin - eine in PHP geschriebene Software die Technikern ermöglicht, beliebige Datenbankaktionen durchzuführen. NowCMS soll wie phpMyAdmin ein "Kleid" um eine Datenbank mit beliebigen Tabellen sein, bei dem die Zugriffsrechte und Visualisierung ansprechend gestaltet ist, während beliebige Tabellen dargestellt und manipuliert werden können.