BOM, Webseitenanzeige kaputt

22 12 2010

Ich stand vor einem Problem, das sich mir nicht ganz erschloss. Die ganze Zeit wurde meine Webseite korrekt angezeigt. Dann wollte ich eigentlich nur eine kurze Änderung vornehmen, wodurch die komplette Seite um eine Zeile nach unten verschoben wurde. Ich konnte mir wirklich nicht vorstellen, woran das liegen sollte, hatte ich doch nur einen Text geringfügig geändert. Also kein Grund für die Darstellung, gleich beleidigt zu spielen.

Erst eine nähere Untersuchung der aus PHP Skripten generierten HTML Seite machte klar, da ist etwas mit dem Header passiert. Was der grafische Editor nicht anzeigte, im vi zeigte sich ein Tag namens <feff>

<feff><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


FileFormat.info
erklärt, dass es sich dabei um die Byte Order Mark von UTF-8 Dokumenten handelt. Eigentlich eine praktische Sache, doch Firefox kommt mit der Anzeige nicht korrekt. Die einfache Entfernung der BOM für die Template Datei brachte die Lösung für ein Problem, das mir wirklich einiges Kopfzerbrechen beschert hatte.

Advertisements




target=“_blank“ ist doof

11 12 2010

Kaum war eine Testversion meiner neuen Homepage online, schon gab es erste Stimmen, externe Links öffnen gar nicht in einem neuen Fenster. Ja, kann ich hier nur entgegnen, und das ist auch gut so. Doch warum ist das so? Ganz einfach, das target Attribut bei Links gibt es in XHTML Notifikationen nicht mehr. Aus gutem Grund.

Heutzutage öffnet fast jede Webseite Links zu externen Seiten in einem neuen Fenster, viele poppen selbst bei internen Verlinkungen immer wieder neue Fenster auf. Das führt irgendwann zu einer unüberschaubaren Flut von Browserfenstern auf dem Desktop. Hierzu gibt es mehrere Möglichkeiten:

<a onclick="window.open('http://www.example.org/')" href="#">Link 1</a>
<a href="javascript:window.open('http://www.example.net/)">Link 2</a>

Hier wird eine JavaScript Lösung verwendet, die natürlich nur funktioniert wenn der Browser auch JavaScript aktiviert hat. Davon kann man nicht immer ausgehen. So ziemlich alle Suchmaschinen-Bots beispielsweise können solchen Links nicht folgen, indexieren natürlich die verlinkten Seiten dann auch nicht.

Da gab es in älteren HTML Varianten eine Abhilfe, das target Attribut. Mit dem Wert „_blank“ lies sich der selbe Effekt erzielen:

<a href="http://www.example.org/" target="_blank">Link 3</a>

Somit verstehen auch Suchmaschinen, dass es hier weiter geht im großen weiten Web. Was passiert, wenn ein User diesen Link anklickt? Genau, er bekommt ein neues Fenster vorgesetzt, dem der komplette bisherige Browserverlauf fehlt. Als erfahrener Internetnutzer möchte ich diese Entscheidung nicht von jedem dahergelaufenen Webmaster abgenommen bekommen. Nein, ich selbst entscheide, wann ich eine Seite in einem neuen Fenster öffnen möchte. Dafür klicke ich beispielsweise im Firefox einfach die mittlere Maustaste auf den Link, schon erziele ich den selben Effekt. Oder ich klicke mit der rechten Maustaste und wähle „Link in neuem Fenster öffnen“ bzw. „Link in neuem Tab öffnen“. Will ich das nicht, klicke ich den Link ganz normal an und verbleibe in dem bisherigen Fenster. Wichtig ist, die Entscheidung obliegt ganz mir selbst.

Weniger erfahrene Surfer bemerken mitunter gar nicht, wenn sich ein neues Fenster in den Vordergrund schiebt. Der Effekt, dass der Surfer auf der eigenen Webseite verbleibt verschiebt sich dadurch womöglich in das Gegenteil. Der Browser-Button „Eine Seite zurück“ kann jetzt nicht mehr funktionieren, dass sich hinter dem aktuell geöffneten Fenster noch das Alte verbirgt bemerkt der Gelegenheitssurfer gar nicht mehr. Habe ich selbst so schon miterlebt, ebenso die Verwunderung als ich sagte, dann schließe doch dieses Fenster, dann bist du wieder zurück. Was? Wieso? Das erkläre einer mal einem Noob.

Dr. Jakob Nielsen beispielsweise führte bereits vor über zehn Jahren diese Unart auf Platz zwei seiner The Top Ten Web Design Mistakes, wobei auch Nummer eins, die Entfernung der „Zurück“ Funktion des Browsers wie schon erwähnt dazu gezählt werden muss. Dieser Punkt fällt mir immer mehr bei den modernen, „ajaxifizierten“ Webseiten auf, doch das ist ein anderes Thema.

Um das Problem zu lösen, hat das World Wide Web Consortium das target Attribut komplett aus seinen neueren Standards entfernt. Es funktioniert zwar immer noch, dieses einzusetzen, eine Seite validiert damit allerdings nicht mehr, d.h. man baut sich künstlich Fehler in seinen Quelltext ein. Nun kommen viele Webmaster auf die glorreiche Idee, wieder auf den anfangs erwähnten JavaScript Lösungen zurückzugreifen. Das ist sicherlich nicht Sinn der Sache.

Wie umgehe ich die Diktatur der Webseiten-Betreiber? Im Firefox gibt es in den Einstellungen die Option „Statt neuem Fenster neuen Tab öffnen“. Damit habe ich wenigstens nicht immer neue Browserinstanzen geöffnet, sondern wenigstens „nur“ neue Tabs. Doch auch das will ich nicht, also gebe ich in die URL Leiste about:config ein, um sämtliche Konfigurationsmöglichkeiten des Firefox Browsers zu sehen. Hier suche ich nach der Einstellung browser.link.open_newwindow.restriction. Mit dem Wert 1 öffnen ab sofort alle Fenster im gleichen Fenster, egal wie sich das die jeweilige Seite nun vorgestellt haben mag. Natürlich bleiben davon die Möglichkeiten der mittleren bzw. rechten Maustaste unberührt.





Spamschutz für ein phpBB Board

22 10 2007

Der Untergrundhandel mit Cybercrime-Dienstleistungen floriert und wirft für Hacker und Spammer viel Geld ab. Dabei finden sich wie im Supermarkt um die Ecke ebenso Lockangebote und Discount-Preise, berichten die Sicherheitsexperten von G Data im Vorfeld der ITK-Fachmesse Systems. “Die Professionalisierung der Online-Kriminellen ist nichts Neues. Wir haben es bereits seit Jahren mit einer Industrie zu tun, die im Internet kriminelle Dienstleistungen im großen Rahmen anbietet”, sagt Ralf Benzmüller, Leiter der G Data Security Labs, gegenüber pressetext. […]

Bereits für wenige hundert Euro sind gezielte Angriffe auf Webangebote oder der Versand von Millionen von Spam-E-Mails als Auftragsarbeit möglich. Die Cyber-Kriminellen operieren hierbei in Netzwerken, um möglichst viele Facetten der kriminellen Dienstleistungen aus einer Hand anbieten zu können. Kombinationsangebote auf dem Schwarzmarkt sind keine Seltenheit. Das Spektrum der Dienstleistungen ist dabei breit gefächert. 350 Euro kostet beispielsweise der Versand von 20 Mio. Spam-E-Mails. Für Schnäppchenjäger gibt es ein Starterpaket zum Preis von 140 Euro. Es beinhaltet ein Do-It-Yourself-Tool für den Eigenversand und fünf Mio. E-Mail-Adressen.

Quelle: http://pressetext.at/pte.mc?pte=071022014

In dem Textausschnitt dreht es sich hauptsächlich um die Email-Spammer. Ein in der Öffentlichkeit nicht so beachtetes Problem, aber doch ungemein ärgerlicher für jeden Webmaster einer Seite mit Kommentarmöglichkeiten von Besuchern stellt der Webseiten-Spam dar. Massenhaft werden hier Kommentare zu Blogs, Newsmeldungen und Diskussionsforen mit häufig nicht jugendfreier Werbung zugeschüttet. Besonders eingeschossen haben sich die Spambots auf phpBB Boards, die in großer Anzahl im Netz installiert sind und deren Spamschutz in der Version 2.x als recht schwach zu bezeichnen ist. Ein leicht gefundenes Fressen also für die Kriminellen, dem normalerweise nur mit großem Aufwand von Seiten der Webmaster zu begegnen ist.

Nun habe ich mich schon seit einiger Zeit mit dem Thema Webseitenspamming beschäftigt. Für eine Internetplattforum auf Grundlage des phpBB sollte eine möglichst einfache Lösung her, der Plage Herr zu werden.

Hier habe ich mir die normale Vorgehensweise der Spambots zunutze gemacht. Diese registrieren sich zuerst einen Mitgliedsnamen im Board, um damit anschließend ungehemmt spammen zu können. Diese Registrierung ist zwar durch ein Captcha gegen automatische Vorgänge geschützt, solche Grafiken können aber längst von den Bots gelesen werden. Genau da setze ich nun an. Die Bots versuchen immer, die dargestellte Grafik auf der Registrierungsseite zu entziffern und die Lösung zu übermitteln. Was macht der Bot aber, wenn er eben diese Zeichenfolge nicht eingeben darf? Genau, er scheitert und gibt irgendwann auf.

Deshalb verändere ich die Registrierung dahingehend, dass das Captcha zwar noch ganz normal angezeigt wird, ein erklärender Text aber darauf hinweist, dass genau dieser Code nicht eingegeben werden darf. Da die Bots aber auch nicht unfehlbar sind und evtl. durch die versehentliche Eingabe eines falschen Codes weiter kommen, ändere ich die Länge des einzugebenden Codes. phpBB Captchas sind immer sechs Zeichen lang, Bots geben also immer sechs Zeichen ein. Ich prüfe, ob ein fünfstelliger Code eingegeben wurde und leite die Registrierung nur dann weiter.

In der Datei includes/usercp_register.php suche ich nach der Zeile :

if ($row[‘code’] != $confirm_code)

und ersetze diese durch:

if (strlen($confirm_code) != 5)

Jetzt noch den erklärenden Text entsprechend anpassen. Dazu in der language/lang_german/lang_main.php suchen nach:

$lang[‘Confirm_code_explain’] = ‘Gebe den Code exakt so ein, wie du ihn siehst. Der Code unterscheidet zwischen Groß- und Kleinschreibung, die Null hat im Inneren einen schrägen Strich.’;

und ersetzen durch:

$lang[‘Confirm_code_explain’] = ‘Gebe eine beliebige fünfstellige Zeichenkette ein, aber NICHT die auf der Grafik abgebildeten!’;

Da viele Besucher vermutlich aus reiner Gewohnheit blind die Grafik abtippen, machen wir das Ganze durch eine optische Spielerei noch offensichtlicher. Das Eingabefeld für den Code erhält bei der Eingabe einen roten Hintergrund verpasst. Sobald sich fünf Zeichen im Feld befinden, ändert sich der Hintergrund im Ampelsystem in grün.

Hierfür kommen in den Stylesheets zwei neue Klassen hinzu. Dazu in der templates/subSilver/overall_header.tpl suchen nach:

input.post, textarea.post, select {
	background-color : {T_TD_COLOR2};
}

und ersetzen durch:

input.post, textarea.post, select {
	background-color : {T_TD_COLOR2};
}
input.postrot{
	background-color: #FFCC00;
}
input.postgruen{
	background-color: #00FF00;
}

Ein winziges JavaScript zeichnet zuständig für die Farbänderung je nach Status des Input-Feldes. In der templates/subSilver/profile_add_body.tpl (bei anderen Templates wird das Verzeichnis entsprechend anders lauten) ganz oben einfügen:

function PruefeLaenge(zeichen){
	if (zeichen < 1){
		document.forms[0].confirm_code.className="post";
	} else if (zeichen == 5){
		document.forms[0].confirm_code.className="postgruen";
	} else{
		document.forms[0].confirm_code.className="postrot";
	}
}

JavaScripts gehören zwar eigentlich in den Header einer Seite, aber ich wüsste keine vernünftige Möglichkeit, das mit dem phpBB zu realisieren, ohne den Code in jeder Seite einzubinden. Das wäre unnötiger Overhead, deshalb lebe ich einfach mit dieser Unschönheit.

Anschließend bringe ich dem Input-Feld noch bei, dass es die JavaScript Funktion auch nutzen soll. In der selben Datei suchen nach:

<input type="text" class="post" style="width: 200px;" name="confirm_code" size="6" maxlength="6" value="" />

und ersetzen durch:

<input id="confirm_code" OnKeyUp="PruefeLaenge(this.value.length)" type="text" class="post" style="width: 200px;" name="confirm_code" size="6" maxlength="6" value="" />