Sicherheit bei Zend_Form
Das Zend Framework bietet viele Möglichkeiten uns Arbeit abzunehmen und vergisst dabei auch die Sicherheit nicht. Allerdings bin ich nun schon öfters auf Quellcode getroffen bei dem der Form-Teil des Zend Frameworks falsch eingesetzt wurde. So erfüllt Zend_Form auch den Zweck, dass wir sichere Inhalte von Elementen erhalten. Man kann auch Filter anwenden. Aber all dies bringt nichts, wenn man dann doch direkt auf die Werte über die globale $_POST zugreift. Man hat davon einfach nichts. Die Werte wurden nicht überprüft, sind damit unsicher, und sind durch keine Filter gelaufen.
Deshalb der Appell an jene, die die Bibliothek es falsch verwenden.
FALSCH:
if ($form->isValid) {
$objekt = new Test_Object();
$objekt->property1 = $_POST['property1'];
}
RICHTIG:
if ($form->isValid) {
$objekt = new Test_Object();
$objekt->property1 = $form->getValue('property1');
}
Zugriff auf WordPress XML-RPC-Server mit Zend
Es ist eigentlich recht plausibel, dass ich kurz vorstelle wie man auf WordPress per XML-RPC zugreift, wenn ich schon beschreibe, wie man den Server erweitern kann.
Das Wichtigste dabei ist, dass man den Server in den Einstellungen seines WordPress aktiviert. Dazu benötigt man nur einen kleinen Haken, der sich unter Einstellungen / Schreiben findet. Nachdem die Einstellung gespeichert ist könnt ihr anfangen mit Zend auf die Schnittstelle zuzugreifen.
Erweiterung der WordPress XML-RPC-Schnittstelle
Ich stand vor kurzem vor dem Problem, dass ich Daten von WordPress in einem anderen Projekt haben wollte. Es ging mir einfach darum die Posts einer Kategorie auszulesen und dort anzuzeigen. Natürlich griff ich damit auf die XML-RPC-Schnittstelle von WordPress zurück, da man nicht den Weg über die Datenbank gehen sollte. Die Datenbanken liegen zwar auf dem gleichen Server, aber irgendwo sollten die Projekte getrennt sein. Es macht auch keinen Sinn die WordPress-Datenbank auszulesen, wenn ein abhängiges Projekt einmal auf einen anderen Server wechseln sollte.
Das Einarbeiten in die Schnittstelle ist recht simpel. WordPress selber bietet dafür zwar wenig Hilfe, aber mit etwas Geschick findet man sie im Netz. Leider ist die Schnittstelle aber nicht gerade ausgereift und liefert allerlei Lücken und Unstimmigkeiten. Zum Beispiel ist die Übertragung von Benutzernamen und Passwort unterschiedlich. Es gibt Funktionen, da muss man erst den Benutzernamen und dann das Passwort übertragen, aber wiederum gibt es Funktionen bei denen man erst eine BlogId (Es war wohl einmal angedacht mehrere Blogs über eine Plattform betreiben zu können) und dann erst Benutzernamen und Passwort übertragen. Dann gibt es auch noch Funktionalitäten, die man eigentlich erwartet, die aber gar nicht Verfügbar sind.
Es gibt keine Funktion in der Schnittstelle um die Posts einer Kategorie abzurufen. Um diese Tücken zu umgehen kann man sich auf einen recht einfachen Wege eine Erweiterung der Schnittstelle entwickeln. Ich habe mich entschlossen dieses über ein Plugin zu tun. Das brachte dann auch schnell den Vorteil mit, dass ich Objektorientiert an die Sache herangehen konnte.
Plugin installieren bei Redmine
Ich wollte heute das erste mal ein Plugin bei meinem Redmine-System installieren. Leider musste ich feststellen, dass die Anleitung bei Redmine dazu ziemlich schlecht ist. In Schritt zwei wird gesagt, dass man einen Befhel, der natürlich angegeben ist, ausführen soll, wenn DB-Updates benötigt werden. Schritt 3 sagt dann, dass man Redmine neustarten soll.
Ich hatte kein Plugin, dass Datenbankupdates benötigt, aber dennoch funktionierte es nicht. Ich scheiterte schon daran Redmine neuzustarten. Warum? Dafür wurde keine Beschreibung angegeben. Nachdem ich den Hinweis gefunden hatte und Redmine erfolgreich neustarten konnte war mein Plugin aber immer noch nicht in der Liste der Plugins. Nach etwas suchen habe ich dann die Lösung zusammengefunden. Seltsamerweise musste ich dazu die Anleitung eines gänzlich anderen Plugins bemühen, das dann endlich die ersehnte Erklärung hatte.
Diese Erklärung ist eigentlich recht simpel.
Schritt 1:
Man läd das Plugin in das Verzeichnis /vendor/plugins. Dort muss das gesamte Verzeichnis des Plugins hinterlegen.Schritt 2:
Man muss die Plugins laden. Dazu verwendet man den Befehl
RAILS_ENV=production rake db:migrate_pluginsSchritt 3:
Redmine muss neugestartet werden. Dazu hinterlegt man im Verzeichnis /tmp eine leere Datei restart.txt. Man läd die Startseite von Redmine neu und der Neustart läuft im Hintergrund.
Nun sollte das Plugin in der Administration unter Plugins auftauchen. Viel Erfolg!
Zend Acl mit Ini Konfiguration und Resourcen
Ich hatte bereits einmal einen Artikel über eine Acl mit INI Konfiguration. Dort gab es einen Kommentar von evilmonkey, den ich sehr anregend fand und mir nun einmal die Zeit genommen habe diesen umzusetzen.
Die Konfiguration basiert auf einer Zend_Acl und wird mit einer Ini Datei über Zend_Config_Ini befüllt. Das ganze funktioniert als Resource mit dem Bootstrapping. Vielleicht ist es für den ein oder anderen eine Anregung.
