Online Text to Speech Dienste

24 09 2012

Vielleicht hat der ein oder andere schon einmal eines dieser Anonymous-Videos gesehen. Die Texte werden von einer künstlichen Stimme vorgelesen, damit kein Rückschluss auf die reale Person möglich ist. Wie erzeugt man solche Audios? Es gibt einige Programme, mit denen man geschriebene Texte in Sprache umwandeln kann. Doch es geht auch ohne vorige Installation, im Netz finden sich Dienste die dies kostenpflichtig, teilweise sogar kostenlos anbieten. Schauen wir uns einige Anbieter doch einmal an. Dabei betrachte ich nur solche, die auch eine deutsche Stimme in der Auswahl haben.

Zum Test der Dienste nutze ich einen etwas komplexeren Text, um die Leistungsfähigkeit entsprechend beurteilen zu können:

Die Infinitesimalrechnung ist eine von Leibniz und Newton unabhängig voneinander entwickelte Technik, um Differential- und Integralrechnung zu betreiben. Sie liefert eine Methode, eine Funktion auf beliebig kleinen (d. h. infinitesimalen) Abschnitten widerspruchsfrei zu beschreiben. Frühe Versuche, unendlich kleine Intervalle quantitativ zu fassen, waren an Widersprüchen und Teilungsparadoxien gescheitert.

Sitepal

Demo (auf 200 Zeichen begrenzt)
Bietet einen sprechenden Avatar für die eigene Homepage. Als Gimmick kann man sogar sein eigenes Foto als Avatar einfügen. Enthalten sind sehr viele Sprachen und Stimmen. Sehr gute Qualität.

Linguatec

Demo (auf 250 Zeichen begrenzt)
Kann als Sprachausgabe eigener Texte und zum Vorlesen von Webseiten eingesetzt werden. Enthält viele Sprachen und maximale eine weibliche und eine männliche Stimme. Sehr gute Qualität.

iSpeech

Demo (auf 200 Zeichen begrenzt)
Kann neben der Konvertierung von Text in natürliche Sprache oder zum Vorlesen von Webseiten auch von Entwicklern in ihren Anwendungen zur Sprachausgabe genutzt werden. Die Geschwindigkeit der Ausgabe anzupassen ist vielleicht nicht zwingend sinnvoll, aber auf jeden Fall äußerst lustig. Enthält viele Sprachen und maximale eine weibliche und eine männliche Stimme. Sehr gute Qualität.

ImTranslator

Demo (auf 1.000 Zeichen begrenzt)
Eigentlich ein Dienst um Texte in andere Sprachen zu übersetzen, kann er diese auch Vorlesen. Relaiv wenige Sprachen und akzeptable Qualität

SpokenText

Demo (auf 300.000 Zeichen begrenzt, was meist ausreichend sein sollte).
Es muss ein kostenloser Account angelegt werden. Da keine Bestätigung notwendig ist, kann man aber eine Fantasie E-Mail Adresse verwenden. Kann Texte, Dokumente und Webseiten in Sprache konvertieren. Enthält vergleichsweise wenige Sprachen. Die Konvertierung dauert relativ lange und die Qualität ist nicht besonders gut. Die erzeugten MP3s können heruntergeladen oder öffentlich gemacht werden. Der kostenlose Account wird nach einer Woche wieder gelöscht und enthält weitere Einschränkungen.

YAKiToMe!

Demo
Die Grundfunktionen sind kostenlos. Hauptsächlich zur Vertonung von Text zu Podcasts gedacht. Akzeptable Qualität. Mit einem kostenlosen Account können die erzeugten MP3 oder Ogg Dateien auch herunterladen werden. Da keine Bestätigung notwendig ist, kann man eine Fantasie E-Mail Adresse verwenden. Wenige Sprachen und jeweils eine weibliche und eine männliche Stimme. Umstellen kann man die Sprache etwas versteckt über das Schraubenschlüsselsymbol im Text-Fenster.

Pediaphon

Demo
Kostenlos. Eigentlich dafür gedacht, Texte aus Wikipedia vorzulesen. Hier kann man allerdings auch eigene Texte eingeben und das Ergebnis hinterher als MP3 oder Ogg herunterladen. Ein paar Sprachen und jeweils mehrere Stimmen. Qualität nicht besonders gut.





Social Web – Die Alternativen: Teil 1 – Chats

10 09 2012

Social Web – Die Alternativen: Teil 1 – Chats
Social Web – Die Alternativen: Teil 2 – Filesharing
Social Web – Die Alternativen: Teil 3 – Mikroblogging

Dass Facebook böse ist, sollte inzwischen auch bei dem letzten Hinterwäldler angekommen sein. Verlinkungen zu entsprechenden Artikeln erspare ich mir hier, da man die Liste mit den Vergehen, die der US-Konzern unseren persönlichen Daten antut fast unendlich erweiterbar wäre. Klar muss lediglich sein, Facebook verdient sein Geld, indem sie möglichst umfassend Daten über uns sammeln. Nur um diese Informationen zu speichern, betreibt der Laden eigene Rechenzentren mit ungeahnten Datenmengen über unser privates Leben.

So weit so schlecht. Nun zwingt einen niemanden, bei Facebook mitzumachen. Die Frage ist nur, warum tut es dann doch praktisch jeder? Weil es keine Alternativen gibt, bekomme ich immer wieder zu hören. Oh doch, die gibt es. Allerdings gehören selbsternannte Experten, die einen Wechsel zu Google+ anraten idealerweise den ganzen Tag geohrfeigt. Das Ziel, das Google mit der Bereitstellung seiner sozialen Plattform verfolgt ist nämlich genau das Selbe. Sammlung unserer Daten. Dann können wir also doch beim blauen Riesen bleiben? Nein!

Doch fangen wir von vorne an. Zu den Zeiten des Web 1.0, vor Erfindung der sozialen Plattformen, da kommunizierten die Menschen in Chats. Teilweise sehr extensiv, das hat heute doch merklich nachgelassen. Tot ist diese Technik deshalb noch lange nicht. Den meisten Chats, die es auch heute noch gibt ist eines gemein: Sie speichern die Logs unserer Unterhaltungen. Die Betreiber und teilweise unabhängige Chat-Admins können also unsere vermeintlich privaten Gespräche mitlesen. Aufgrund fehlender Sicherheitsvorkehrungen bzw. Verschlüsselungen ist es zudem theoretisch für gänzlich unbefugte Dritte möglich, die teils doch sehr persönlichen Diskussionen abzuhören.

Damit dies nicht passieren kann, muss der Traffic zwischen den kommunizierenden Parteien verschlüsselt werden. Als bekanntes Projekt sei Cryptocat genannt, einst ein Webchat, das es inzwischen zur Steigerung der Sicherheit nur noch als Chrome-Plugin gibt, eine Version für Android soll folgen. Sämtliche Informationen werden mit AES-256 stark verschlüsselt über das Netz gesendet. Trotz ein paar kritischer Stimmen, dass auch dieses System angreifbar sei für unsere Zwecke, die wir ja nichts Verbotenes im Schilde führen für den Anfang sicherlich ausreichend.

Nun wollen die Massen aber wohl leider nicht auf die Kommunikation via Facebook verzichten. Bedenke, alles, was du dort schreibst, wandert in die Datenbanken des US Unternehmens. Und fließt von dort weiter in wer weiß welch suspekte Ziele. Doch auch die Facebook Junkies können sich ohne größeren Aufwand schützen. Dazu machen wir uns die Eigenschaft zunutze, für den Chat einen Instant Messenger einsetzen zu können. Hierzu benötigen wir zunächst den Instant Messenger Pidgin. Wie üblich zeige ich die Installation nur unter Linux, dies ist unter Windows natürlich ebenso möglich.

$ sudo apt-get install pidgin

Pidgin ermöglicht es uns, über verschiedene Protokolle zu chatten. Diese sind grundsätzlich nicht wirklich abhörsicher, weshalb wir zusätzlich das Off-the-Record Messaging (OTR) Protokoll zur Nachrichten-Verschlüsselung benötigen.

$ sudo apt-get install pidgin-otr

Wir starten den Messenger. Sofern wir noch kein Konto eingerichtet haben, werden wir gleich aufgefordert, dies zu tun. Im ersten Bildschirm klicken wir auf „Hinzufügen“. In der nächsten Maske füllen wir die Felder im Reiter „Einfach“ gemäß den offiziellen Vorgaben entsprechend aus:

Protokoll: XMPP
Benutzer: Dein Facebook Nutzername, hier zu finden
Domäne: chat.facebook.com
Ressource: Pidgin
Passwort: Dein Facebook Passwort

Den Reiter „Erweitert“ prüfen wir, damit das mit der sicheren Übertragung auch hinhaut.
Verbindungssicherheit: Verschlüsselung benutzen, wenn verfügbar
Verbindungs-Port: 5222
Verbindungs-Server: chat.facebook.com
Proxys für Dateiübertragungen: proxy.eu.jabber.org

Ein Klick auf „Hinzufügen“ erstellt unser Konto. Jetzt aktivieren wir die OTR Erweiterung über das Menü „Werkzeuge“ -> „Erweiterungen“ ([STRG] + [U]) und setzen das Häkchen vor „Off-the-Record Messaging“. Einen Schlüssel benötigen wir noch, also klicken wir auf „Erweiterung einrichten“, dann „Generieren“. Dieses Fenster können wir sodann wieder schließen.

Öffnen wir eine Unterhaltung mit einem Freund, ist diese noch nicht verschlüsselt. Nachdem wir ein paar Worte unverfänglich mit unserem Gegenüber geplaudert haben, können wir diesen im Chatfenster über „OTR“ -> „Buddy authentifizieren“ bestätigen. Absolute Grundvoraussetzung ist natürlich, dass der Gegenpart ebenfalls einen OTR fähigen Client verwendet. Hier haben wir drei Möglichkeiten, welche man davon wählt bleibt einem selbst überlassen. Die Antwort sollte man selbstverständlich gesichert übermitteln, also idealerweise flüstert man sich das gegenseitig ins Ohr. Ist die Authentifizierung geglückt, sollte uns Pidgin eine gesicherte Verbindung anzeigen. Mehr Informationen finden sich auf der offiziellen OTR Projektseite.





MySQL Datenbanken über SSH ex- und importieren

26 08 2012

phpMyAdmin mag ein ganz praktisches Tool sein was die Administration von MySQL Datenbanken im Web anbelangt. Für einen Zweck taugte das Tool jedoch noch nie, nämlich für den Import größerer Datenmengen. Hier war das Zeitlimit des Webserver immer das Problem, selbst wenn neuere Versionen inzwischen einen Import wiederaufnehmen können. Abhilfe schaffte für mich immer BigDump, das jeweils nur eine begrenzte Anzahl von Zeilen lädt und sich dann selbst erneut aufruft, um die nächste Datenportion anzugehen.

Inzwischen braucht es häufig glücklicherweise nicht mehr einen eigenen Server mit Root-Zugang, viele Hoster bieten bereits bei kostengünstigen Shared-Hosting Offerten einen SSH Zugang mit an. Dank diesem stellt das Transportieren größerer Datenmengen von einer Datenbank in eine Andere kein Problem mehr dar. Ich zeige das im Folgenden exemplarisch für all-inkl.com.

Wir melden uns bei unserer Verwaltungsoberfläche KASserver an. Hier wählen wir den Menüpunkt „Tools“, dann „SSH-Zugänge“. Ist dies bisher noch nicht geschehen, richten wir uns einen SSH Zugang ein und merken uns den Benutzernamen wie auch das Passwort. Damit können wir uns auf der Shell gleich einloggen mittels Eingabe von

ssh [BENUTZERNAME]@[DOMAIN]

Natürlich möchten wir uns das Leben möglichst einfach machen und die folgende Aufforderung zur Eingabe des Passworts los werden. Dazu legen wir uns ein SSH Schlüsselpäärchen an. Um die Schlüssel zu schützen kann man, muss aber kein Passwort vergeben. Ich habe die Passphrase leer gelassen.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaaaa/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/aaaaa/.ssh/id_rsa.
Your public key has been saved in /home/aaaaa/.ssh/id_rsa.pub.
The key fingerprint is:
00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 aaaaa@aaaaa-ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
[...]
+-----------------+

Wir sollten nun zwei Dateien im Verzeichnis .ssh innerhalb unseres Home-Verzeichnisses vorfinden. Die id_rsa ist die private Schlüssel-Datei, die nicht in fremde Hände gehört. Die id_rsa.pub ist die öffentliche Datei, die wir auf den entfernten Server bringen müssen. In der known_hosts werden die Fingerabdrücke der Server gespeichert, auf denen wir schon eingelogggt waren, damit wir den Zugriff nicht jedes Mal aufs Neue bestätigen müssen.

$ ls -l ~/.ssh
insgesamt 36
-rw------- 1 aaaaa aaaaa 1675 Jul 29 14:21 id_rsa
-rw-r--r-- 1 aaaaa aaaaa  400 Jul 29 14:21 id_rsa.pub
-rw-r--r-- 1 aaaaa aaaaa 2042 Jul 29 14:30 known_hosts

Nun kopieren wir die Datei id_rsa.pub in die Datei authorized_keys auf dem Server. Sollte diese bereits existieren, können wir diese nicht einfach so kopieren, da die alten Inhalte damit überschrieben werden. Dann müssen wir die Datei mit anderem Namen auf den Server übertragen und dann den Inhalt ans Ende der authorized_keys anhängen.

$ scp ~/.ssh/id_rsa.pub [BENUTZERNAME]@[DOMAIN]:~/.ssh/authorized_keys
ssh-00000000@example.org's password: 
id_rsa.pub                                    100%  400     0.4KB/s   00:00  

Loggen wir uns jetzt erneut ein, wird unsere Berechtigung über das Schlüsselaar geprüft. Damit haben wir uns die Passworteingabe erspart.

$ ssh ssh-0000000@example.org
Last login: Sun Aug 25 14:43:15 2012 from example.net

Auf dem Server angekommen ist es ein Leichtes, die Datenbank zu exportieren. Wir nutzen dazu das Binary mysqldump.

$ mysqldump [DATENBANK] --user=[BENUTZERNAME] --password >/tmp/dbexport.sql
Enter password:

$ ls -lh /tmp/
-rw-r--r-- 1 ssh-00000000 aaaaa 31642952 2012-07-29 14:56 dbexport.sql

Theoretisch könnten wir das Passwort für die Datenbank auch direkt auf der Befehlszeile mitgeben. Da dieses dann aber auch in der Historie gespeichert wird, halte ich das für ein unnötiges Sicherheitsrisiko. mysqldump bietet noch viele weitere Möglichkeiten, beispielsweise nur bestimmte Tabellen auszugeben. Die Hilfe beschreibt alle Optionen:

mysqldump --help

Zurück auf unserem Computer müssen wir die Datei nur noch übertragen. Dazu nutzen wir scp.

scp -C [BENUTZERNAME]@[DOMAIN]:[/pfad/zur/dbexport.sql] .

Da die Datei dann immer noch unnütz auf dem Server herumliegt, Platz verbraucht und im schlimmsten Fall von böswilligen Besuchern entwendet werden könnten, verknüpfe ich gleich noch das Löschen der Remote Datei

$ MYSERVER=ssh-0000000f@example.org; DUMP=/pfad/zur/dbexport.sql; scp -C ${MYSERVER}:${DUMP} . && ssh ${MYSERVER} "rm ${DUMP}"
dbexport.sql                                  100%  156MB   6.2MB/s   00:25 

Jetzt geht es an den Import in die zweite Datenbank. Ich gehe davon aus, dass diese leer ist oder zumindest die Tabellen, die importiert werden sollen noch nicht existieren. Falls doch ist Vorsicht geboten, da mysqldump per Default ein DROP TABLE in die Export-Datei einfügt. Vorhandene Tabellen werden also unwiederbringlich gelöscht. Diese Option lässt sich natürlich auch deaktivieren, sollte das nicht gewünscht sein.

Am Einfachsten finde ich hier, mysql aufzurufen, die Datenbank inklusive Benutzernamen anzugeben in die wir die Daten laden möchten und die Export-Datei in den geöffneten Stream zu schicken.

$ mysql --database=[DATENBANK] --user=[BENUTZERNAME] --password <[/pfad/zur/dbexport.sql]

Auf diese Art kann ich innerhalb weniger Minuten eine mehrere hundert MB umfassende Datenbank in mein Testsystem überspielen. Schneller und bequemer wäre das mit anderen, auch kostenpflichtigen Tools kaum machbar.





Mailadressen vor Spam-Bots schützen

10 05 2012

Die Punkkonzerte Datenbank bietet unter anderem auch ein umfangreiches Verstanstalter-Verzeichnis. Zu den Informationen gehört unter anderen eine Mail-Adresse, über die die verschiedenen Veranstalter zu erreichen sind. Nun wäre es dank der zahlreichen Spammer, die ihre Bots das Netz nach E-Mail Adressen durchforsten lassen, ziemlich fahrlässig, diese Informationen frei ins Netz zu stellen. Es würde nicht lange dauern, bis die Adressen von Spam überflutet werden. Von daher sollte bei der Angabe einer Mailadresse immer deren Schutz vor Missbrauch im Vordergrund stehen. Dazu gibt es verschiedene Ansätze, doch welche davon ist wirklich ideal?

Standardkonformes Einbinden

So ist die Einbindung einer Mailadresse vorgesehen. Das wissen natürlich auch die Spammer und suchen genau hiernach.

Beispiel:

<a href="mailto:aaaaaprvdgrwwelt@example.org">E-Mail senden</a>

Ausgabe:
aaaaaprvdgrwwelt@example.org

Vorteile:
– Standard-Methode
– Keine Probleme mit exotischen Browser-Konfigurationen zu erwarten
– Sehr einfach einzubinden

Nachteile:
– Einfacher kann man es den Spammern nicht mehr machen, an die Mailadressen zu gelangen

Hinzufügen von Text

Hier fügt man einfach einen Text zur Mailadresse dazu, der nicht hier hin gehört. Idealerweise erfolgt noch eine Erklärung, dass dieser Text zu löschen / umzuwandeln ist.

Beispiel:

<a href="mailto:aaaaaprvdgrwwelt(AT)example(PUNKT)org">E-Mail senden</a>
<a href="mailto:aaaaaprvdgrwweltKEINSPAM@example.org">E-Mail senden</a> (KEINSPAM bitte löschen)

Ausgabe:
E-Mail senden
E-Mail senden (KEINSPAM bitte löschen)

Vorteile:
– Simple Umsetzung

Nachteile:
– Nutzer müssen selbst den Text in der Mailadresse ersetzen
– Weniger versierte Nutzer wissen damit nichts anzufangen
– Unsicher, Spam Bots können die gebräuchlichsten Varianten erkennen und umwandeln

Umwandeln der Zeichen in Hex Codes

Um nicht ganz so offensichtlich eine Mailadresse zur Schau zu stellen, kann man diese auch in der  Hexadezimal-Schreibweise in die Quelle einfügen. Die Umwandlung dürfte den Spammern jedoch ähnlich leicht fallen wie einem anzeigenden Browser.

Beispiel:

<?php

$email = 'aaaaaprvdgrwwelt@example.org';
$email_laenge = strlen($email);
for ($i=0; $i < $email_laenge; $i++){
	$email_verschluesselt .= '%'.dechex(ord($email[$i]));
}
echo '<a href="mailto:'.$email_verschluesselt.'">Nachricht senden</a>';

Ausgabe:
E-Mail senden

Vorteile:
– Simple Umsetzung
– Link ist klickbar

Nachteile:
– Sehr unsicher, hier könnte man die E-Mail eigentlich auch gleich offen ins Netz stellen

Mittels CSS

Auch CSS bietet die Möglichkeit, eine Mailadresse einzubinden, die so nicht in der Quelle zu finden ist. Leider unterstützen nicht alle Browser diese Technologie.

Beispiel:

<html>
<head>
<style type="text/css">
/* \40 steht fuer das "@" Symbol */
#email:after{
content: " <aaaaaprvdgrwwelt\40 example.org>";
}
</style>
</head>

<body>
<p id="email">E-Mail senden</p>
</body>
</html>

Ausgabe:
E-Mail senden <aaaaaprvdgrwwelt@example.org>

Vorteile:
– Relativ simple Umsetzung

Nachteile:
– Funktioniert NICHT im Internet Explorer
– Text nicht mit der Maus selektierbar
– Link nicht klickbar
– Mit etwas Aufwand sollten Spam-Bots damit umgehen können

JavaScript Verschlüsselung

Mittels JavaScript kann man nach dem Laden des eigentlichen Dokuments dynamisch erst die E-Mail Adresse einbinden. Eine andere Alternative wäre, eine Mailadresse, die in der HTML Quelle als aaaaaprvdgrwwelt [BEI] example [PUNKT] org durch JavaScript zu modifizieren, so dass letztendlich wieder die korrekte Adresse heraus kommt.

Beispiel:

<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script>
$(document).ready(function () {
    jQuery.fn.createMail = function () {
        this.each(function () {
            var addr = $(this).text().replace(" \[BEI\] ", "@").replace(" \[PUNKT\] ", ".");
            $(this)
                .after('<a href="mailto:' + addr + '">' + addr + '</a>')
                .remove();
        });
    };
    $(".email").createMail();
});
</script>
</head>

<body>
<span class="email">aaaaaprvdgrwwelt [BEI] example [PUNKT] org</a>
</body>
</html>

Ausgabe:
aaaaaprvdgrwwelt@example.org

Vorteile:
– Relativ Sicher

Nachteile:
– Recht hoher Aufwand zur Einbindung
– JavaScript muss beim Nutzer aktiviert sein
– Spam Bots, die einen JavaScript-fähigen Browser einsetzen können die Adresse immer noch lesen.

reCAPTCHA Mailhide

Den Captcha-Dienst von Google gibt es auch speziell für E-Mail Adressen. Es wird nur ein Auszug der Adresse angezeigt, die vollständige E-Mail erhält man erst nachdem ein Captcha gelöst wurde.

Achtung, der Fehler
Warning: pack() [function.pack]: Type H: illegal hex digit L in /www/htdocs/demo/recaptchalib.php on line 237
rührt von einem falschen Key. reCAPTCHA verwendet unterschiedliche Keys für das normale Captcha und Mailhide, diese können also nicht mehrfach verwendet werden. Der API Key muss hier angefordert werden: http://www.google.com/recaptcha/mailhide/apikey

Beispiel:

<?php

require_once ("recaptchalib.php");

$mailhide_publickey = "000000000000000000000000==";
$mailhide_privatekey = "00000000000000000000000000000000";

$mailhide_html = recaptcha_mailhide_html($mailhide_publickey, $mailhide_privatekey, "aaaaaprvdgrwwelt@example.org");
$mailhide_url = recaptcha_mailhide_url($mailhide_publickey, $mailhide_privatekey, "aaaaaprvdgrwwelt@example.org");

echo <<<AUSGABE
$mailhide_html<br />
<a href="$mailhide_url">E-Mail anzeigen</a>
AUSGABE;

Ausgabe:
aaaa@example.org
E-Mail anzeigen

Vorteile:
– Sehr sicher

Nachteile:
– Erfordert einen externen Dienst
– Umständlich zu lösen

  

Anzeige als Grafik

Um den Bots überhaupt keinen Angriffspunkt im Quelltext zu bieten, kann man die Adresse auch als Grafik ausgeben. Hierzu muss für jede einzelne Adresse eine Grafik erzeugt werden. Diese kann dann ggf. in den Cache gelegt werden.

Beispiel:

<img src="email.php?email=1" alt="E-Mail senden" />

email.php:

<?php

// Hier sollte die Adresse eigentlich aus einer Datenbank gelesen werden
$email = isset($_GET['email']) && is_numeric($_GET['email']) && $_GET['email'] == 1 ? 'aaaaaprvdgrwwelt@example.org' : 'Keine E-Mail';

$char_width = 7;
$char_height = 10;
$padding = 3;
$width = $padding * 2 + strlen($email) * $char_width;
$height = + $padding * 2 + $char_height;
$bild = imagecreatetruecolor($width, $height);
imagealphablending($bild, FALSE);
imagesavealpha($bild, TRUE);
$bg = imagecolorallocatealpha($bild, 255, 255, 255, 127);
$text = imagecolorallocatealpha($bild, 0, 0, 0, 0);
imagefilledrectangle ($bild, 0, 0, $width, $height, $bg);
imagestring($bild, 3, $padding, $padding, $email, $text);

header('Content-type: image/jpg');
imagepng($bild);
imagedestroy($bild);

?>

Ausgabe:

Vorteile:
– Recht sicher, Bots müssten OCR unterstützen – was aber nicht unmöglich ist

Nachteile:
– Text nicht auswählbar
– Link nicht klickbar

Was nun letztendlich der Weisheit letzter Schluss ist kann ich selbst nicht endgültig beantworten, lediglich unsichere Methoden wie die Hex-Schreibweise oder CSS ausschließen. Im Endeffekt haben alle Lösungen ihre Stärken und Schwächen, so dass man sich selbst für seinen Weg entscheiden muss. Im Fokus sollte hierbei jedoch immer die Sicherheit der E-Mails sein, insbesondere wenn es nicht die eigene ist. Denn wer möchte seine gut behütete Adresse in den Datenbanken der Spammer wissen, nur weil irgend ein Webmaster möglicherweise aus purer Bequemlichkeit schlampig damit umgegangen ist?





Spiele für Linux

29 09 2011

Linux ist nicht besonders reichlich gesegnet mit guten Spielen. Ein paar Perlen gibt es aber doch, die ich hier kurz vorstellen möchte.

Angry Birds
System: Browser-Version verfügbar
Hersteller: Rovio Mobile
Homepage: http://chrome.angrybirds.com/
Hinweis: Mit einem Plugin für den Chrome Browser kann dieses auch Offline gespielt werden.

Die Vögel sind sauer, dass ihnen Schweine ihre Eier gestohlen haben. Jetzt geht es darum, diese zurückzuholen. Mit einer großen Schleuder werden die Vögel selbst zu Geschossen, die durch den richtigen Abschusswinkel den fiesen Schweinen den Garaus machen müssen.


Shadowgrounds / Shadowgrounds Survivor
System: Linux-Version verfügbar
Hersteller: Frozenbyte Games
Homepage: http://shadowgroundsgame.com/
Hinweis: Es gibt bereits einen zweiten Teil mit dem Titel Shadowgrounds Survivor

Es gibt sie noch, die guten alten Ballerspiele ohne viel 3D Ansicht. Hier gilt es, böse Aliens mit purer Waffengewalt dem Erdboden gleich zu machen.


Trine
System: Linux-Version verfügbar
Hersteller: Frozenbyte Games
Homepage: http://trine-thegame.com/

Mit drei unterschiedlichen Charakteren gilt es in diesem Action-Rätselspiel, verschiedenste Aufgaben zu lösen.


World of Goo
System: Linux-Version verfügbar
Hersteller:
2D Boy
Homepage:
http://2dboy.com/

Hier geht es darum, Bälle so miteinander zu verbinden, dass man ein entferntes Ziel erreicht. Dabei spielt die Physik eine wesentliche Rolle.





Angriffsversuche auf PHP Skripte mit PHPIDS erkennen

28 06 2011

Gerade erst wurden tagelang hundertfach SQL Injections auf meine Seiten ausprobiert. Das ist insofern schlecht, als dass der Angreifer mit der Vielzahl der Versuche vielleicht doch irgendwann irgendwo mal eine Lücke findet. Das soll so nicht passieren, deshalb ist es natürlich ideal solche Angriffe möglichst schnell zu erkennen. Da sich mein Hoster dafür nicht zuständig fühlte – man bedenke, ich habe nur Webspace gebucht und erwarte da auch eine Logfile-Überwachung des Hosters – musste eine andere Lösung her.

Auf meiner Suche stieß ich auf PHPIDS, das Anfragen auf einen Server mittels regulären Ausdrücken auf den Grad der Gefährlichkeit einzustufen versucht. Einen Einstieg findet man bei heise Security.

Also das Paket heruntergeladen und für einen ersten Test die Dateien aus /libs auf meinen Server in das Verzeichnis phpids gelegt. In dem Projekt, in dem ich PHPIDS testen wollte musste der include Pfad entsprechend erweitert werden:

set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__).'/phpids/lib/');

Jetzt wird die Überwachung scharf geschaltet. Dies habe ich in der Konfigurations-Datei meines Projekts eingebunden, da diese Datei grundsätzlich bei jedem Aufruf geladen wird.

// Einbinden der Init.php
require_once 'IDS/Init.php';

try {
	// Welche Requests sollen geprüft werden?
	$request = array(
		'REQUEST' => $_REQUEST,
		'GET' => $_GET,
		'POST' => $_POST,
		'COOKIE' => $_COOKIE
	);

	// Die Konfigurationsdatei von PHPIDS einbinden
	$init = IDS_Init::init(dirname(__FILE__) . '/phpids/lib/IDS/Config/Config.ini.php');

	// Initialisieren
	$init->config['General']['base_path'] = dirname(__FILE__) . '/phpids/lib/IDS/';
	$init->config['General']['use_base_path'] = true;
	$init->config['Caching']['caching'] = 'none';
	$ids = new IDS_Monitor($request, $init);
	$result = $ids->run();

	// Der Zugriff ist potentiell gefährlich
	if (!$result->isEmpty()) {
		require_once 'IDS/Log/Composite.php';
		$compositeLog = new IDS_Log_Composite();

		// Standard ist, in die Logdatei auf dem Server zu schreiben.
		// Dazu muss /lib/IDS/tmp sowie /lib/IDS/tmp/phpids_log.txt für den Webserver schreibbar sein
//		require_once 'IDS/Log/File.php';
//		$compositeLog->addLogger(IDS_Log_File::getInstance($init));

		// Ich persönlich finde es besser, die Zugriffe in der Datenbank zu speichern.
		// So kann ich bei mehreren verdächtigen Aktionen einer IP diese sperren.
        require_once 'IDS/Log/Database.php';

		// Zusätzlich kann man sich auch via E-Mail informieren lassen
		require_once 'IDS/Log/Email.php';

		// Schicke die E-Mail und schreibe in die Datenbank
        $compositeLog->addLogger(IDS_Log_Email::getInstance($init), IDS_Log_Database::getInstance($init));
		$compositeLog->execute($result);
	}

}

// Fehlerbehandlung
catch (Exception $e) {
	printf(
		'Es ist ein Fehler aufgetreten: %s',
		$e->getMessage()
	);
}

Bevor man das so laufen lassen kann, muss man noch die MySQL Tabelle anlegen. Das SQL Statement dazu findet man in der lib/IDS/Log/Database.php. Die Tabelle kann man grundsätzlich nennen wie man will, den Zugriff steuert man in der lib/IDS/Config/Config.ini.php. Ich habe diese phpids_intrusions genannt.

    wrapper         = "mysql:host=localhost;port=3306;dbname=DATENBANK-NAME"
    user            = DATENBANK-BENUTZER
    password        = DATENBANK-PASSWORT
    table           = phpids_intrusions

Das wird dann in die Tabelle geschrieben:

id: "2"
name: "GET.action"
value: "suche\\'\\';!--\\\"="
page: "/index.php?action=suche'';!--%22%3CXSS%3E=&{()}"
tags: "xss, csrf, id, rfe, sqli, lfi"
ip: "xxx.xxx.xxx.xxx"
impact: "43"
origin: "xxx.xxx.xxx.xxx"
created: "2011-06-28 00:10:50"

Für das Mailing sind zudem folgende Zeilen in der Konfigurationsdatei anzupassen:

    recipients[]    = E-MAIL
    subject         = "PHPIDS detected an intrusion attempt!"
    header          = "From:  E-MAIL"

Eine Alarmierungs-Mail sieht dann in etwa so aus:

IP: xxx.xxx.xxx.xxx
Date: 2011-06-28T00:10:49+02:00
Impact: 86
Affected tags: xss csrf id rfe sqli lfi
Affected parameters: REQUEST.action=suche%5C%27%5C%27%3B%21--%5C%22%3CXSS%3E%3D, GET.action=suche%5C%27%5C%27%3B%21--%5C%22%3CXSS%3E%3D,
Request URI: /index.php?action=suche'';!--%22%3CXSS%3E=&{()}
Origin: xxx.xxx.xxx.xxx

Ist die Analyse-Software Piwik in das Projekt eingebunden, kommt es zu fehlerhaften Meldungen, da die Piwik-Cookies als Angriff gewertet werden. Deshalb sollte man diese in der Config.ini.php ausschließen:

    ; define which fields shouldn't be monitored (a[b]=c should be referenced via a.b)
    ; Diese beiden Zeilen sind standardmäßig aktiviert. Sie schließen 
    ; aus, dass Google Analytics als Angreifer gewertet wird. Aber aus 
    ; Datenschutz-Gründen verwenden wir ja eh keine Google-Programme.
    ; exceptions[]    = GET.__utmz
    ; exceptions[]    = GET.__utmc
    ; Diese Zeite wird hinzugefügt und gibt das Suchmuster für das Cookie an
    exceptions[]    = COOKIE./.*_pk_ref.*/i