Category: Bugs | Vulnerabilities

Firefox vs IE CSS stylesheet className – class

Es gibt doch nichts schöneres als Bugs, die im Internet Explorer funktionieren, im Firefox dagegen nicht oder umgekehrt. Eines dieser Beispiel hatten ich schon bei dem Öffnen eines neuen Fensters mit Java Script. Dieser Fehler konnte jedoch durch die vollständige Definition aller Attribute behoben werden. Bei dem folgenden Beispiel ist dies nicht möglich.

Der Hover Effekt ist in CSS 2 momentan erst für Links verfügbar. Oft möchte man jedoch auch noch die Tabelle oder andere Elemente mit dem Hovereffekt versehen, die im DOM-Tree eine Ebene höher stehen. Dies ist für den Firefox mit folgendem Code möglich.

[HTML]

onmouseover=”this.parentNode.setAttribute(‘class’,’navibuttonshover’);”
[/HTML]

Im IE (Internet Explorer) funktioniert das nicht. Hier muß der Befehl wie folgt aussehen:

[HTML]

onmouseover=”this.parentNode.setAttribute(‘className’,’navibuttonshover’);”
[/HTML]

Aber wie baut man jetzt eine Allroundlösung die unabhängig vom Browser ist? Nach langer Recherche im Internet kommt man wohl um eine IF Bedingung nicht herum. Falls jemand einen besseren Weg kennt, würde ich mich über eine Nachricht freuen.

[HTML]

onmouseover=”this.parentNode.setAttribute((document.all ? ‘className’ : ‘class’),’navibuttonshover’);”
[/HTML]

WordPress 2.6.5 is available! Please update now.

Gestern Nachmittag hatte ich bei Securityfocus erst die Anzahl von Vulnerabilities zwischen Typo3 und WordPress verglichen. Typo3 kam auf zwei Seite, WordPress auf drei. Wobei viele Meldungen auf Typo3 Extensions entfallen. WordPress hat diesen Bonus nicht.

Bevor ich jetzt jedoch die ganze Update Prozedur starte, habe ich mir die Unterschiede zwischen WordPress 2.6.3 und WordPress 2.6.5 angeschaut. Die WordPress Version 2.6.4 wurde übersprungen, da es wohl eine Fake Version gab.

Das Update würde insgesamt nur 5 Dateien betreffen. Dafür den Aufwand treiben, die Datenbank zu sichern, alles löschen, das ganze WordPress Paket einspielen, ist mir zu aufwendig. Ich werde es händisch machen und mir dabei gleich mal die Fehler anschauen.

In einer Datei wird bloß die Versionsnummer hochgezählt. Manche Blogs behaupten, das Technorati Blogs aus dem Index schmeißt, die eine ältere WordPressversion verwenden, wie alt diese jedoch sein muß konnte ich bisher nicht herausfinden. Prinzipiell ist dies jedoch für mich ein Schwachstelle, wenn man “von außen” herausfinden kann, auf welcher Version ein System läuft. Dadurch wird es dem Angreifer umso leichter gemacht, den richtigen Hebel auszuwählen um anzusetzen.

Schauen wir uns einen weiteren Fehler an. Dies soll keine Klugscheißerei werden, denn die kann keiner leiden, aber nur aus Fehlern lernt man.

[php]
// File: /wp-admin/users.php

129 129 $go_delete = false;
130 130 foreach ( (array) $userids as $id ) {
131 $id = (int) $id;
131 132 $user = new WP_User($id);
132 133 if ( $id == $current_user->ID ) {
[/php]

Zeile 5 bzw. 131 ist neu. Bevor die Variable $id an WP_User übergeben wird, wird sie nach int gecasted. Dies ist auch sinnvoll, denn ursprünglich kommt das Array direkt aus einem Formular und nicht etwa aus der Datenbank.
Was mir jedoch nicht ganz schlüssig ist, warum wird der Cast nicht direkt in der Methode gemacht? Die Methode wird bestimmt noch an mehreren Stellen aufgerufen und man sollte der Methode die Verantwortung übertragen, sicherzustellen, das nur die richtigen Werte übertragen werden.

Betrachten wir noch eine weitere Lücke, die verdeutlichen soll, warum PHP Anwendungen so anfällig sind. In Programmiersprachen wie Java oder JavaScript wäre der Fehler schon von Anfang an aufgefallen.
Sehen wir uns zuerst den alten Code an:
[php]
// File: /wp-includes/feed.php

498 echo ‘http’
499 . ( $_SERVER[‘https’] == ‘on’ ? ‘s’ : ” ) . ‘://’
500 . $_SERVER[‘HTTP_HOST’]
501 . wp_specialchars(stripslashes($_SERVER[‘REQUEST_URI’]), 1);
[/php]

Und nun die Neue:

[php]
// File: /wp-includes/feed.php

498 $host = @parse_url(get_option(‘home’));
499 $host = $host[‘host’];
500 echo clean_url(
501 ‘http’
502 . ( (isset($_SERVER[‘https’]) && $_SERVER[‘https’] == ‘on’) ? ‘s’ : ” ) . ‘://’
503 . $host
504 . stripslashes($_SERVER[‘REQUEST_URI’])
505 );
[/php]

Bevor jetzt also geprüft ob der $_SERVER[‘https’] == ‘on’ wird erstmal überprüft ob die Variable ob überhaupt gesetzt ist. Wenn die Variable nicht gesetzt ist, macht es auch keinen Sinn zu überprüfen ob sie on ist. Sollte die erste Bedingung bereits fehlschlagen wird sofort abgebrochen. Dafür sorgt das &&.

Spamschutz: Mathetest

Nachdem mittlerweile die schlechten Captchas geknackt wurden, hat man sich neue Spamschutzmechanismen einfallen gelassen. Dazu zählen unter anderem Hunde in Katzenbilder oder umgekehrt erkennen bzw. eingescannten Text abtippen, um so zu helfen Bücher zu digitalisieren.

Captchas, Hunde, Katzen und eingescannter Text hat ein Nachteil: es sind immer Bilder. Dies wurde am Anfang als der Vorteil gefeiert, weil nur Menschen Bilder lesen und verstehen können. Mittlerweile ist man schlauer und Captchas die ihren Text nicht bis zur Unkenntlichkeit verschleiern, können mittels OCR automatisiert ausgelesen werden. Außerdem sind Bilder ein großer Nachteil für Braille Browser.

Zahlen die direkt im Quellcode stehen können von Braille Browsern natürlich wesentlich verständlicher interpretiert werden, aber dies sollten die Spamrobots doch auch können. Als vermute ich mal wird Anfangs das Spamaufkommen, aufgrund der Neuheit, sicherlich nachlassen, aber im Endeffekt verpufft diese Maßnahme und nach kurzer Zeit hat man wieder ein Spamaufkommen wie zuvor.

Bevor ich meinen WordPress Blog auf Akismet umstellte, hatte ich auch massive Probleme mit Spam. Dies konnte ich kurzfristig durch den Einsatzes eines Plugins senken, welches bei zuvielen Links ein erneutes Absenden forderte, jedoch verpuffte diese Wirkung bald.

Traue keiner Statistik: Kein Google Analytics und Blogcounter in der Preview

Bevor man seinen Post veröffentlicht, sollte man ihn vorher nochmals durchlesen. Dazu gibt es in WordPress den “Preview this Post” Button. Diesen Button benutze ich recht häufig, weil ich auch oft sehen will, wie der Quellcode aussieht oder weil mir immer wieder Sachen auf- und einfallen, die ich dringend noch ändern muß.

Zu meiner Schande muß ich gestehen, habe ich kein Plugin benutzt um den Google Analytics Code bzw. den Blogcounter Code in das Template einzubinden. Sondern ich habe es direkt in die header.php und footer.php eingetragen.

Die header.php und footer.php werden jedoch auch jedes mal in der Preview geladen, wodurch natürlich auch jedesmal der Google Analytics Code und der Blogcounter aufgerufen werden. Nachdem ich gestern nachschauen wollte, ob sich an meinen Besucherzahlen etwas geändert hatte, mußte ich feststellen, das die Unique Visitors gleich geblieben sind. Die Page Impressions sind jedoch gestiegen.

Vor allem bei Beiträgen die bisher noch nicht veröffentlicht wurden, waren die Page Impressions hoch. Also kurz gerechnet. Wenn ich mir einen Beitrag durchschnittlich 5 Mal vorher anschaue, er im Monat aber insgesamt nur 100 mal aufgerufen wird, habe ich schon eine Unschärfe von 5% drin. Das ist mehr als die derzeitige Inflation.

Also schnell noch mal in den Code gegangen und folgende Zeile eingefügt

[php]
if(!isset($_GET[‘preview’])){
[/php]

bzw. natürlich muß nach dem Google Analytics und Blogcounter die Klammer auch wieder geschlossen werden

[php]
}
[/php]

Bin mir nicht sicher, ob die zwei Extensions, die es im Internet dazu gibt, dies auch gemacht hätten. Also im Preview Modus den Code ausgeblendet. Wollte die Extensions vorhin ausprobieren, jedoch ging der Download nicht. Wäre vielleicht mal eine gute Gelegenheit, selber eine Extension zu veröffentlichen. Alternativ könnte man auch sagen, sobald jemand am Backend eingeloggt ist, wird der Statistik Code nicht mehr eingebunden.