Archiv

Archiv für die Kategorie ‘Technik & Entwicklung’

PHP basierte TOR-Netzwerk erkennung

6. Dezember 2011 Keine Kommentare
GD Star Rating
loading...

Als Betreiber eines Online Shops oder z.B. eines Reiseportales ergibt sich zwangsläufig immer ein Problem: der vorsätzliche Betrug des Kunden beim Kauf.
Man bleibt also also Betreiber auf der Kohle sitzen und hat im schlechtesten Fall nicht einmal eine IP die man zur Strafverfolgung nutzen kann weil der User einen Proxy / VPN oder sonstigen Anonymisierungsdienst genutzt hat.
Einer dieser Anonymisierungsdienste von dem meiner Meinung nach auch die größte Gefahr ausgeht, ist das TOR-Netzwerk.

Wer einem Betrüger aufgesessen ist der dieses Netzwerk nutzt, hat sogut wie keine Aussicht auf Erfolg was die Aufklärung angeht.
Als ich mich selbst kurz damit befasst habe, habe ich eine Python Lösung zur Erkennung solcher User auf PHP adaptiert.

Somit ist bei Einsatz der PHP Klasse sichergestellt, dass Kunden zumindest nicht diesen Anonymisierungsdienst benutzen.

Das ganze ist als fertige PHP Klasse auf PHPClasses zu finden.

Über ein Voting würde ich mich freuen:

Facebooks geheuchelter Datenschutz

9. April 2011 Keine Kommentare
GD Star Rating
loading...

Als ich mich vor knapp 3,5 Jahren für ein Projekt bei Facebook registriert habe, war es in Deutschland noch derart unbekannt, dass ich sogar mit einer Mail an den Support meinen Nachnamen genehmigen lassen musste!
Als Entwickler musste man noch keine Kreditkartendaten eingeben und FBML wurde gerade erst geboren – mittlerweile ist es schon wieder Tod.

Mittlerweile ist Facebook für viele Deutschen Internetuser der Dreh und Angelpunkt Ihres Lebens geworden. Für so viele User, das den anderen Netzwerke wie MySpace, WKW und den VZ Netzwerken die User reihenweise davonlaufen. Selbst ich überlege mich bei den “anderen” abzumelden weil einfach mittlerweile alle bei Facebook sind (Gruppenzwang :) ).

Seit neustem bietet Facebook an, die komplette Seite per HTTPS, also einer sicheren Verbindung, unter dem Vorwand besseren Datenschutzes zu benutzen.
Ich persönlich halte diese Funktion für so überflüssig wie Fußpilz, zumindest bei Facebook, wo Datenschutz maximal bedeutet, dass es mindestens 2 Backups davon gibt.

Warum?

Willkommen in der Welt der APPs. Diese kleinen nutzlosen Spiele, Fragebögen und nicht zu vergessen “Uberprufen Sie Ihre Profilaufrufe” Dinger.
Seit ein paar Tagen befasse ich mich wieder aktiv mit der Facebook APP Entwicklung und den Möglichkeiten die man damit als Entwickler mittlerweile hat.
Jeder von euch kennt diese „Anfrage für Genehmigung“ Dialoge solcher APPs, inklusive der Möglichkeit, sich auf X-beliebigen Webseiten mittels Facebook einzuloggen und Kommentare zu hinterlassen.

Genau hier dreht sich mein Magen um, wenn ich sehe was für Bullshit an Berechtigungen da benötigt wird, um noch mehr Bullshit auf Facebook zu verbreiten.
Jede APP kann verschiedene Stufen der Freigabe erfragen und nutzen, vergleichbar mit einer Wohnungsbesichtigung von Interessierten Nachmietern die evtl. nicht alle Zimmer sehen dürfen bis hin zum Einbrecher der sogar in der Unterwäsche wühlt.

Auch wenn ich jetzt einige Enttäuschte Gesichter erzeuge: Nicht mal mit der Maximalen Freigabestufe kann es ein APP geben die mir anzeigen kann wie viele Profilbesucher ich hatte, denn das ist schlichtweg in Facebook nicht möglich, da KEINE App das eigene Profil derart abändern könnte, dass Besucher getrackt werden können.

Wozu dient das ganze dann?

Gerade heute ging mir eine APP gewaltig auf den Zeiger:

Die APP erwartet als Freigabe unter anderem die Möglichkeit, die eigenen Bilder sehen zu können. Der Entwickler der APP sitzt also wahrscheinlich in diesen Minuten wixxend vor dem Rechner und schaut sich die Freizügigen Fotos einiger Mädels an deren Hirn beim Login in Facebook ausgeloggt wird. Dazu hat er direkt deren Namen sowie die Namen und Profilbilder aller Freunde der Person. Ihr hingegen bekommt irgendwelche Zufallszahlen als angebliche Profilbesucher präsentiert!

Ich persönlich vermute mal, mit dem „Zulassen“ Button verhält es sich genau wie mit der größten Lüge im Internet: „Ich habe die AGBs gelesen“. Niemand liest wirklich was er da „Genehmigt“ und ob das überhaupt Sinn macht (Bei den meisten Apps dürfte die Basisfreigabe mehr als ausreichend sein, denn selbst da kriege ich als Betreiber schon die Freundesliste inkl. Namen und Profilbild mit.)
Datensammler verdienen sich mit solchen Apps und naiven Usern eine goldene Nase.

Wusstet Ihr dass man in Facebook nach E-Mailaddressen suchen kann? Nein? Gebt mal eine euch bekannte E-Mailadresse in der suche ein. Über die Facebook API kann ich somit als Entwickler jede E-Maildatenbank gemütlich gegen Facebook abgleichen, auch wenn der User seine E-Mailadresse nicht freigegeben hat, noch schlimmer, ich muss nicht mal der Freund des Users sein.

Hier also 3 Gutgemeinte Tipps von mir für die Zukunft:

- Für Facebook eine eigene E-Mailadresse benutzen sie sonst niemand kennt.
- Vor dem Genehmigen einer APP Hirn einschalten und überlegen ob die Freigabe Sinn macht und ob die APP ansich überhaupt sinn macht.
- APPS die Zugriff auf die eigenen Bilder wollen sind mit Vorsicht zu genießen wenn Ihr nicht Angst haben wollt, dass eure Bilder irgendwann woanders im Internet auftauchen.

Und jetz alle schön auf „Gefällt mir“ klicken! ☺

Herbstputz

12. September 2010 2 Kommentare
GD Star Rating
loading...

Ich war mal so frei und habe WordPress auf die neuste Version gezogen und gleichzeitig ein neues Design Installiert, sowie ein paar Plugins aktualisiert.

Ich hoffe es gefällt.

KategorienTechnik & Entwicklung Tags:

Smarty Caching mit Xcache

1. Februar 2010 Keine Kommentare
GD Star Rating
loading...

Wer schon einmal mit der Template Engine “Smarty” gearbeitet hat, wird sich spätestens, wenn es um den Einsatz dieser Lösung in High Traffic Umgebungen geht, darüber ärgern dass Smarty den Cache der Templates auf der Festplatte realisiert. Aus diesem Grunde habe ich bereits vor 2 Jahren eine Lösung entworfen, welche sich nun nach langem “Test” als durchaus brauchbar erwiesen hat und ich sie somit hier mal vorstellen möchte.
Grundlage ist die Tatsache, dass sich Smarty recht einfach mittels Plugins erweitern lässt, und sich somit auch ein anderer Cache Handler unterjubeln lässt.
Ich benutze bevorzugt für “Single Server Lösungen” Xcache mit lokal aktiviertem variablen Cache

< ?php
/**
 * Smarty Xcache Caching Handler
 *
 * @author Alexander Over
 * @copyright 2008
 */
function xcache_cache_handler($action, &$smarty_obj, &$cache_content, $tpl_file = null, $cache_id = null, $compile_id = null)
{
  if (function_exists('xcache_isset'))
  {
    $cacheid = 'smarty.'.$tpl_file.'@'.$cache_id.'@'.$compile_id;
    switch ($action)
    {
      case 'read':
        if (xcache_isset($cacheid))
        {
          return xcache_get($cacheid);
        }
        else
        {
          return false;
        }
      case 'write':
        return xcache_set($cacheid, $cache_content, $smarty_obj->cache_lifetime);
      case 'clear':
        if (empty($cache_id) and empty($compile_id) and empty($tpl_file))
        {
      	 return xcache_clear_cache(1, 0);
        }
        else
        {
          if (xcache_isset($cacheid))
          {
            return xcache_unset($cacheid);
          }
          else
          {
            return false;
          }
        }
      default:
      	$smarty_obj->trigger_error('cache_handler: unknown action "'.$action.'"' );
        return false;
    }
  }
  else
  {
    $smarty_obj->trigger_error('cache_handler: Xcache not found!');
    return false;
  }
}

geladen wird das ganze am einfachsten folgendermaßen:

< ?php
require_once 'Smarty.class.php';
require_once 'xcache_cache_handler.php';

$smarty = new Smarty();
if (function_exists('xcache_isset'))
{
  $smarty->cache_handler_func = 'xcache_cache_handler';
}

Donwload der Datei: xcache_cache_handler.php

Detect Opcode Cache in PHP

25. Januar 2010 Keine Kommentare
GD Star Rating
loading...

Vor einer Woche etwa habe ich meine erste PHP Klasse auf phpclasses.org veröffentlicht, um mal zu schauen, wie die “Gemeinde” darauf reagiert.
Ich bin überrascht, wie ich es mit dieser “Notable” Class binnen 7 Tagen in Google auf Platz 1 zum Suchbegriff “detect opcode cache” geschafft habe.

Diese Singleton Klasse ermöglicht es z.B. in einem PHP Setup auf einfache Art und Weise herauszufinden, ob auf dem gewählten Server ein Opcode-Cacher läuft oder nicht und ggf. entsprechend zu reagieren.

Wer die Klasse einsetzen möchte findet sie hier: http://www.phpclasses.org/browse/package/5930.html

In einer Woche etwa dürfte die zweite Klasse von mir folgen, welche dann einen sehr gerne gemachten Fehler – insbesondere von PHP-Anfängern gerne gemacht – auf einfache und sichere Weise unterbindet.

UPDATE 01.02.2010:
Wie ich eben erfahren habe, ist diese Klasse für den Januar Award nomiert worden und steht zur Abstimmung bereit.

Nun auch ueber IPv6 erreichbar

15. Mai 2009 Keine Kommentare
GD Star Rating
loading...

Ich habe mir mal im Zuge der Notwendigkeit einen IPv6 Tunnel geleistet und diesen auf den Server geroutet.

Somit ist dieser Blog ab heute auch über IPv6 zu erreichen.

Entweder per http://[2001:470:1f14:1704::2]
oder Ihr löst den host per v6 auf, dann geht es auch wie bisher über den Hostnamen.

Fragen ? Keine ? Gut !

IPv6 Certification Badge for CyberLine

KategorienTechnik & Entwicklung Tags:

D-LINK DWA 547 Vista x64

21. Juni 2008 12 Kommentare
GD Star Rating
loading...

Wer sich schon immer gefragt hat, wie es unter Vista Ultimate 64 (oder Vista x64 Systemen generell) möglich ist, mit einer DWA-547 von D-Link online zu gehen, dem sei hier eine Lösung geboten:

Atheros Treiber

Nach über 2 Tagen rumprobieren und der Feststellung, das D-Link für diese doch anscheinend etwas aus der Mode geratenen 300Mbit WLAN-Karte keinen Vista x64 Treiber rausbringen wird, habe ich durch einen Zufall den obigen Treiber gefunden, welcher seinen Dienst astrein und ohne Probleme erledigt.

WICHTIG!!! Nach getaner Installation und der damit verbundenen möglichkeit eines Treiberupdates über Windows-Update: Finger Weg!!!, der Treiber aus dem Windows Update beschert euch mit ziemlicher Sicherheit wieder eine Zeit ohne WLAN!

UPDATE:

Der Atheros DWA Treiber im Windows Update mit Datum 25.09.2008 scheint nun zu Funktionieren.

KategorienTechnik & Entwicklung Tags:

Lighttpd: mod_status patch

8. Januar 2008 Keine Kommentare
GD Star Rating
loading...

Wer mittels Munin den Lighty tracken will, wird feststellen, dass es im gegensatz zum Apache-Status keine Anzeige der Idle-Servers gibt.

Aus diesem Grund habe ich mal fix einen Patch für die Version 1.5.0 geschrieben, der die Ausgabe der ?auto Page um die Anzeige von “IdleServers” und “Scoreboard” ergänzt.

CODE:

--- src/mod_status.c        2008-01-08 00:00:00.000000000 +0100
+++ src/mod_status.c    2008-01-08 00:00:00.000000000 +0100
@@ -569,6 +569,8 @@
        double avg;
        time_t ts;
        size_t j;
+       unsigned int k;
+       unsigned int l;

        b = chunkqueue_get_append_buffer(con->send);

@@ -595,6 +597,11 @@
        buffer_append_long(b, srv->conns->used);
        BUFFER_APPEND_STRING_CONST(b, "\n");

+       /* output idle servers */
+        BUFFER_APPEND_STRING_CONST(b, "IdleServers: ");
+        buffer_append_long(b, srv->conns->size - srv->conns->used);
+        BUFFER_APPEND_STRING_CONST(b, "\n");
+
        /* output traffic */
        BUFFER_APPEND_STRING_CONST(b, "Traffic: ");
        avg = p->abs_traffic_out / (srv->cur_ts - srv->startup_ts);
@@ -610,6 +617,18 @@
        buffer_append_long(b, avg);
        BUFFER_APPEND_STRING_CONST(b, "\n");

+       /* output scoreboard */
+        BUFFER_APPEND_STRING_CONST(b, "Scoreboard: ");
+        for (k = 0; k < srv->conns->used; k++) {
+               connection *c = srv->conns->ptr[k];
+               const char *state = connection_get_short_state(c->state);
+               buffer_append_string_len(b, state, 1);
+        }
+        for (l = 0; l < srv->conns->size - srv->conns->used; l++) {
+               BUFFER_APPEND_STRING_CONST(b, "_");
+        }
+        BUFFER_APPEND_STRING_CONST(b, "\n");
+
        /* set text/plain output */

        response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/plain"));

Anleitung:

cd lighttpd-1.5.0
wget http://trac.lighttpd.net/trac/attachment/ticket/1507/mod_status.1.5.patch?format=raw
patch -p0 < mod_status.patch
make distclean
./configure
make
make install

[UPDATE]
Der Patch wurde im Changelog 2045 bzw. 2046 ins nächste Lighttpd Release aufgenommen.

KategorienTechnik & Entwicklung Tags:

Lighttpd: mod_securedownload wrapper

24. August 2007 Keine Kommentare
GD Star Rating
loading...

Als ich mich die Tage mit mod_secdownload
für den Lighty befasste, fiel mir ein für mich nicht tragbarer Mängel auf: Ich würde gerne die Auslieferung der Datei über ein Wrapper script vornehmen lassen, um wie in meinem benötigten Fall die ausgelieferten Bilder mit einem Dynamischen Watermark zu versehen, welches Userabhängig ist. Dieser Patch ist für 1.4.16 könnte aber auch auf älteren Versionen laufen.

Ich muß gestehen das ich noch keine Peilung von c habe aber ich finde ich habe es trotzdem gut hinbekommen :D

CODE:

--- ../lighttpd-1.4.16/src/mod_secure_download.c        2006-10-04 15:26:23.000000000 +0200
+++ ./src/mod_secure_download.c 2007-08-24 08:42:34.488077064 +0200
@@ -36,6 +36,7 @@
        buffer *doc_root;
        buffer *secret;
        buffer *uri_prefix;
+       buffer *wrapper;

        unsigned short timeout;
 } plugin_config;
@@ -76,6 +77,7 @@
                        buffer_free(s->secret);
                        buffer_free(s->doc_root);
                        buffer_free(s->uri_prefix);
+                       buffer_free(s->wrapper);

                        free(s);
                }
@@ -100,6 +102,7 @@
                { "secdownload.document-root",     NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },       /* 1 */
                { "secdownload.uri-prefix",        NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },       /* 2 */
                { "secdownload.timeout",           NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION },        /* 3 */
+               { "secdownload.wrapper",           NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },       /* 4 */
                { NULL,                            NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
        };

@@ -115,11 +118,13 @@
                s->doc_root      = buffer_init();
                s->uri_prefix    = buffer_init();
                s->timeout       = 60;
+               s->wrapper       = buffer_init();

                cv[0].destination = s->secret;
                cv[1].destination = s->doc_root;
                cv[2].destination = s->uri_prefix;
                cv[3].destination = &(s->timeout);
+               cv[4].destination = s->wrapper;

                p->config_storage[i] = s;

@@ -165,6 +170,7 @@
        PATCH(secret);
        PATCH(doc_root);
        PATCH(uri_prefix);
+       PATCH(wrapper);
        PATCH(timeout);

        /* skip the first, the global context */
@@ -187,6 +193,8 @@
                                PATCH(uri_prefix);
                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("secdownload.timeout"))) {
                                PATCH(timeout);
+                       } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("secdownload.wrapper"))) {
+                               PATCH(wrapper);
                        }
                }
        }
@@ -210,6 +218,8 @@

        if (buffer_is_empty(p->conf.uri_prefix)) return HANDLER_GO_ON;

+       if (buffer_is_empty(p->conf.wrapper)) return HANDLER_GO_ON;
+
        if (buffer_is_empty(p->conf.secret)) {
                log_error_write(srv, __FILE__, __LINE__, "s",
                                "secdownload.secret has to be set");
@@ -283,7 +293,13 @@
        buffer_copy_string_buffer(con->physical.doc_root, p->conf.doc_root);
        buffer_copy_string(con->physical.rel_path, rel_uri);
        buffer_copy_string_buffer(con->physical.path, con->physical.doc_root);
+
+       if (buffer_is_empty(p->conf.wrapper)) {
        buffer_append_string_buffer(con->physical.path, con->physical.rel_path);
+       } else {
+               buffer_append_string_buffer(con->physical.path, p->conf.wrapper);
+               buffer_copy_string(con->uri.query, rel_uri);
+       }

        return HANDLER_GO_ON;
 }

Anleitung:

cd lighttpd-1.4.16
wget http://blog.quadrat4.de/wp-content/mod_secure_download.patch
patch -p0 < mod_secure_download.patch
make distclean
./configure
make
make install

Anschliessend wie gewohnt mod_securedownload in der lighttpd.conf aktivieren und zu den bestehenden Parametern folgenden hinzufügen:


secdownload.wrapper = "wrapper.php"

Die im Beispiel angegebene wrapper.php muß unterhalb des “secdownload.document-root” Verzeichnisses liegen und wird vom Webserver normal ausgeführt, auch wenn Sie nicht im regulären Docroot liegt.

Die wrapper.php (perl könnte auch Funktionieren) empfängt durch den patch den Dateinamen der auszuliefernden Datei als $_SERVER['QUERY_STRING'] welchen man dann noch kontrollieren sollte und schliesslich durch die wrapper.php ausliefern kann.

Fragen, Anregungen, Kritik ? Immer her damit!

SecondLife

1. Februar 2007 Keine Kommentare
GD Star Rating
loading...

Nach einem Bericht gestern Abend bei SternTv bin auch ich nun endgültig dem SecondLife Wahn verfallen.

Man findet mich in meinem zweiten Leben unter dem Nick: “Okino Zabelin”