Piwik in die MediaWiki integrieren

Um Piwik in die MediaWiki zu integrieren gibt es eine Extension die auf den „Piwik Integration“ hört. Das Problem dieser Extension ist das sie seit 2009 nicht mehr weiterentwickelt wurde. Bedingt dadurch funktioniert das ganze nicht mehr mit der aktuellen Media Wiki Version.

Abhilfe schafft hier die Extension „PCR GUI Inserts“ welche unter http://www.mediawiki.org/wiki/Extension:PCR_GUI_Inserts zu finden ist. Mit dieser Extension ist es möglich Code auf der MediaWiki einzubinden. Im Gegensatz zu anderen Verfahren, wie z.B. dem direkten editieren der Templatedateien funktioniert diese Lösung auch nach einem Update der MediaWiki Version weiter.

Für die Installation muss man dabei folgende Schritte befolgen:

  • Extension herunterladen
  • den entpackten Ordner in den „extensions“ Ordner der MediaWiki hochladen
  • die „LocalSettings.php“ bearbeiten

Bei der Bearbeitung der „LocalSettings.php“ muss nur die Zeile:

require_once( "$IP/extensions/PCRGUIInserts/pcr_guii.php" );

an das Ende der Datei angefügt werden. Danach ist die „PCR GUI Inserts“ Erweiterung aktiv. Nun muss nur noch der Piwik Tracking Code eingebaut werden. Dazu gibt es in der entsprechenden Wiki ein schönes Beispiel:

$wgPCRguii_Inserts['SkinAfterBottomScripts']['on'] = true;
$wgPCRguii_Inserts['SkinAfterBottomScripts']['content'] = '<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://piwik.example.com/" : "http://piwik.example.com/");
document.write(unescape("%3Cscript src=\'" + pkBaseURL + "piwik.js\' type=\'text/javascript\'%3E%3C/script%3E"));
</script><script type="text/javascript">
try {
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 2);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}
</script><noscript><p><img src="http://piwik.example.com/piwik.php?idsite=2" style="border:0" alt="" /></p></noscript>';

Diese Zeilen werden dabei auch in die „LocalSettings.php“ geschrieben. Natürlich müssen die entsprechenden Domainnamen angepasst werden, sowie die passende Nummer für die zu trackende Webseite benutzt werden.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Piwik
http://de.wikipedia.org/wiki/MediaWiki

Kommandozeile für MySQL

Manchmal benötigt man eine MySQL Kommandozeile, hat aber kein „phpmyadmin“ zur Verfügung. Für einen solchen Fall wäre es schön wenn man eine kleine Anwendung hätte welche dieses Problem löst. Genau hier setzt die PHP Anwendung „Adminer“ an. Dabei handelt es sich sozusagen um eine „phpmyadmin“ Minimalversion.

SQL-Query Ansicht im Adminer

Das schöne am Adminer ist das er nur aus einer Datei besteht und so unkompliziert „installiert“ werden kann. Zu finden ist das ganze unter http://www.adminer.org.

PHP/CGI Sicherheitsproblem

Wie Heise gestern berichtete (http://www.heise.de/newsticker/meldung/Gefahr-durch-offene-PHP-Luecke-1567433.html) gibt es eine wunderschöne Sicherheitslücke im Bezug auf CGI und PHP. So führt der Aufruf:

http://localhost/index.php?-s

dazu das der Quellcode der Webseite ausgegeben wird. Das ist natürlich unpraktisch wenn dort Konfigurationsvariablen enthalten z.B. die Zugangsdaten für eine Datenbankverbindung. Zur Lösung des Problems gibt es drei Varianten:

  • PHP Version mit dem Bugfix einspielen
  • Rewrite Anweisung in die .htaccess
  • Wrapper welcher vor dem PHP-CGI aufgerufen wird

Die erste Variante scheidet aus, da der aktuelle Bugfix leicht umgangen werden kann. Die zweite Variante (einzutragen in eine „.htaccess“) sieht so aus:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^[^=]*$
RewriteCond %{QUERY_STRING} %2d|\- [NC]
RewriteRule .? - [F,L]

Die dritte Variante setzt einen Wrapper vor den eigentlich Aufruf und filtert die entsprechenden Anweisungen heraus. Dazu ändert man in der „httpd.conf“ die Zeile:

Action  application/x-httpd-php /cgi-bin/php-cgi.exe

in

Action  application/x-httpd-php /cgi-bin/php-cgi-wrapper.exe

und startet den Apache Server neu. Der Quelltext des Wrappers sieht dabei so aus:

#include <process.h>

#define PHP_ORIG "php-cgi.exe"

int main(int argc, char **argv)
{
    if(argc>1) argv[1]=0;
    _execv(PHP_ORIG, argv);
}

Das ganze kann hier auch als fertiges Visual Studio Projekt oder gleich als ausführbare Datei heruntergeladen werden.

Weitere Informationen gibt es unter:
http://www.kb.cert.org/vuls/id/520827
http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
http://www.heise.de/newsticker/meldung/PHP-patcht-schnell-aber-nicht-gruendlich-1567906.html

Header senden, HTTPS und der Internet Explorer

Manchmal ist es gewünscht das eine PHP Anwendung eine Datei an den Client sendet. Das könnte dann z.B. so aussehen:

header("Content-type: application/pdf");
header("Content-Length: " . strlen($tmp));
echo $tmp;

Diese Variante funktioniert im ersten Moment erst einmal ohne Probleme in allen Browsern. Zum Problem wird dies erst, wenn die Seite über HTTPS zu erreichen sein soll. In diesem Fall stürzt der Internet Explorer ohne Fehlermeldung ab. Der Trick hier ist es einen „Cache-Control“ Eintrag hinzuzufügen (welchen der Internet Explorer bei HTTPS anscheinend benötigt)

header("Cache-Control:  maxage=1");
header("Pragma: public");
header("Content-type: application/pdf");
header("Content-Length: " . strlen($tmp));
echo $tmp;

Mit dieser Variante funktioniert das ganze dann auch im Internet Explorer unter HTTPS.

Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/773308/ie-https-generating-pdf-from-php-file-doesnt-work

Cannot redeclare wfprofilein()

Nach dem Update der MediaWiki Software auf die Version 1.18 bekam ich folgenden Fehler:

Fatal error: Cannot redeclare wfprofilein() (previously declared in /www/wiki/includes/profiler/Profiler.php:14) 
in /www/wiki/includes/ProfilerStub.php on line 25

Die Lösung des Problemes war ganz einfach. Irgendwie wurde der Profiler aktiviert. Dies äußerte sich darin das es im Hauptordner der Software eine Datei namens StartProfiler.php gab. Wenn man diese Datei entfernt, ist das Problem gelöst.

Weitere Informationen gibt es unter:
http://www.mediawiki.org/