Archiv

Artikel Tagged ‘php’

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:

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.

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!