Das Putzlowitsch Test- und SEO-Blog

Strato PowerPlus mit SpeedPlus – Fehler bei der Remote-Adresse (REMOTE_ADDR)

Nachtrag am 22.01.2010:

Seit heute scheint das weiter unten geschilderte Problem mit der Remote-Adresse nicht mehr zu bestehen. Die Einträge in der .htaccess-Datei oder sonstige Eingriffe sind daher möglicherweise nicht mehr erforderlich.
Bei mir ist das Problem verschwunden, aber offensichtlich noch nicht generell.

Nachtrag am 01.03.2011:

Nach aktuellen Informationen ist das Problem wohl nun doch endgültig behoben worden. Die Einträge in der .htaccess-Datei oder sonstige Eingriffe sind daher nicht mehr erforderlich.

Seit Anfang Dezember 2009 bin ich mit meiner Schnurpsel-Seite wieder zurück zu Strato umgezogen. Ganz weg war ich ja nicht, ich hatte nur den Hostnamen bei einem anderen Anbieter aufgeschaltet. Aber seit es nun SpeedPlus bei Strato gibt, bin ich nun doch wieder zurückgekehrt.

Die Geschwindigkeit ist wirklich gut. Antwortzeiten von ungefähr 0,5 Sekunden gegenüber 3 bis 4 Sekunden vorher sind für ein PHP-Schwergewicht wie WordPress eine merkliche Verbesserung. Zudem wurde auch gleich das ohne-www-Problem beseitigt, in der Umgebungsvariable HTTP_HOST steht nun der tatsächlich im HTTP-Request angegebene host drin.

Die Remote-IP-Adresse (REMOTE_ADDR)

Neben allerlei anderen interessanten Informationen wird bei jedem Webseitenaufruf auch die IP-Adresse des Aufrufers in einer Umgebungsvariablen vermerkt. Auf diese kann z.B. mit Skriptsprachen wie PHP oder Perl als Variable „REMOTE_ADDR“ zugegriffen werden. Diese Remote-Adresse ist z.B. für statistische Auswertungen interessant oder kann beim Aussperren unerwünschter Zugriffe (Spam-Bots) helfen.

Allerdings zählt diese IP-Adresse ja nach Auffassung und Auslegung der Gesetze zu den personenbezogenen Daten und dürften dann eigentlich nicht gespeichert werden. Bei Strato werden die IP-Adressen in den den Kunden zur Verfügung gestellten Serverlogdateien in anonymisierter Form gespeichert. Auch die im Kundenmenü anzeigbare Webseiten-Statistik greift auf diese Daten zurück.
So können die Zugriffe zwar unterschieden aber nicht einem konkreten Anschluß zugeordnet werden

Mehr Geschwindigkeit mit SpeedPlus

Wenn ich die Grafik zu SpeedPlus bei Strato richtig deute, werden die Zugriffe nicht mehr direkt auf die Webserver geroutet, sondern von einem Loadbalancing-Cluster lastabhängig verteilt.
Diese Verteilung funktioniert vermutlich ähnlich wie bei einem nicht-transparenten Proxy, denn für den Webserver sieht es so aus, als würde der Strato-interne Server die Seite anfordern. Genau deshalb steht in der Remoteadresse nicht mehr die IP-Adresse des Aufrufers drin, sondern eine 81.169.145.xxx drin.

Komischerweise tritt der Effekt aber nicht bei allen Domains auf, nur die Hälfte meiner Domains (inkl. Subdomains) bei Strato ist davon betroffen.

Die richtige Remoteadresse ermitteln und setzen

Ich wäre ja nicht Schnurpsel, hätte ich nicht bereits eine Lösung für das Problem parat :-)
Die richtige IP-Adresse findet man im Request-Header-Feld X-Forwarded-For, daß heißt der Strato-Server trägt hier die Adresse ein, von der er die Anforderung erhalten hat.

In Skriptsprachen wie PHP oder Perl steht diese Variable als „HTTP_X_FORWARDED_FOR“ zur Verfügung. Hier könnte man sich die Remote-Adresse also einfach möglichst am Anfang (bei WP z.B. in der wp-config.php) der Abarbeitung in die REMOTE_ADDR eintragen, z.B. so:

if( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
  $ip_addr = @trim( @end( @explode( ",", $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) );
  if( '' != $ip_addr )
    $_SERVER['REMOTE_ADDR'] =  $ip_addr;
}

Hier kommen zwei wichtige Aspekte zum Tragen, denn in „X-Forwarded-For“ können mehrere durch Komma getrennte IP-Adressen stehen, sofern unterwegs mehrere Proxies durchlaufen wurden. Außerdem soll die Adresse nicht überschrieben werden, falls kein X-Forwarded-For-Feld existiert oder aus anderem Grund nicht ermittelt werden kann.

Für Perl könnte das etwa so aussehen:

if( $ENV{'HTTP_X_FORWARDED_FOR'} ne "" )
{
  my @ip_list = split(/,/, $ENV{'HTTP_X_FORWARDED_FOR'});
  $ENV{'REMOTE_ADDR'} = $ip_list[-1]; 
}

Nachteil ist hierbei natürlich, daß man alle Webapplikationen, die irgendwie die REMOTE_ADDR verwenden, entsprechend anpassen muß. Es geht aber auch noch einfacher und allgemeiner.

Umgebungsvariablen mit mod_setenvif setzen

Das Apache-Modul mod_rewrite kennen bestimmt viele WordPress-Nutzer, manch einer kennt vielleicht sogar mod_alias, aber vermutlich nur wenige haben schon mal etwas vom Modul mod_setenvif gehört. Es kommt auch ganz bescheiden und unspektakulär mit nur vier Anweiungen daher.

Mit dem Modul mod_setenvif hat man die Möglichkeit, Umgebungsvariablen abhängig von Request-Feldern zu setzen. Genau das brauchen wir hier. Wir haben das Request-Feld X-Forwarded-For und wollen abhängig davon die Umgebungsvariable REMOTE_ADDR setzen. Das Problem läßt sich mit ein bißchen Regular-Expression in einer Zeile in der .htacces erschlagen:

SetEnvIf X-Forwarded-For "(.+,)? *(.+)$" REMOTE_ADDR=$2

Optimalerweise steht diese Zeile ganz am Anfang einer .htaccess im Wurzelverzeichnis des Webpaketes. Dann wirkt sei auch auf alle Domains oder Subdomains, die ihr sichtbares Wurzelverzeichnis in einem Unterverzeichnis des Webspace haben.

Das schöne an diesem kleinen Eingriff ist, daß er auch auf das Serverlogfile und die Webstatistik wirkt. Im Logfile stehen nun wieder zwar anonymisierte, aber unterscheidbare Zugriffe und die Webstatistik zeigt nicht mehr 10000 Zugriffe von nur 5 Adressen an.

Ende gut, alles gut?

Mit ein bißchen Handarbeit kann man wieder mal einen Strato-Konfigurationsfehler ausbügeln. Andereseits ist die SpeedPlus-Plattform noch recht neu, da können solche Fehler schon mal auftreten. Ich habe das Problem auch bereits vor 10 Tagen an den Strato-Support gemeldet, warte aber immer noch auf die Antwort zu meinem Ticket. Scheint etwas komplizierter zu sein. Bis zur Strato-Problemlösung kann mein kleiner „Trick“ zumindest über die Zeit helfen.

7 Kommentare »

Bilderdiebe – was ich dagegen tue

Alter HutGut, das Thema des aktuellen Webmasterfridays ist zwar mit „Was tun bei Urheberrechtsverstößen?“ deutlich weiter gefaßt, als das es dabei nur um Bilder und Fotos ginge.

Der „Aufhänger“ war aber wohl der Bilderklau beim TagSeoBlog und so will ich mich hier auch nur auf dieses Problem beziehen.

Von Bilderdieben und Raubkopierern

Im richtigen Leben ist das alles klar und weitestgehend eindeutig definiert. Geht jemand in eine Gemäldegalerie, hängt dort heimlich ein Bild ab und nimmt es mit nach Hause, so ist das Diebstahl und derjenige ein Bilderdieb. Tut er so etwas zudem unter Anwendung von Gewalt oder Androhung von Gefahr für Leib oder Leben von Personen, so ist das Raub. Was nun genau ein Raubkopierer macht, ist mir allerdings nicht klar. Ich könnte mir aber vorstellen, daß das jemand ist, der z.B. eine bestimmte Ablauf eines bekannt gewordenen Raubes nachahmt, mithin also den Raub in der Vorgehensweise kopiert :-)

Beiden Delikten, Diebstahl und Raub, ist gemeinsam, daß es sich um die Wegnahme einer fremden beweglichen Sache handelt. Deshalb wird ein Diebstahl meist auch recht schnell bemerkt, denn der entwendete Gegenstand, z.B. das Gemälde, ist ja nicht mehr da.

Bildkopien und Hotlinking

In der digitalen Welt sieht das nun etwas anders aus, auch wenn hier unzutreffenderweise die Begriffe aus dem richtigen Leben verwendet werden. Denn normalerweise wird ein Bild ja nicht „entwendet“, so daß es plötzlich beim Besitzer fehlt, sondern nur eine Kopie angefertigt und an anderer Stelle verwendet (Bildkopie). Das führt auch dazu, daß die unrechtmäßige Verwendung eines Bildes erst sehr spät oder oft auch gar nicht bemerkt wird. Meist kommt so etwas nur eher zufällig ans Tageslicht.

Besonders im Internet wird oft noch nicht mal eine Kopie eines Bildes angefertigt, sondern das Bild einfach direkt von der fremden Seite eingebunden (Hotlink). Dadurch wird nicht nur das Bild möglicherweise unberechtigt verwendet, sondern auch noch der Server des „Bestohlenen“ belastet und ein zusätzliches Datenaufkommen erzeugt. Andererseits sind diese Hotlinks recht schnell zu erkennen, wenn man sich als Webmaster ab und zu die Serverlogfiles daraufhin ansieht.

Urheberrecht

UhrheberDie oben genannten Bildkopien bzw. das Hotlinking sind also kein Diebstahl oder gar Raub, sondern Verletzungen des Urheberrechtes.

Die wichtigsten Punkte im Urheberecht sind wohl Veröffentlichungs-, Verwertungs- und Folgerechte die es dem Schöpfer eines Werkes erlauben, allein darüber zu bestimmt, ob, wann, wo und in welcher Form sein Werk der Öffentlichkeit zugänglich gemacht und wie es im weiteren verwertet, verbreitet und vervielfältigt wird.

Meine Bilder

Im Allgemeinen habe ich nichts dagegen, wenn meine hier oder bei Putzlowitsch veröffentlichten Bilder von Dritten verwendet werden. Sei es nun in Communities, Foren oder anderen Blogs. Auch mit Hotlinks habe ich im Zeitalter von „unbegrenztem“ Traffic keine Probleme, ganz im Gegenteil, bin ich doch darüber schon auf die eine oder andere interessante Seite gestoßen.

Wenn nun aber meine Bilder dreist auf irgendwelchen Spam-Seiten landen oder in einem mir sonst wie nicht genehmen Kontext (z.B. rechtsradikale Foren) erscheinen, dann habe ich schon etwas dagegen. Da es bisher meist nur Hotlinks waren (bei Kopien habe ich es möglicherweise nur noch nicht bemerkt), gehe ich dagegen mit einer technischen Maßnahme vor.

Bilder-Hotlink unterbinden

Normalerweise sendet der Webbrowser eines Nutzers beim Aufruf einer Seite oder eines Bildes die Information mit, woher der Aufruf kommt. Bei einem Link ist das die verlinkende Seite oder bei einem sichtbaren Bild eben die Seite, auf der das Bild angezeigt wird. Diese Information, den so genannten REFERER kann der Webserver auswerten und gegebenenfalls bestimmte Aktionen ausführen. Das Ganze läuft über das Servermodul mod_rewrite und wird über die Datei .htaccess konfiguriert. Damit kann man dem Webserver z.B. sagen, daß wenn die Seite xyz aufgerufen wurde, er doch stattdessen bitte die Seite abc ausliefern oder einen Fehlercode zurückgeben soll.

Die einfachste und zugleich radikalste Variante, dem Hotlinking zu begegnen, ist folgender Dreizeiler:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?schnurpsel.de/.*$ [NC]
RewriteRule \.(gif|jpe?g|png)$ - [F,L]

So oder ähnlich findet man das auf vielen Webseiten als Empfehlung, wie man sich gegen das Hotlinking schützen kann. Die Strategie ist hierbei, allen die Zugriffe auf Bilder zu verbieten (3. Zeile), und nur Zugriffe von der eigenen Seite zuzulassen (2. Zeile). Die 1. Zeile nimmt etwas Radikalität wieder raus, denn auch wenn der Referer leer, also nicht bekannt ist, woher der Aufruf kam, werden die Bilder angezeigt. Ohne Zeile eins würde man z.B. alle Suchmaschinen-Bots aussperren und auch die User, deren Browser den Referer unterdrückt.

Unberechtigte Zugriffe werden hier vom Webserver mit dem Fehlercode „403 Forbidden“ quittiert, der Browser zeigt dann für ein Bild nur den Alternativtext (falls vorhanden) und eventuell ein Fehlersymbol an. Die Antwort ist klar und deutlich, der Zugriff ist verboten und wird verweigert.

Meine Hotlink-Strategie

Ich bin da nicht ganz so konsequent sondern fahre eine andere Strategie. Ich erlaube prinzipiell allen den Zugriff und schließe nur unerwünschte Seiten aus. Ich will ja nicht die vielen netten User von Jappy, Schnappy und Zappy daran hindern, sich gegenseitig ihre „Gästebücher“ mit Bildern vollzukippen :-)

Bei mir sieht die Hotlinkabwehr deswegen etwas komplizierter aus:

RewriteCond	%{REQUEST_FILENAME} -f
RewriteCond	%{REQUEST_URI}	!^/images/1x5120.gif$
RewriteRule	\.(jpg|gif|png)$	-	[NC,C]
RewriteCond	%{HTTP_REFERER}	hotlink\.schnurpsel\.de [NC,OR]
RewriteCond	%{HTTP_REFERER}	bilderdieb\.schnurpsel\.de [NC,OR]
RewriteCond	%{HTTP_REFERER}	xxxx-yyyy\.zz
RewriteRule	.	/images/1x5120.gif	[T=image/gif,L]

In der 1. Zeile wird geprüft, ob die angeforderte Datei überhaupt existiert. Falls nicht, soll nicht die Hotlink-Abwehr greifen, sondern die normale Fehlerbehandlung ablaufen.

Da ich nicht einfach den Statuscode 403 zurückliefern will, sondern ein Ersatzbild, wird in der 2. Zeile geprüft, ob nicht gerade das Ersatzbild angefordert wird. Dann darf die Hotlink-Abwehr nicht erneut anspringen, sonst gäbe es eine prima Endlosschleife.

Die 3. Zeile selektiert nur die Zugriffe, die ein Bild mit einer der angegebenen Datei-Erweiterungen betreffen, hier also jpg-, gif- und png-Bilder. Die Liste kann natürlich beliebig erweitert werden. Dabei kann man ein klein wenig optimieren, in dem man den Bildtyp nach der Reihenfolge ihrer Häufigkeit angibt. Da bei mir die meisten Bilder vom Typ jpg sind, brauchen die restlichen Einträge dann nicht mehr überprüft werden.

Mit den Zeilen 1 bis 3 werden Vorbedingungen geprüft und nur wenn die angeforderte Datei existiert, nicht das Ersatzbild ist und dem richtigen Dateityp entspricht, wird der Rest abgearbeitet.

Die Zeilen 4, 5 … n-1 enthalten die eigentlichen Bedingungen, wann ein Hotlink als böse einzuordnen ist. Hier wird auf den oben schon angesprochenen Referer Bezug genommen und jede Seite eingetragen, von der Hotlinks unerwünscht sind. Auch hier kann man etwas optimieren, indem man die häufigsten Seiten an den Anfang der Liste stellt. Man kann hier aber auch andere Bedingungen einsetzen, z.B. IP-Adressen. Eine ausführliche Beschreibung zum Apache-Rewrite-Modul findet man hier.

Die letzte Zeile n gibt dann nur noch das Ersatzbild aus, bei mir ein transparentes GIF-Bild mit einem Pixel Breite aber über 5000 Bildpunkten Höhe. Zu sehen ist es nicht, aber es reißt die Seite an der Stelle weit auseinander, ja nach dem, wie das Bild auf der Hotlinkseite eingebunden ist. Außerdem liefere ich, egal was für ein Bildtyp angefordert wird, immer das Gif-Bild aus. Deshalb wird noch der richtige Content-Type (image/gif) gesetzt.

So sieht es aus

Zur Demonstration habe ich mal zwei böse und eine gute Sub-Domain erstellt, damit man sehen kann, wie sich das Ersatzbild auswirkt.
Die gute Seite:
Der alte Hut
Die bösen Seiten:
Bilderdieb
Hotlink
Hinweis zu den bösen Seiten: Wenn man sich zuerst die gute Seite angesehen hat, dann wird auf einer der bösen Seiten möglicherweise trotzdem der Hut und nicht das Ersatzbild angezeigt. Das liegt am Caching durch den Browser. Man muß dann nochmal das Neuladen der Seite erzwingen, beim Firefox z.B. mit Shift+Reload-Button oder Strg+F5.

Vorerst reicht mir meine Hotlink-Abwehr per Ersatzbild für böse Seiten, die Seiten und Abrufe sind allerdings auch recht überschaubar. Problematisch wird es, wenn die Liste mit den Seiten gar zu lang wird, denn die muß der arme Webserver immer von oben bis unten abarbeiten. Das könnte sich dann mit schlechten Antwortzeiten und höherer Serverlast bemerkbar machen.

Nachtrag: Ich habe es nicht extra erwähnt, aber damit die Regeln überhaupt abgearbeitet werden, muß normalerweise die Rewrite-Engine eingeschaltet werden. Zudem sollte man prüfen, ob das Modul mod_rewrite überhaupt zur Verfügung steht. So sieht dann meine Variante komplett aus:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !/bilder/bild-foto/die-besten-bilder-der-welt.jpg$
RewriteRule \.(jpg|gif|png)$ - [NC,C]
RewriteCond %{HTTP_REFERER} bilderr\.com [NC,OR]
RewriteCond %{HTTP_REFERER} pictures-images\.com [NC,OR]
RewriteCond %{HTTP_REFERER} freeimages-de\.bloggum\.com [NC,OR]
RewriteCond %{HTTP_REFERER} zaggla\.com [NC]
RewriteRule . /bilder/bild-foto/die-besten-bilder-der-welt.jpg [T=image/jpg,L]
</IfModule>

Dieser Block sollte noch vor allen anderen Rewrite-Blöcken stehen, also auch vor den WordPress-Permalink-Eintrag.

21 Kommentare »

E-Mail bei Kommentar-Moderation

Wenn in WordPress die Kommentarmoderation aktiviert ist und die Option

Mir eine E-Mail schicken, wenn
[x] ein Kommentar auf Freischaltung wartet.

eingeschaltet wurde, erhält der Blogadmin an die Adresse, die bei „Allgemeinen Einstellungen“ als „E-Mail-Adresse“ eingetragen ist (normalerweise die bei der WP-Installtion angegeben) eine Nachricht über die anstehende Kommantarmoderation.

Das ist bei so einem „Ein-Mann-Blog“ wie diesem hier auch kein Problem, denn ich bin Adminstrator, Herausgeber, Redakteur und Autor in einer Person. Bei Blogs mit mehreren oder vielen Autoren, Redakteuren und Herausgebern wird das aber zum Problem, wenn die ganze Last der Moderation vom Kommentaren nur auf einem Paar Schultern ruht. In WordPress selbst gibt es aber keine Option, mit der man festlegen könnte, das alle User mit der Berechtigung, Kommentare zu moderieren, eine entsprechende Nachricht erhalten.

Plugin 123 Moderate Comment NotificationDas Schöne an WP ist, daß man nahezu alles, was irgendwie fehlt, mit einem Plugin nachrüsten kann. Und so habe ich kurzerhand das Plugin „123 Moderate Comment Notification“ geschrieben. Im Bereich der Einstellungen hat man drei Optionen:

  • Administrator immer informieren
  • Autor informieren, wenn er Kommentare moderieren darf
  • Moderatoren informieren, falls Autor selbst nicht moderieren darf

Wobe mit „Moderatoren“ hier alle registrieren Blognutzer gemeint sind, die die Berechtigung zum moderieren von Kommentaren haben. Normalerweise sind das Nutzer mit der Rolle „Administrator“ oder „Herausgeber/Redakteur“.

Heute hat sich das Plugin bereits zum ersten Mal in einem Mehrautoren-Blog erfolgreich bewährt.

7 Kommentare »

WordPress ab 2.1 – Optionen für die Startseite

Wordpress Einstellungen Lesen Startseite
Ab WordPress Version 2.1 gibt es die Möglichkeit, als Startseite eine statische Seite anstelle der normalen Blogbeiträge festzulegen.
Dafür gibt es unter ‚Einstellungen‘->’Lesen‘ die Optionen für ‚Startseite‘:

(  ) Deine letzten Beitäge
(•) Eine statische Seite (unten auswählen)
        • Startseite: [Start      [▼]]
        • Beitragsseite: [Blog      [▼]]

Das ist weitestgehend selbsterklärend. Mit ‚Eine statische Seite‘ aktiviert man die statische Startseite, obwohl die durchaus auch eine gewisse Dynamik haben kann, wie ich das hier beschrieben habe. Bei ‚Startseite‘ wählt man, ja genau, die künftige Startseite aus den bisher erstellten statischen Seiten aus.

Nun möchte man aber bestimmt den Lesern auch die Blogbeiträge in der gewohnten Form präsentieren, und nicht nur auf das Archiv, den Kalender oder die Kategorien verweisen. Genau hier kommt die zweite Auswahlmöglichkeit ‚Beitragsseite‘ ins Spiel. Am besten man erstellt sich eine weitere Seite und gibt ihr z.B. den Titel „Blog“. Diese kann man nun für ‚Beitragsseite‘ auswählen und fortan wird das Blog wie sonst auf der Startseite auf eben dieser Seite angezeigt, inklusive der Möglichkeit, seitenweise vor- und zurückzublättern.

Ja, feine Sache würde ich sagen, an der Stelle mal ein Lob an die WP-Entwickler. Bin schon auf die Version 2.3 gespannt…

Weitere Artikel mit Bezug zu diesem:
9 Kommentare »