Schrift:

Archiv für Kategorie PHP

20.06.2009

Brainstorming Ressourcenbasierendes Framework?

Ich schleppe schon einige Zeit ein Konzept bzw. eher eine Idee mit mir rum, das ich leider selbst aus Zeitgründen nicht umsetzen kann: das ressourcenbasierendes Framework (RF). Möglicherweise ist das Prinzip nicht ganz neu, aber mir ist bisher noch kein derartiges Framework oder CMS untergekommen.

Auf die Idee bin ich gekommen, weil CMS- bzw. Blogsoftware häufig zu starr ist, um schnell ein neues Feature zu implementieren. Der Weg von typenbasierenden Seiten, also mit der Unterteilung ‘Seite’, ‘Blog’, ‘Termin’ usw. in eine flexibel kombinierbare Ausgabe zieht häufig einen kompletten Umbau nach sich – oder ist abhängig von spezialisierten Schnittstellen.

Auch wenn ich mich gerne mit Konzepten beschäftige und z.B. bereits das Zend Framework oder Symfony kennengelernt habe, ist mir der Weg zu einer fertigen Anwendung noch zu lang, oder wenn ich kein eingefleischter Anwender bin, auch zu kompliziert.

Ressourcen als Basis

Während die meisten CMSs oft diverse vollkommen voneinander unterschiedliche Contentelemente kenne, darunter Plugins, Seiten als News, Termine, statische Elemente usw., kennt das RCMS nur einen Grundtypen: die Ressource.

Eine Ressource kann sich die Inhalte aus diversen Quellen holen, z.B. Datenbanken, Textdateien, Templates oder Webservices. Für jede Resource werden normalerweise zwei standardisierte Command-Klassen bereit gestellt, jeweils für die Einrichtung im CMS-Backend und für die Ausgabe im CMS-Frontend.

Definition des Ressourcentyps

Je nach Aufgabe gibt es verschiedene Grundtypen von Ressourcen. Typisch sind programmorientierte Ressourcen wie Datenbankverbindungen, ACL, Request und Response und ausgabeorientierte Ressourcen, wie z.B. für HTML Header und Visible Content, die nach den Aufgaben weiter unterteilt werden.

Resourcegruppen

Die Ressourcen werden für den Einsatz über eine Konfiguration zusammengestellt. Eine grundlegende Konfiguration erstellt den gewünschten Aufruf. Wird ein Seitentemplate verwendet, erhält dieses Template ebenfalls eine Konfiguration, um die für die Seite verfügbaren Ressourcen zu definieren. Mit weitere Konfigurationen werden Ausgabetypen wie z.B. ein Blog, eine Seite, ein Download usw. mit Standardelementen und Standardtemplates definiert. Ergänzt wird die Konfiguration über dynamische Einstellungen und Einstellungen aus den einzelnen Ressourcen, die sich gegenseitig beeinflussen können.

Jede Ressourcegruppe stellt selbst eine Ressource dar. So können Ressourcegruppe ineinander verschachtelt werden.

Abarbeitung der Ressourcen

Die Abarbeitung erfolgt mit einem Controller in mehreren Schichten. Immer verfügbar sind die Schichten prepare, execute und view. Mit prepare werden Parameter zusammengestellt. Dabei kann auch die Ressourcegruppe beeinflusst werden, um auf zusätzliche Ressourcen zuzugreifen, Ressourcen oder ganze Ressourcengruppen zu entfernen oder zu ersetzen.

Die zweite Schicht, execute, führt optional logische Operationen aus.

Mit view wird die Ausgabe generiert, soweit dies erforderlich ist.

Vor- und Nachteile

Der Vorteil ist eine hohe Erweiterbarkeit und Flexibilität. Ressourcen können relativ einfach ersetzt, ergänzt oder neu kombiniert werden. Durch die einheitliche Schnittstelle für alle Ressourcen müssen sich Anwendungsdesigner weniger um die technischen Hintergründe kümmern, sie müssen nur noch wissen, welche Daten sie aus welcher Ressource zurückbekommen.

Ein Nachteil ist möglicherweise die hohe Anzahl der Dateizugriffe. Spätestens bei komplexeren Aufgaben muss für jede Ressource eine Klasse erstellt werden. Es kann auch schnell zu einem Konfigurationsoverhead führen.

PHP | Keine Kommentare

19.10.2008

PHP Arrays sind schneller als Objekte

Ich hab gestern mal Arrays mit stdClass-Objekten in der Datenabfrage verglichen. Bei kurzen Schlüsseln sind Array bis zum Faktor 1:1,3 schneller, bei längeren Schlüsseln 1:1,2. Noch deutlicher fällt der Unterschied aus, wenn im Array Integer als Schlüssel verwendet werden.

PHP | Keine Kommentare

28.09.2008

Sicherheit Javascript ausschließen mit PHP

Es kommt immer wieder vor, dass in Websites unerlaubtes Javascript eingeschmuggelt wird. Um einen Text mit Javascript auszuschließen, müssen eine Reihe von Möglichkeiten beachtet werden. Diese sogenannten XSS-Attacken (cross side scripting) können viel anrichten, zum Beispiel indem Paßwörter durch gefälschte Formulare abgefangen werden. Gelingt es, den Code in der Datenbank zu speichern, kann er als regelrechter Virus genutzt werden und weitere Änderungen vornehmen.

Mit den Zeichen >, <, " und ' kann HTML auf einer Website verändert werden. Werden diese Zeichen in Entities umgewandelt, also &gt;, &lt;, &quot; und &#039;, ist die Gefahr weitgehend behoben. Alternativ können diese Zeichen auch aus allen Benutzereingaben gelöscht werden.

Es reicht nicht, > und < umwandeln. In der Website kann es vorkommen, dass Inhalte von Benutzern auch innerhalb von HTML-Tags ausgegeben werden. Je nachdem, wie das HTML aufgebaut ist, können ohne Zeichenumwandlung HTML-Attribute wie onload oder onclick (Events) eingeschleust werden.

Beispiele, wie es nicht gemacht werden soll:

Ungefiltert kann hier in mehreren Versionen Code eingeschleust werden:

<?php
echo '<a href="search.php?search='
      .$_GET['search']
      .'">Suche</a>';
?>

Damit bieten sich dem Angreifer mehrere Möglichkeiten, Javascript einzuschleusen:
<a href="search.php?search="><script>alert ('Angriff!');</script>">Suche</a>
<a href="search.php?search=" onclick="alert ('Angriff!');">Suche</a>

Für Angriffe besonders anfällig sind <input>- und <textarea>-Elememte, da bei falscher Eingabe die Benutzereingaben gerne wieder ausgegeben werden.

Ein Lösungsansatz

Der Lösungsansatz gilt nicht für Bereiche, wo der Anwender HTML abspeichern darf. HTML muss anders überprüft werden!

Viele Wege führen nach Rom, darum will ich erstmal einen Lösungsansatz vorstellen. Auf öffentlichen Seiten filter ich mit einer Klasse alle REQUEST-Parameter, indem ich die Zeichen >, <, " und ' mit &gt;, &lt;, &quot; und &#039; ersetze, und zwar in $_REQUEST, $_POST und $_GET. Alternativ kann ich auch die Zeichen mit Leerzeichen ersetzen.

Ich kann dann diese globalen Variablen wie bisher weiter benutzen, muss aber beachten, wo ich die Quelle benötige. Ob ich die veränderten Werte in die Datenbank speichere, hängt davon ab, wie sie weiter verarbeitet werden sollen. ‘Mustermann & Söhne’ ist nicht das gleiche wie ‘Mustermann &amp; Söhne’ und beeinflußt Suchergebnisse. Falls die Daten später wieder auf der Website dargestellt werden sollen, müssen sie auch erneut umgewandelt werden. Passwörter sollten nie gefiltert gespeichert werden.

Um auf die ungefilterten REQUESTs zugreifen zu können, speichere ich mir eine Kopie ab.

Mit diesem Code mit Anwendungsbeispiel können ohne viel Aufwand spezielle Filter erstellt werden. Der Code steht unter MIT-Lizenz (Open Source).

Andere Risiken

Es gibt noch diverse Risiken, die über REQUESTs auftreten können. Grundsätzlich sollten alle REQUESTs auch inhaltlich überprüft werden.

Besonders anfällig sind dabei E-Mail-Parameter – insbesondere Betreff und E-Mailadresse -, Datei- und Verzeichnispfade, SQL-Queries und andere Speicherformate und Systemaufrufe.

Quellen

PHP | 2 Kommentare

23.10.2006

Sicherheitslücke in Trawler Web CMS geschlossen

Gestern und vorgestern wurden auf Grund einer Sicherheitslücke mehrere Trawler Web CMS-Auftritte gehackt. Dabei wurde die Startseite überschrieben, Dateien auf den Server geschrieben und teilweise auch Dateien gelöscht. Der Exploit wurde veröffentlicht, eine Mitteilung habe ich jedoch nicht erhalten.

Das Update gibt es als trawler1.86update.zip. Das Updatepaket enthält einen Readme-Ordner mit Informationen zur Installation.
Siehe auch: Trawler Sicherheitslücke größer als erwartet. Weitere Updates sind in Vorbereitung.

Anwender-Infos, Anwendungen, PHP, Trawler web CMS - SPD-Edition | 1 Kommentar »

31.05.2006

PHP: Sicherheit bei globalen Variablen

Die Verwendung von $GLOBALS ist eine gängige Methode, Einstellungen an Funktionen weiterzugeben, ohne sie als Funktionsparameter zu laden. Während bei Strings ud Zahlen noch auf define() zurückgegriffen werden kann, ist das bei Arrays ohne zusätzliche Funktion nicht mehr möglich.

<php
$GLOBALS['moin'] = 'Hallo Welt';
function hallo_welt() {
echo $GLOBALS['moin'];
}
hallo_welt();
?>

Da in $GLOBALS auch alle Werte aus $_GET oder $_POST stehen, können sie eventuell von außen verändert werden. Darum sollte eine Globale immer vorher leer gesetzt werden.

Kann verändert werden:
<php
$GLOBALS['moin'][] = 'Hallo Welt';
$GLOBALS['moin'][] = 'Hallo Emden';

$GLOBALS['tschüß'] .= 'Tschüß';
?>

Kann nicht verändert werden:
<php
$GLOBALS['moin'] = array();
$GLOBALS['moin'][] = 'Hallo Welt';
$GLOBALS['moin'][] = 'Hallo Emden';

$GLOBALS['tschüß'] = '';
$GLOBALS['tschüß'] .= 'Tschüß';
?>

Einsteigerkurs, PHP | Keine Kommentare

14.04.2006

HTML-Funktionen fehlen in PHP

Die Erweiterung Tidy geht in die richtige Richtung, ist aber zu komplex und zu speziell, um wirklich populär zu werden. Und Ansätze aus den Anfängen PHP wie striptags() und nl2br() wurden nicht weiter verfolgt. PHP ist immer noch die Programmiersprache der Hobbyprogrammierer, darum sollte die Lösung einfach sein. Was macht man denn mit PHP? Meistens doch HTML verarbeiten, oder?

Zuerst einmal sollte der Programmierer festlegen können, welche HTML-Version er verwenden möchte. Ergänzend sollte es noch möglich sein, eine Doctype-Definition anzugeben. Dann sollte der Programmierer ein Subset aus Tags und Attributen für die jeweilige Eingabe definieren können.

Als letztes bleibt mein Wunsch für eine Funktion, die nl2br() ablöst. Ein vereinfachtes HTML-Textformat, in den auf <p> oder <br>, wenn möglich, verzichtet wird, ist in vielen Programmen gebräuchlich.

Mit diesem einfachen Paket wäre vielen Programmierern geholfen, und es würde die HTML-Standarts ein ganzes Stück nach vorne bringen.

HTML und XHTML, PHP | Keine Kommentare

11.04.2006

Security: allow_url_fopen auf dem Soziserver ausgeschaltet

Nachdem es auf dem Soziservr Angriffe gab, mit denen PHP-Scripts für Massenmails auf den Server kopiert wurden, mussten wir die Einstellung allow_url_fopen ausschalten. Konkret heißt das, es können keine Daten mehr von externen Adressen eingelesen werden. Betroffen sind HTTP, HTTPS und FTP-Adressen, die mit den Funktionen file(), file_get_contents(), readfile(), fopen(), include() u.a. eingelesen werden. Diese Funktionen werden gerne für die Anzeige von RSS-Dateien in der Homepage genutzt.

Die PHP-Fehlermeldung enthält folgenden Text:

URL file-access is disabled in the server configuration in …

Ein typisches Beispiel ist folgender Code:
<?php $file = join('', file('http://example.com/rss-feef.php'));?>

Vorrangig gefährdet sind vor allem Scripts, die ungefiltert externe Daten über die include()-Funktion einlesen. Leider gibt es bei PHP keine Möglichkeit, die Zugriffrechte nach den Funktionen zu differenzieren.

PHP | Keine Kommentare

08.02.2006

PHP: Reguläre Ausdrücke und Umlaute

Während auf meinem Windows XP umlaute berüksichtigt werden, ist das auf dem Linux-Server nicht der Fall. Die Ursache ist mir nicht bekannt. Vielleicht sind es Unterschiede in den RegEx-Bibliotheken, vielleicht die bei den Providern einstellten Zeichensätze (was auf Windows die Codepage ist).
(weiterlesen…)

PHP, Programmierung, CSS, HTML | Keine Kommentare

18.12.2005

SessionCheck: Eingabekontrolle gegen Fremdposter

Sobald in einer Websoftware Sessions eingesetzt werden, können Eingaben, z.B. für Kommentare, mit einer Session auf ihre Herkunft geprüft werden. Dabei wird ein Zufallswert erzeugt, der sowohl über die Session undüber ein Formularfeld weitergegeben wird.

<?php
$nospam = rand (1, 99999);
$_SESSION["nospam"] = $nospam;
?>
<input type="hidden" name="nospam" value="<?php echo $nospam;?>" />

In der verarbeitenden Funktion werden beide Werte miteinander verglichen.

<?php
if($_SESSION["nospam"] != $nospam)
die();
?>

PHP | Keine Kommentare