| • schlechter Code |
| • Fehlermeldungen |
| • besserer Code |
| • Code kopieren |
| • Fortress ?? |
| • weitere Schmankerl |
| • phpNuke 7.5 |
Nachfolgend eine kleine Demonstration bzw. Analyse, einer komplett überarbeiteten
phpNuke Datei wie sie, so ähnlich, im VKP von maax-design vorhanden ist.
Es ist der gesamte Quellcode gelistet, mit Beschreibung, was in den wichtigsten
Zeilen passiert und zusätzlichen Bemerkungen
| Zeile | Code | was passiert | Bemerkungen |
|---|---|---|---|
| 17 | global $prefix, $dbi; | ||
| 18 | if (!is_resource($dbi)) die ("You can't access this file directly..."); | Prüfen ob blockdatei direkt aufgerufen wurde, ggf. Script mit Fehlermeldung abbrechen | Die Variable $dbi ist das Datenbankhandle. Wird der Block alleine aufgerufen ist diese Variable nicht definiert. Wird die Variable als Get oder Post übergeben ist es keine resource. Alternativ kann man auch das Vorhandensein, einer Funktion in der mainfile.php prüfen. |
| 19 | |||
| 20 | $isseradmin = is_admin($_COOKIE["admin"]); | Ergebnis der Funktion is_admin() in Variable speichern | Diese beiden Zeilen sind im Originalblock des VKP nicht vorhanden. Im VKP werden die Funktionen weiterhin verwendet. Sie sind allerdings völlig anders gecodet, und das Ergebnis wird beim ersten Aufruf innerhalb der Funktion statisch gespeichert. Die Datenbank wird nur noch einmal abgefragt, egal wie oft die Funktion im scrpt aufgerufen wird. |
| 21 | $isseruser = is_user($_COOKIE["user"]); | Ergebnis der Funktion is_user() in Variable speichern | |
| 22 | $where1 = ($isseradmin) ? "" : " AND (${prefix}_modules.active=1)"; | SQL-Bedingung, wenn nicht als Admin eingeloggt, die inaktiven Module von der Abfrage ausschliessen | |
| 23 | $where2 = (!$isseradmin && !$isseruser) ? " AND (${prefix}_modules.view=0)" : ""; | SQL-Bedingung, wenn nicht als Admin und nicht als User eingeloggt, die Module, die nur für registrierte User zu sehen sind, von der Abfrage ausschliessen | |
| 24 | $qry = "SELECT ${prefix}_modules.mid, ${prefix}_modules.title, ${prefix}_modules.custom_title, ${prefix}_modules.active | Die SQL-Abfrage zusammensetzen | Die Abfrage braucht nicht sortiert sein. Die _main Tabelle wird per join, mit abgefragt und damit das Startseitenmodul ermittelt, bzw. direkt von der Abfrage ausgeschlossen |
| 25 | FROM ${prefix}_modules LEFT JOIN ${prefix}_main ON ${prefix}_modules.title = ${prefix}_main.main_module | ||
| 26 | WHERE (${prefix}_main.main_module Is Null)".$where1.$where2.";"; | ||
| 27 | $result = sql_query($qry, $dbi); | ... Datenbankabfrage | |
| 28 | if (!is_resource($result)) { | Prüfen ob die Abfrage erfolgreich war, oder Fehler aufgetreten sind | |
| 29 | $content = "Fehlermeldung, dass ein DB-Fehler aufgetreten ist...."; | Falls Fehler, $content mit der Fehlermeldung initialisieren und die Funktion beenden | Mit return wird nicht das script beendet, sondern die Funktion render_blocks() in der mainfile.php, wo diese Datei includet wird. Im Block wird dadurch die Fehlermeldung angezeigt, anstatt des normalen Inhalts. |
| 30 | return $content; | ||
| 31 | } | ||
| 32 | while(list($mid, $m_title, $custom_title, $active) = sql_fetch_row($result, $dbi)) { | Schleife über alle Datensätze der SQL-Abfrage | Durch die oben genau definierten Abfragebedingungen, wird hier je nach Bedingung etliches an Schleifendurchläufen eingespart. |
| 33 | $m_title2 = (empty($custom_title)) ? str_replace("_", " ", $m_title) : str_replace("_", " ", $custom_title); | Wenn custom_title vorhanden ist, diesen als Modulnamen zur Anzeige verwenden. Gleichzeitig die evtl. Unterstriche ersetzen. | |
| 34 | $m_title3 = ($m_title == $GLOBALS["name"]) ? "<b>".$m_title2."</b>" : $m_title2; | Wenn der Modulname dem gerade aufgerufenen Modul entspricht, den Modulnnamen in Fettschrift anzeigen | Nicht im Originalblock |
| 35 | $outline = "<strong><big>·</big></strong> <a href=\"modules.php?name=".$m_title."\" title=\"".$m_title2."\">".$m_title3."</a>"; | Den eigentlichen Ausgabestring zusammensetzen und in eine Variable stellen | Zusätzliche Verwendung des Title-Tags |
| 36 | if (!$active && $isseradmin) { | Wenn Modul nicht aktiv und als Admin eingeloggt | |
| 37 | $opt_a[strtolower($m_title2)] = $outline; | Das assoziative Array A mit dem Ausgabestring füllen | Der Schlüsselname entspricht dem in Kleinbuchstaben umgewandelten Modulnamen. Dies ist nötig, weil die spätere Sortierfunktion kSort (sortiert nach Schlüsseln) zwischen Gross-Kleinschreibung unterscheidet. |
| 38 | } | ||
| 39 | else { | Modul ist aktiv und je nach Abfragebedingung für alle Besucher oder registrierte User zu sehen | |
| 40 | $opt_u[strtolower($m_title2)] = $outline; | Das assoziative Array U mit dem Ausgabestring füllen | Wie Zeile 37 |
| 41 | } | ||
| 42 | } // end while | Schleife ist beendet | |
| 43 | |||
| 44 | $content = "<strong><big>·</big></strong> <a href=\"index.php\" title=\""._HOME."\">"._HOME."</a><br>\n"; | Der Link zur Startseite | |
| 45 | if (isset($opt_u)) { | Wenn das Array U vorhanden ist (Die Module, die für User zu sehen sind) | |
| 46 | ksort($opt_u, SORT_STRING); | Dieses nach den Schlüsselnamen alphabetisch sortieren | Bemerkung in Zeile 37 |
| 47 | $content .= join("<br>\n",$opt_u); | Das Array zu einem String zusammensetzen | Durch Verwendung der Zeilenumbrüche, hier als Vereinigungsstring, und nicht direkt im String, wird der Zeilenumbruch hinter der letzten Zeile vermieden |
| 48 | } | ||
| 49 | if (isset($opt_a)) { | Wenn das Array A vorhanden ist (Die inaktiven Module, die nur für Admins zu sehen sind) | |
| 50 | ksort($opt_a, SORT_STRING); | Wie Zeile 46 | |
| 51 | $content .= "<center><br><b>"._NOACTIVEMODULES."</b><br>\n"; | Überschrift für Admins | |
| 52 | $content .= "<span class=\"tiny\">"._FORADMINTESTS."</span></center><br>\n"; | Überschrift für Admins | |
| 53 | $content .= join("<br>\n",$opt_a); | Wie Zeile 47 | |
| 54 | } |
© A.Ellsel
Siteadmin @ maaX-dESIGN
& pragmaMx & shiba-design