Moin!
Danke nochmal für deine Anregungen, die haben mich dazu verleitet, mein CMS ein wenig zu überarbeiten, bei der Gelegenheit habe ich noch meine Datenbank verfeinert und das Navigationsscript überarbeitet.
Ein paar Kritikpunkte:
$query_request_check =
(
(!preg_match("#http|include|<|>|%3C|%3E|%22|'|ftp|:|script|select|order|distinct|delete|drop|insert|update#i", $_SERVER['REQUEST_URI']))
AND
(strlen($_SERVER['REQUEST_URI']) > 0 && strlen($_SERVER['REQUEST_URI']) < 90)
)
? $query_request_check
: die('was wird das?') ;
Effektiv benötigst du hier keinen ternären Operator, sondern ein echtes IF: Wenn die Testbedingung für "bösen Inhalt" zutrifft, willst du das Skript mit die() abtöten und stoppen. Hier den ternären Operator zu verwenden verschleiert diese Tatsache. Der ternäre Operatoe (boolean_expression?value_1:value2) ist KEIN Ersatz und KEINE Kurzform für IF/ELSE, sondern eine Form von bedingter Wertzuweisung. Du benötigst (solltest es zumindest) immer eine Variable, die in Abhängigkeit einer Bedingung entweder den einen oder anderen Wert erhalten soll.
$meinMenuKey = explode('/', $_SERVER['REQUEST_URI']);
// ...
$SubmenuAbfrage = "
SELECT
title_url, url_link
FROM
mein_sub_menu
WHERE
parentID = '".$meinMenuKey[1]."'
";
Da hast du dir jetzt die klassische SQL-Injection geproggt. ESCAPING! IMMER! EGAL WO DER WERT HERKOMMT! Dass die Request-URI andernorts irgendeiner Prüfung unterzogen wird, die ggf. zum Skriptabbruch führt, ist bei dieser Betrachtung vollkommen egal. Sicherheit in Skripten bedeutet immer, dass man typische Muster, die Fehlerquellen und Sicherheitslücken bedeuten, vermeidet - und beim Code-Review erkennt.
Daher sowas tun:
$seiten_abfrage = "
SELECT
group_name, date,
//...
FROM
datdate, head, ueberschrift, seiten_intern, marginalien
WHERE
datdate.group_name = '".mysqli_real_escape_string($dat_verbindung, $aufgerufene_url)."'
//...
LIMIT 1
";
if ($mySite = $dat_verbindung->query($seiten_abfrage))
//...
Das Escaping ist dort vorhanden. Allerdings nicht in OOP. Stattdessen wählst du die unkomfortable Methode über den Funktionsaufruf, dem du zusätzlich noch die DB-Connection mit übergeben musst.
Warum nicht sowas: $sql = "SELECT .... WHERE feld = '".$dat_verbindung->real_escape_string($aufgerufene_url)."' ...";
Variablenkopiererei! DAS ist wirklich ÜBEL!
Da werde ich derzeit nicht drumherum kommen, da ich irgendwie auf Error 404 reagieren muss, ansonstenm konnte ich schon eine Menge Code einsparen.
Glaube ich nicht.
Error 404 weißt du eigentlich schon direkt zu Beginn, wenn du die Seite nicht findest, die verlangt wird. Zu diesem Zeitpunkt hast du also "keinen Content", bzw. ggf. den Content der in der DB gespeicherten 404-Seite, plus die Info "404-Status in den Header tun". Das ist im Prinzip genau derselbe Ablauf, wie das Auffinden einer existierenden Seite mit 200-Status, zu dem du ebenfalls den Content in der DB findest, und am Ende eben nur mit 200-Status rausschickst.
Egal, ob der 404-Seiteninhalt aus der DB kommt, oder statisch definiert ist, den ganzen restlichen Klumpatsch wie Navi wirst du bei beiden Seitenfällen generieren müssen.
Gewiß, auf dem Weg von DB-Abfrage zu Template kommen noch ein paar zusätzliche Werte hinzu oder werden berechnet, aber dafür braucht man keine Einzelvariablen, das geht alles auch mit dem assoziativen Array!
Das verstehe ich nicht ganz, welches Array kann ich für das Smarty-Template nutzen?
Wenn du in Smarty diverse Variablen benutzt, z.B. {$titel}, {$headline} und {$content}, dann kannst du diesen drei Variablen in einem Rutsch ihre Inhalte verpassen, indem du mit $smarty->assign($wertearray)
arbeitest, und das Wertearray sieht dabei so aus: array("titel"=>"Ein Titel", "headline" => "Tolle Überschrift", "content" => "Lorem ipsum...");
Solch ein Array kommt auch direkt aus der Datenbank, wenn du z.B. "SELECT titel, headline, content FROM tabelle
" abfragst und mit $db->fetch_assoc() abholst.
Für Smarty muss ich ja jede Variable einmal initialisieren, mit einem if / else aus der DB abfrage ist das ja dann schon erledigt.
Smarty bietet verschiedene Möglichkeiten, wie es mit nicht zugewiesenen Variablen im Template umgeht. Standard ist, sie durch Leerstring zu ersetzen.
- Sven Rautenberg
"Love your nation - respect the others."