• schlechter Code
• Fehlermeldungen
• besserer Code
• Code kopieren
Fortress ??
• weitere Schmankerl
phpNuke 7.5


Ein Beispiel für "besseren" phpNuke code

Die Datei block-modules.php aus dem VKP-Mxxx 2.0

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

Was ist anders zur Original-Datei aus dem anderen Beispiel?

der Code:

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>&middot;</big></strong>&nbsp;<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>&middot;</big></strong>&nbsp;<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