Monatsarchiv für Dezember 2009

 
 

PHP: seltener “goes to” Operator ( – – > )

PHP hat einen “goes to”-Operator. Die Integer-Variable $x geht dabei schrittweise Richtung Null. Beispiel:

<?php
$x = 10;
while ( $x --> 0 ) {
    echo $x . ' ';
}
?>

Ausgabe:

9 8 7 6 5 4 3 2 1 0

Sensationell. Im PHP-Manual wird dieser Operator nicht erwähnt. Warum? Weil es in Wirklichkeit zwei Operatoren sind. Geparst wird das ganze nämlich so:

<?php
$x = 10;
while ( $x-- > 0 ) {
    echo $x . ' ';
}?>

Und jetzt ist die Bedingung in der While-Schleife ein ganz normaler Post-Dekrement gefolgt von einem Vergleich. Das Ganze funktioniert also nur in die absteigende Richtung. Für die andere Richtung müsste man ++< schreiben – sieht dann aber nicht mehr so schick aus.

Wegwerf-E-Mail-Adressen: Sperrung umgehen

Anbieter für Wegwerf-E-Mail-Adressen gibt es viele. Ich persönlich bin Mailinator-Nutzer der ersten Stunde. Mailinator war immer zuverlässig und tut genau das was es soll: temporäre E-Mail-Postfächer bereitstellen.

Mailinator gehört zu den größten/bekanntesten Anbietern – und genau das ist auch das Problem. Viele Seiten, die eine Anmeldung mit gültiger E-Mail-Adresse fordern, blockieren die bekannten Wegwerf-E-Mail-Anbieter.

Aber es gibt Abhilfe. Statt @mailinator.com kann man auch jede andere Domain nehmen, deren MX-DNS-Eintrag auf den selben Mailserver zeigt, wie der von @mailinator.com. Doch wie ist die IP-Adresse des Mailinator-Mailservers?

$ dig MX mailinator.com
; <<>> DiG 9.5.1-P3 <<>> MX mailinator.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54319
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;mailinator.com.                        IN      MX

Wie wir sehen, sehen wir nichts. Hat eine Domain keinen MX-Record, so wird automatisch der A-Record als Mailserver angenommen:

$ dig A mailinator.com
; <<>> DiG 9.5.1-P3 <<>> A mailinator.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7356
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;mailinator.com.                        IN      A
;; ANSWER SECTION:
mailinator.com.         77483   IN      A       66.135.60.177

Blöd nur, wenn man mal eben keine Domain (Subdomain reicht auch) zur Hand hat, deren MX-Eintrag man auf die Mailinator-IP ändern kann. Zum Glück kann man bei DynDNS auch freie MX-Records vergeben:

mailinator

Isi manni! Bei “MX-Hostname” entweder mailinator.com, mail.mailinator.com (das war früher mal der MX von mailinator.com) oder direkt die IP (66.135.60.177) eintragen.

Statt irgendwas@mailinator.com kann man jetzt einfach irgendwas@dyndnsacc.kicks-ass.org verwenden. Somit umgeht man die Sperre zu 99%. Die Mails landen trotzdem direkt in der Mailinator-Inbox. Man könnte natürlich direkt den MX-Record prüfen und sperren, ist mir aber bisher auf noch keine Seite passiert. Let them eat spam!

AWStats: die eigenen Besuche ausschließen

AWStats analysiert Logfiles und erstellt nette Statistiken. So auch hier für diesen Blog. Um die schier unfassbare Menge an Visits auch nur im Ansatz zu begreifen, rödelt also jede Nacht AWStats durch die Apache-Logfiles. Das hat im Gegensatz zu Google-Analythics den Vorteil, dass die Daten schön hier lokal gespeichert werden. Außerdem erfolgt die Erfassung der Daten Serverseitig und nicht per Javascript. Das wird nämlich von vielen Usern einfach geblockt (Hallo <noscript>!).

Statistiken sind nie zu 100% genau. Dennoch stört mich, dass die eigenen Hits in den Statistiken auftauchen. Das lässt sich aber verhindern..

Methode 1: eigener vHost

Einfach einen zweiten VHost, z.b. dev.domain.com anlegen. Der VHost zeigt ins selbe Verzeichnis wie die Hauptdomain, hat aber eine extra Logdatei. AWStats wertet nur die Logs der Hauptdomain aus. Die Links auf der Webseite müssen dazu aber zwingend relativ sein – sonst landet man früher oder später wieder auf der Hauptdomain und wird “erfasst”.

Bei Wordpress stellte sich das schon mal als sehr schwierig heraus. Viele Links enthalten hier direkt den Domainnamen.

Methode 2: Apache conditional logging

Per conditional logging werden bestimmte Logeinträge erst gar nicht geschrieben. Als Kriterium kann z.B. die IP-Adresse verwendet werden. Mit DSL und daher dynamischer IP aber eher schwierig. Bleibt also nur noch der Cookie zur Identifikation. Wir setzen auf der eigenen Seite einen bestimmten Cookie, z.B. “DONTSTATME=true”. Dazu einfach in die Adressleiste des Browsers folgendes tippen:

javascript:document.cookie="DONTSTATME=true; expires=Sat, 17 Dec 2011 22:59:00 GMT"

Nach reload der Seite ist der Cookie gesetzt. Jetzt können wir das conditional logging konfigurieren:

SetEnvIf HTTP_COOKIE "(^| )DONTSTATSME=true($|;)" dontlog
CustomLog logs/access_log common env=!dontlog

Nachteil hier: Requests mit diesem Cookie werden jetzt gar nicht mehr geloggt. Nirgends. Generell eine schlechte Idee. Irgendwie. Außerdem legt Syscp pro VHost automatisch einen CustomLog-Eintrag an, der sich leider nicht so leicht um “env=!dontlog” erweitern lässt. Zumindest nicht ohne an der Source rumzufummeln.

Methode 3: Logfile greppen

AWStats akzeptiert auch Logfiles von einer Pipe: mit grep -v DONTSTATME=true /path/to/log würden bei AWStats nur “richtige” Hits ankommen. Dazu muss man den LogFile-Parameter der AWStats-Config folgendermaßen anpassen (/etc/awstats/awstats.domain.com.conf):

LogFile="grep -v DONTSTATME=true /path/to/access.log |"

Problem: Das Apache “combined”-Logformat loggt gar keine Cookies. Lässt sich aber leicht ändern. Wir öffnen die Datei /etc/apache2/apache2.conf und suchen die Zeilen mit “LogFormat”.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"" combined

Entweder die Zeile mit “combined” direkt abändern oder ein neues Logformat erstellen, z.B. combined-cookies.

Dann muss AWStats das neue Logformat noch mitgeteilt werden (/etc/awstats/awstats.domain.com.conf):

LogFormat = "%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %otherquot"

Apache restart/force-reload und alles ist gut. Vorausgesetzt man vergisst nicht den Cookie zu setzten, wenn man Methode 2 oder 3 verwendet.

Wie jetzt?

Jede Methode hat Ihre Vor- und Nachteile. Keine ist Perfekt. Ich bin noch am evaluieren :D Im Endeffekt müssen einfach nur insgesamt genug Hits vorhanden sein. Dann spielen die paar eigenen Visits auch keine Rolle mehr und man muss sich um das ganze Zeug keine Gedanken mehr machen. Solange das nicht der Fall ist, macht es durchaus Sinn, sich die Mühe zu machen und die eigenen Besuche auszuschließen.

Cineplex Reservierungssystem fail

Beim Cineplex Neckarsulm kann man unter http://212.20.182.131/ online Karten (Sitzplätze) reservieren. Nach kostenloser Registrierung kann man ebenfalls kostenlos bis zu vier Sitzplätze reservieren. Das ist natürlich viel zu wenig. Glücklicherweise nimmt es das System mit der Überprüfung der Formulardaten nicht so genau. Stichwort: Input Validation. Das ist die Überprüfung aller Nutzer-Daten auf Plausibilität hin: Ist die E-Mail-Adresse korrekt, ist die Postleitzahl 5-stellig oder in diesem Fall: liegt die Anzahl der zu reservierenden Sitze zwischen 1 und 4 ?

Formulare lassen sich auf Clientseite leicht manipulieren. Firebug bietet sich hier geradezu an. Firebug ist ein Firefox-Plugin, mit dem man unter anderem das DOM der Webseite einsehen und bearbeiten kann. Um die Anzahl der zu reservierenden Sitze leicht zu erhöhen, einfach mit dem Inspector auf das SELECT-Element klicken, und einen der Option-Werte anpassen. Opera kann das übrigens von  Hause aus: Darstellung -> Quelltext, <option> manipulieren, klick oben auf “Änderungen anwenden”.

cineplex1

Normalerweise sollten die Daten nach dem Absenden des manipulierten Formulars auf der Serverseite überprüft werden. Das ist hier aber offenbar nicht der Fall.

cineplex2

Schon besser.

Das Beispiel zeigt, dass eine Webanwendung grundsätzlich jedem User-Input misstrauen sollte und diese Daten niemals ungeprüft übernehmen sollte. Das betrifft nicht nur Formular-Daten sondern auch Cookie-Daten, GET/POST und sonstige, vom Nutzer übermittelte Daten.
Aber wer wird es dem armen ASP-Frickler Entwickler schon verübeln ..

Domains mit einem Domainrobot direkt registrieren

Domains gibt es überall. Meist direkt vom Server-Anbieter. Diese sind aber oft teurer als nötig und zudem ziemlich unflexibel zu verwalten. Wenn man mit dem Server zu einem anderen Anbieter umzieht, muss man alle Domains mitnehmen.

Das geht auch einfacher und billiger: mit einem Domainrobot. Voraussetzung hierfür ist zwingend ein Server mit Root-Rechten oder ein Provider, der externe Domains erlaubt.


Den ganzen Beitrag lesen…

Die Technik hinter diesem Blog: Hosting für Schwaben

Dieser Blog läuft auf einem vServer von Netcup. Dieser Prachtkerl für schlappe 1,69€/Monat hat stolze 100MB RAM (nein, da fehlt keine Null)  und 4GB HDD. Darauf läuft ein Debian Lenny Minimal-System mit Web-, Mail-, FTP- und Nameserver. Entsprechend konfiguriert bleibt auch noch ein wenig RAM übrig. Zumindest solange sich hier nicht allzu viel User tummeln. Keine Angst – im Moment geht’s noch ;)

Mit einem Gutscheincode, der sich relativ leicht über bekannte Suchmaschinen finden lässt, spart man noch 50% der Einrichtungsgebühr. Spätestens jetzt sollte selbst der geizigste Schotte feucht unterm Rock werden!

Die .de-Domain wurde über Regworld registriert. Für ebenfalls schwäbische 2,22€/Jahr.

So sieht das im Moment aus:

~$ free
             total       used       free
Mem:        102400      54196      48204
-/+ buffers/cache:      54196      48204
Swap:       102400          0     102400

Alles im allem bin ich bis jetzt von der Leistung des kleinen Servers positiv überrascht.  Mal sehen wie viel Wordpress er verträgt..

.tel-Domains

Neue Top-Level-Domains gibt es immer mal wieder. .tel ist die jüngste, .post wird wohl die nächste werden. Die .tel-Domain unterscheidet sich aber von allen bisherigen generischen TLDs.

Alle Informationen, die einer .tel-Domain zugeordnet sind, werden nicht auf einem Webspace gespeichert, sondern direkt im DNS. Es gibt bei .tel-Domains also kein Speicherplatz (“Web-Content”) und damit auch kein individuelles Layout. Außerdem sind keine E-Mail-Adressen möglich. Die Daten werden über ein einheitliches Webinterface verwaltet. Die URL zum Webinterface und die Zugangsdaten bekommt der Domaininhaber vom Registrar automatisch per E-Mail.

Suchmaschinen können die im DNS abgelegten, strukturierten Daten sehr gut indizieren. Deswegen kommen .tel-Domains auch recht oft unter die ersten Suchergebnisse.

So sieht eine reine DNS-Abfrage/Antwort mit dig oder nslookup aus:

$ dig any emma.tel
emma.tel.  3600    IN      SOA     d0.cth.dns.nic.tel. cth-support.support.nic.tel. 15 10800 3600 2592000 60
emma.tel.  86400   IN      A       194.77.54.2
emma.tel.  3600    IN      NS      s0.cth.dns.nic.tel.
emma.tel.  3600    IN      NS      t0.cth.dns.nic.tel.
emma.tel.  3600    IN      NS      a0.cth.dns.nic.tel.
emma.tel.  3600    IN      NS      n0.cth.dns.nic.tel.
emma.tel.  3600    IN      NS      d0.cth.dns.nic.tel.
emma.tel.  60      IN      TXT     "Emma Davis. Here is my new address:\010100 5th Avenue, New York, NY 10011."
emma.tel.  60      IN      TXT     ".tkw" "1" "bi" "" "jt" "Graphic Designer"
emma.tel.  60      IN      TXT     ".tkw" "1" "hi" "Salsa Dancing"
emma.tel.  60      IN      TXT     ".tkw" "1" "nl" "" "fn" "Emma" "ln" " Davis"
emma.tel.  60      IN      TXT     ".tsm" "1" "pddx" "1"
emma.tel.  60      IN      LOC     51 25 35.812 N 0 7 54.610 W 0.00m 10m 2m 2m
emma.tel.  60      IN      NAPTR   100 100 "u" "E2U+voice:tel+x-mobile" "!^.*$!tel:+16468889999!" .
emma.tel.  60      IN      NAPTR   100 101 "u" "E2U+voice:tel+x-work" "!^.*$!tel:+12125551234!" .
emma.tel.  60      IN      NAPTR   100 102 "u" "E2U+email:mailto" "!^.*$!mailto:emma@aol.com!" .
emma.tel.  60      IN      NAPTR   100 103 "u" "E2U+x-voice:skype" "!^.*$!skype:emma123!" .
emma.tel.  60      IN      NAPTR   100 104 "u" "E2U+web:http" "!^.*$!http://myspace.com/emadavis!" .

Kreative Servernamen

Bei der Vergabe von Servernamen wird ja oft nach einem bestimmten Schema vorgegangen: Hauptstädte, Sternzeichen, Charakter aus Filmen oder Serien.

Wie laaangweilig. Bei reddit [Link wird nachgereicht sobald ich den Beitrag wieder finde] habe ich von einem wirklich interessanten Schema erfahren: Servernamen werden nach den Elementen im Periodensystem der selbigen benannt.

Server #1 bekommt also den Namen “hydrogen” (Wasserstoff, 1 Proton), Server #2 dem Namen “helium” (2 Protonen) usw. Soweit schon mal nicht schlecht.

Jetzt muss noch das letzte Byte der IP-Adresse mit der Protonenanzahl übereinstimmen. Server #1 hätte also die IP-Adresse 192.168.0.1, Server #2 die 192.168.0.2 usw. Somit lässt sich von dem Servernamen direkt auf die IP-Adresse schließen (vorausgesetzt man hat das Periodensystem der Elemente so grob im Kopf :)).

Zudem kann man auch Aliasnamen im DNS anlegen, so dass das jeweilige Kürzel des Elements in die IP auflöst:

$ ping h
PING h (192.168.0.1) 56(84) bytes of data.
64 bytes from hydrogen.lokal (192.168.0.1): icmp_seq=1 ttl=64 time=0.023 ms

Wohoo! Leider nur in der Theorie wirklich nett. In der Wirklichkeit macht die Benennung nach Verwendung des Servers mehr Sinn (server-terminal, webserver, nasbox1, usw.). Die Beziehung zwischen Servername und IP-Adresse macht auch keinen Sinn. Zum einen haben die wenigsten das Periodensystem im Kopf, zum anderen wurde genau für diesen Zweck DNS erfunden: um Servernamen und IP-Adressen unabhängig voneinander zu machen. Der aufmerksame, chemie-affine Leser wird zudem die Begrenzung auf 118 unterschiedliche Servernamen bemängeln.

Sieve Mailfilter unter Debian Lenny mit Syscp und Dovecot

Mit Sieve können Serverseitig Filterregeln für E-Mails angelegt werden. So lassen sich z.B. Spam-eMails automatisch in einen SPAM-Ordner verschieben oder automatisch löschen.
Um eine Sieve-Regel zu erstellen, braucht man entweder einen Mail-Client mit Sieve-Unterstützung (z.B. Mozilla Thunderbird mit den Sieve-Plugin) oder einen Webmailer mit Sieve-Plugin (z.B. Squirrelmail mit avelsieve).

Voraussetzungen: Debian Lenny mit installiertem Syscp und Dovecot als MDA.

Die Dovecot-Version in Debian Lenny ist 1.0. Sieve ist erst ab Dovecot 1.1 fester Bestandteil – um mit Dovecot 1.0 Sieve zu nutzen, muss man Dovecot mit einem Patch neu kompilieren oder einen standalone managesieve-Server, wie z.B. pysieved verwenden.

Glücklicherweise ist Dovecot 1.2 als lenny-backport verfügbar. Und genau diese Version werden wir benutzen.


Den ganzen Beitrag lesen…

glTail mit Chipmunk 2D Physics unter Windows

glTail ist eine in Ruby geschriebene OpenGL-Anwendung zur Visualisierung von Logfiles in Echtzeit. So sieht das aus:

Nett! Das funktioniert praktisch mit jeder Logdatei (Webserver, Mailserver usw.) dank SSH auch auf entfernten Servern. Die Installation unter Windows ist leider nicht dokumentiert. Genauer gesagt ist gar nichts dokumentiert.

Um glTail unter Windows zum Laufen zu bringen ist etwas Handarbeit nötig. Da es mich selbst viel Nerven und Zeit gekostet hat, habe ich hier mal alle benötigten Schritte aufgeschrieben:


Den ganzen Beitrag lesen…