Bei meinen eigenen CMS mach ich das schon immer - die Seitenverwaltung und darauf basierend die Menügenerierung mit SQL Bäumen (auch Nested Sets genannt).
Wer aus der traditionellen Programmierung kommt, kennt das z.B. als mehrfach verkettete Liste.
Mit einer relationalen Datenbank im Hintergrund ist die Realisierung sehr einfach - praktisch im Level unbegrenzt und bei der täglich Arbeit sehr sehr schnell und wenn die Datenbank Transaktionen und Rollback unterstützt (wie Mysql) , dann ist das auch eine sehr sichere Sache.
Die hier bei der CMS aktuell verwendete Methode (hierarchy als Stichwort) ist denkbar primitiv und versucht dieses durch eine enfache Nachbildung auf Stringebene zu ersetzen, was ja auch klappt.
Ich möchte aber nicht sehen,was passiert, wenn tatsächlich mal 10 User gleichzeitig an den Inhalten
etwas ändern - ich kann aus dem jetzigen Quelltext nichts entnehmen, was die sichere Funktion gewährleistet - ich würde daher eher ein heilloses Durcheinander vermuten.
Ich möchte daher anregen, dass die Developer sich darum kümmern - da ist diese CMS zu simple.
In dem Zusammenhang möchte ich auch einmal auf das primitive Niveau was Sicherheit betrifft bei der Verarbeitung (Einfügen, Updaten etc) von Rechten, Sitepreferences etc . hinweisen.
So werden nach wie vor bei einer Rechtevergabe alle Rechte gelöscht um danach alle Rechte neu einzutragen - geht da etwas in die Hosen , klemmt die Säge aber mächtig.
Seitenverwaltung und Menügenerierung mit SQL Bäumen und Sicherheit
Beispiel zum Thema Datensicherheit
Hier einmal die aktuelle Durchführung einer Änderung der Gruppenrechte:
$query = "DELETE FROM ".cms_db_prefix()."user_groups WHERE group_id = ?";
$result = $db->Execute($query, array($group_id));
// Erst alles einmal weg hauen
foreach ($_POST as $key=>$value)
{
if (strpos($key,"user-") == 0 && strpos($key,"user-") !== false)
{
$query = "INSERT INTO ".cms_db_prefix()."user_groups (group_id, user_id, create_date, modified_date) VALUES (".$db->qstr($group_id).", ".$db->qstr(substr($key,5)).", '".$db->DBTimeStamp(time())."', '".$db->DBTimeStamp(time())."')";
// Und dann neu eintragen
$result = $db->Execute($query);
}
}
Geht dabei etwas in die Hosen, dann sind die Gruppenrechte weg und damit verbunden, kann es, wenn es einen selbst betrifft zur vollständigen Aussperrung kommen.
.................
Sind da mehrere Administratoren oder allgemein User vorhanden, die gleichzeitig in einem Bereich aktiv werden, ist eine Katastrophe höchst wahrscheinlich.
.................
Die Schlüsselwörter TRANSACTION oder ROLLBACK sind nur im Adodb - Source zu finden und in keinem Source der CMS selbst.
Das gilt ebenfalls für das Schlüsselwort LOCK im Zusammenhang mit der Datenbank.
Mit anderen Worten, die Möglichkeiten der unterstützen Datenbanksysteme werden bestenfalls angekratzt im Zusammenhang mit Sicherheit der Transaktionen wird rein nichts unternommen.
$query = "DELETE FROM ".cms_db_prefix()."user_groups WHERE group_id = ?";
$result = $db->Execute($query, array($group_id));
// Erst alles einmal weg hauen
foreach ($_POST as $key=>$value)
{
if (strpos($key,"user-") == 0 && strpos($key,"user-") !== false)
{
$query = "INSERT INTO ".cms_db_prefix()."user_groups (group_id, user_id, create_date, modified_date) VALUES (".$db->qstr($group_id).", ".$db->qstr(substr($key,5)).", '".$db->DBTimeStamp(time())."', '".$db->DBTimeStamp(time())."')";
// Und dann neu eintragen
$result = $db->Execute($query);
}
}
Geht dabei etwas in die Hosen, dann sind die Gruppenrechte weg und damit verbunden, kann es, wenn es einen selbst betrifft zur vollständigen Aussperrung kommen.
.................
Sind da mehrere Administratoren oder allgemein User vorhanden, die gleichzeitig in einem Bereich aktiv werden, ist eine Katastrophe höchst wahrscheinlich.
.................
Die Schlüsselwörter TRANSACTION oder ROLLBACK sind nur im Adodb - Source zu finden und in keinem Source der CMS selbst.
Das gilt ebenfalls für das Schlüsselwort LOCK im Zusammenhang mit der Datenbank.
Mit anderen Worten, die Möglichkeiten der unterstützen Datenbanksysteme werden bestenfalls angekratzt im Zusammenhang mit Sicherheit der Transaktionen wird rein nichts unternommen.
Nested Set
Ein anschauliches Beispiel zur Realisierung von Nested Sets kann man hier sehen (ich finde die Ausführung rcht anschaulich).
http://www.klempert.de/php/nested_sets/demo/index.php
Wenn ein Developer keine Ahnung davon hat, was ich meine kann er es hier nicht nur ansehen, sondern sich auch mal etwas Code zum probieren holen.
http://www.klempert.de/php/nested_sets/demo/index.php
Wenn ein Developer keine Ahnung davon hat, was ich meine kann er es hier nicht nur ansehen, sondern sich auch mal etwas Code zum probieren holen.