terrorhippiecrew – Weblog

IT und alles was mich sonst noch so interessiert

  • Home
  • Framework
  • Über mich
  • Communities
  • Freelance
  • Impressum
  • Projekte
  • SSL on
19. Juli 2010

XMLRPC Server und Client

w13531 in Allgemein, code, framework, http, mod_rewrite, php, security, web, xml

Einen kleinen XMLRPC Client und Server.
Mit der nächsten Framework Version offiziell verfügbar, inkl der angesprochenen ACL:)
Zur Authentifizierung benutze ich den Authorization-Header. Damit können Webservices/APIs mit individuellen Berechtigungen realisiert werden zB. Über eine ACL. Anwendungen lassen sich dadurch auch besser in Backend/Frontend unterteilen und können auch auf externe Resourcen ausgelagert werden oder eingebunden werden(erhöhte Skalierbarkeit).
Die Objekte die dem Server via setObject() übergeben werden, müssen folgende Konventionen befolgen:
* alle indizierbaren Methoden müssen public sein.
* Methoden müssen folgenden parameter haben: function test($method_name, $params, $user_data) {}
Damit bietet diese Lösung eine Authorisierung und ein einfaches RPC Verfahren an. Das ganze sollte über eine SSL Verbindung laufen, da Passwörter übertragen werden(bzw der HASH). Durch Session-Passwörter könnte auch eine unverschlüsselte Verbindung genutzt werden.
Über diesen kleinen HTACCESS kommt man auch wenn PHP im FastCGI Modus ist an die authorization ran, dabei legt man den Auth-Header auf eine von PHP auslesbare Variable um:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>

jetzt muss man nur noch im PHP die Variablen auslesen und umschreiben:

//HTTP Auth Credentials
if ((!$_SERVER['PHP_AUTH_USER'] || !$_SERVER['PHP_AUTH_PW'])) {
    list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER["REMOTE_USER"], 6)));
}

XMLRPC Core Class:

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
class LIB_Class_XMLRPC {

}

XMLRPC-Client:

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
class LIB_Class_XMLRPC_Client extends LIB_Class_XMLRPC {

    private $host       = null;

    private $port       = null;

    private $user       = null;

    private $password   = null;

    private $path       = null;

    private $timeout    = null;

    private $connection = null;

    private $errno      = null;

    private $errstr     = null;

    public function __construct($host = '127.0.0.1', $port = '80', $path = '/', $timeout = '5') {
        $this->host    = $host;
        $this->port    = $port;
        $this->path    = $path;
        $this->timeout = $timeout;
    } 

    public function connect() {
        if($this->connection == null) {
            if($this->port == '443') {
                $this->connection = fsockopen('ssl://' . $this->host, $this->port, $this->errno, $this->errstr, $this->timeout);
            } else {
                $this->connection = fsockopen($this->host, $this->port, $this->errno, $this->errstr, $this->timeout);
            }
        }
    }

    public function disconnect() {
        if($this->connection !== null) {
            fclose($this->connection);
            $this->connection = null;
        }
    }

    public function setCredentials($user, $password) {
        $this->user     = $user;
        $this->password = $password;
    }

    public function call($request, $params) {
        $this->connect();

        $xml_req = xmlrpc_encode_request($request, $params);    

        $query   = "POST " . $this->path . " HTTP/1.0\n"
                 . "User-Agent: RIAD-F\n"
                 . "Host: " . $this->host . "\n"
                 . "Content-Type: text/xml\n";

        if(!is_null($this->user) && !is_null($this->password)) {
            $query  .= "Authorization: Basic " . base64_encode($this->user.":".$this->password) . "\n";
        }

        $query  .= "Content-Length: " . strlen($xml_req) . "\n\n"
                 . $xml_req . "\n";

        if (!fputs($this->connection, $query, strlen($query))) {
            return 0;
        }

        $contents = '';

        while (!feof($this->connection)) {
            $contents .= fgets($this->connection);
        }

        $xml = substr($contents, strpos($contents, "\r\n\r\n")+4);

        $data = xmlrpc_decode($xml); 

        return $data;
    }   

}

XMLRPC-Server:

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
class LIB_Class_XMLRPC_Server extends LIB_Class_XMLRPC {

    private $server = null;

    public function __construct() {}

    public function createServer() {
        if($this->server === null) {
            $this->server = xmlrpc_server_create();
        }
    }

    public function destroyServer() {
        if($this->server !== null) {
            xmlrpc_server_destroy($this->server);
            $this->server = null;
        }
    }

    public function setObject(&$Object, $ServiceName = null) {
        $this->createServer();

        if(!is_object($Object)) {
            return false;
        }

        if($ServiceName === null) {
            $ServiceName = get_class($Object);
        }

        $methods = get_class_methods($Object);

        foreach($methods as $value) {
            if(is_callable(array(&$Object, $value))) {
                xmlrpc_server_register_method($this->server, $ServiceName . '.' . $value, array(&$Object, $value));
            }
        }

        return true;
    }

    public function setFunction($FunctionName, $ServiceName = null) {
        $this->createServer();    

        if(!is_string($FunctionName)) {
            return false;
        } 

        if($ServiceName === null) {
            $ServiceName = 'func';
        }   

        if(is_callable($FunctionName)) {
            xmlrpc_server_register_method($this->server, $ServiceName . '.' . $FunctionName, $FunctionName);
        }
    } 

    public function handle($xmlData, $UserData = null) {
        $this->createServer();

        return xmlrpc_server_call_method($this->server, $xmlData, $UserData);
    }

}
?>

Der ganze Spass wird zB so genutzt(Server):

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
class APP_Controller_Index extends FW_Controller {

    public function index_action(array $params = null) {

        //connection to DB
        $db = LIB_Model_PDODB::getInstance(FW_Config::getInstance()->get('DB'));

        //setting up xmlrpc
        $xmlrpc_server = new LIB_Class_XMLRPC_Server();

        //loding working class and hand over db
        $news = LIB_Class_News::getInstance($db);

        //register working class xmlrpc
        $xmlrpc_server->setObject($news, 'news');

        //get request
        $request = file_get_contents('php://input');

        //answer xmlrp calls
        $response = $xmlrpc_server->handle($request);

        //output response
        $this->response->addContent($response);
    }

}

Client:

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
class APP_Controller_Index extends FW_Controller {

    public function index_action(array $params = null) {
        $xmlrpc_client = new LIB_Class_XMLRPC_Client('127.0.0.1', '443', '/xmlrpc/');

        $xmlrpc_client->setCredentials('anonymous', 'anonymous');

        $this->response->addContent(print_r($xmlrpc_client->call('news.test', '6'), true));
    }

}
Kein Kommentar
08. Dezember 2009

fast sichere Logins ohne SSL

w13531 in Allgemein, code, http, javascript, security, web

Auf manchen Servern steht leider keine SSL zur verfügung oder nur mit Aufpreis.
Um einigermassen sichere Loginvorgänge ausführen zu können bietet sich folgendes Verfahen an:

  1. Übergabe eines random-Seeds(Zufallszahl) vom Server an das Login Form (Server merkt sich die Zahl zB in Session, kann nach erfolgreichen Login weitergenutzt werden).
  2. Loginform(Passwort) wird via SHA256() gehasht, die random-Seed wird ebenfalls SHA256() gehasht und die beiden Hash aneinandergehängt werden ebenfalls SHA256() gehasht.
  3. Der Hash wird an den Server übertragen und mit dem hash des gehashten Passworts und der gehashten Zufallszahl verglichen, stimmen beide überein dann darf der Login als erfolgreich betrachtet werden.

Warum fast sicher??
Naja es gibt immer möglichkeiten etwas zu umgehen:D
Hier der zugehörige Code(Login Form):

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
<script type="text/javascript" src="sha256.js"></script>
<script type="text/javascript">
<--
function doChallengeResponse() {
var rnd = <?php echo $_SESSION["rand"]; ?> //zufallszahl holen
document.getElementById('usr_id').value = SHA256(document.getElementById('login').value); //username(email) hashen
document.getElementById('usr_pwd').value = SHA256(SHA256(document.getElementById('password').value) + SHA256(rnd)); //session passwort erzeugen
document.getElementById('password').value = "";//plaintexte löschen
document.getElementById('login').value = "";//plaintexte löschen
}
// -->
</script>
<form action="" method="post" onsubmit="return doChallengeResponse();">
<input id="login" type="text" name="login" value="e-Mail Adresse"/>>br/>
<input id="password" type="password" name="pw" value="Passwort" />
<input type="hidden" id="usr_id" name="usr_id" value=""/>
<input type="hidden" id="usr_pwd" name="usr_pwd" value=""/>
<input name="send" type="submit"/>
</form>

Nützliche Infos:

  • lass die Zufallszahl IMMER vom Server erzeugen, da die gesamte Sicherheit auf Ihr basiert
  • übertrage weder das Passwort noch den Hash vom Passwort, sondern nur wie hier sha256( sha256(PWD) + sha256(RND) ) Die Zufallskomponente sorgt gegen man-in-the-middle-Angriffe
  • speichere das Passwort nicht im Klartext in der DB(sondern den Hash sha256(PWD))
  • nutze eine Kollisionsfreie Hash-Funktion, atm SHA256
  • braucht für jeden Aufruf eine Session um die RND zu speichern
  • JavaScript kann kein sha256, um es zu nutzen muss man diese Datei einbinden: sha256.js
  • Der so gewonnene Hashwert kann als Schlüssel für sym. Verfahren verwendet werden um weitere Daten zu verschlüsseln(zB AJAX-Anfragen und Results, nicht zu empfehlen da langsam und rechenaufwändig)
Kein Kommentar
05. Dezember 2009

Must have – Firefox addons

w13531 in Allgemein, http, recommendations, security, web

Da bei mit im Laufe der Zeit einiges an FireFox Addons(die ich brauchbar finde) zusammengekommen ist, hier mal eine kurze Liste, welche man meiner Meinung nach nicht missen sollte:

  1. NoScript
    Das wohl beste Firefox Addon leistet einen großen Beitrag zu Ihrer Sicherheit
  2. Firebug
    Mit diesem Addon kann man Websiten etwas genauer unter die Lupe nehmen, für mich unverzichtbar, des weiteren dient Firebug als Basis für weitere analytische Addons zB.:
    • Yahoo YSlow
      Zeigt optimierungsmöglichkeiten für Websites an
    • Google Page Speed
      Zeigt optimierungsmöglichkeiten für Websites an
  3. Adblock Plus
    Adblock zaubert (fast) alles an Werbung weg – Internet wie als ich noch ein kleiner Junge war :D
  4. Del.ico.us Social Bookmarking(Yahoo)
    Tool um Bookmarks extern zu speichen, zu veröffentlichen und mit Freunden zu teilen
  5. FlashGot
    FlashGot ist ein DownloadHelper mit dem man u.A. Youtube Videos downloaden kann
  6. HTML Validator
    zeigt an ob ein Document seine Spezifikation erfüllt, sehr nützliches Tool
  7. UserAgentSwitcher
    Damit kann man seinen AgendString einfach ändern
  8. ExtendedStatusbar
    zeigt mehr Ladeinfos in der Statuszeile an, wer Opera kennt weis wovon ich spreche
  9. Natürlich habe ich noch etliche FireFox Addons mehr, was meinen Browser zwar super zum entwickeln macht, allerdings dafür recht langsam und Ressourcen fressend….

Kein Kommentar
04. Dezember 2009

WordPress absichern

w13531 in Allgemein, code, http, mod_rewrite, security, web

Hmm nach meiner WordPress installation gab es einige sachen die mir nicht gefielen, zB das ich auf die PHP files im Admin bereich zugreifen konnte als auch in die anderen Ordner.

Simple Lösung:

  • .htaccess in das wp-admin Verzeichnis
    AuthName "Auth"
    AuthType Basic
    AuthUserFile <absolut Pfad zur .htpasswd Datei>
    require valid-user
    Passwortabfrage für das Verzeichniss
  • .htaccess in das wp-content und wp-includes Verzeichnis:

    Order Allow,Deny
    Deny from all
    <Files ~ "\.(css|jpe?g|png|gif|js)$">
    Allow from all
    </Files>
    Dies erlaubt den aufruf von notwendigen Dateien und verhindet die ausführung der Scripte

  • Eine sehr schöne rewrite rule ist folgende:

    <FilesMatch ^wp-config.php$>
    deny from all
    </FilesMatch$>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^terrorhippiecrew\.net$ [NC]
    RewriteRule ^(.*)$ http://www.terrorhippiecrew.net/$1 [R=301,L]
    <FilesMatch ^wp-config.php$>
    deny from all
    </FilesMatch>
    <files wp-login.php>
    AuthType Basic
    AuthName "Authorisation needed"
    AuthUserFile Pfad/zur/.htpasswd
    require user wp-admin
    </files>
    Sie sorgt dafür das alle aufrufe ohne www am anfang auf die Adresse mit www umgeleitet werden. Dies verhindet doppelindizierung bei Suchmaschinen, das FilesMatch verhindert Zugriffe auf die wp-config.php

Natürlich bewahrt mich das nicht vor Softwarebugs oder XSS attacken
aber es wird den größtenteil der Scriptkiddies abhalten(hofft man).
Ich bin sowieso kein Freund der Datei-Struktur von wordpress.
php-Dateien gehören nicht öffentlich zugänglich, ausser erlaubte Schnittstellen. zB so: dyn-webseiten-richtig-strukturieren

Kein Kommentar
03. Dezember 2009

Windows XP absichern

w13531 in Allgemein, os, security

Viele werden jetzt sagen:  Windows löschen und Linux installieren, aber leider laufen viele gute Produkte nicht unter Linux(oder nur schlecht) sodass man doch hin und wieder was von M$ braucht. Es sind wenige einfache Sachen um wesentlich mehr Sicherheit und Bedinkomfort zu erlagen (Ich übernehme keine Haftung für Schäden)

Hier eine kurze Übersicht:
Generell empfiehlt es sich 2 Festplatten im PC zu haben und auch regelmäßgie Datensicherungen von relevanten Daten durchzuführen. Auf die eine Festplatte das System und die Software und auf die 2. die Daten.
Falls nur eine Festplatte vorhanden ist dies auch kein Problem. Am besten fährt man, wenn man die Platte in 3 (wenn eine 2. HDD vorhanden) oder 4 Partitionen(wenn nur eine HDD im System ist) splittet(am besten als Partitionstyp nur primäre Partitionen nehmen).
Die 1. Partiton ist ca 10GB groß und beinhaltet NUR und mit nur meine ich WIRKLICH NUR das System Windows XP (und den Ordner i386 von der XP CD)
Die 2. Partition ist abhänig vom Arbeitsspeicher 5-10GB groß(meistens reichen 5GB an Platz, Laufwerksbuchstabe Z: und mit TweakUI verstecken)
Auf ihr befinden sich die Auslagerungsdatei und alle temporären Dateien (die Einstellungen findet ihr unter Umgebungvariablen bzw. Systemleistung in den Systemeingenschaften)
Die 3. Partition enthält alle Anwendungen, von Office über Spiele, usw.
Die 4. Partition bzw die 2. Festplatte ist zur Ablage eurer Daten gemacht. Hier könnt ihr alles an Musik,Filmen,Dokumenten usw abspeichern.
Achtung: Für Temporäre Dateien kan auch eine RAMDISK verwendet werden: zB RRamdisk auch der Firefox-Cache liegt gut auf der Disk.

1. Firefox und Thunderbird nutzen(VLC statt MediaPlayer)
2. NoScript und AdBlockPlus nutzen(Firefox addons)
3. die Zuordnungen der Dateitypen *.VBS, *.VBA löschen(das verbietet das Ausführen von meist bösen VB Scripts)
4. Service Pack 3 installieren & User-Passwörter setzen
5. mittels TweakUI alle Laufwerks-Autostarts deaktivieren(am Besten auch die restl Design Einstellungen wegmachen)
6. Als Instant Messenger nicht ICQ bzw. MSN Messenger sondern PIDGIN nutzen(Off-the-Record Messaging zur Verschlüsslung von Gesprächen – am besten mit einem Jabber/XMPP-Account)
7. Windows update einmal monatlich zum Patchday nutzen ansonsten Dienst ausschalten(denkt daran das WGA Update rauszuschmeissen) – nicht benötigte User entfernen(Compuerverwaltung)
8. Für vertrauliche Daten(Steuerklärungen, Passwörter, usw) TrueCrypt nutzen
9. AutoShare,DCOM und microsoft-ds deaktivieren
dazu in der Registry(regedit)
DCOM nur ausschalten wenn sie keine DCOM-Abhänigen Programme bzw. Dienste nutzen
DCOM Deaktivieren
microsoft-ds:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters]
SMBDeviceEnabled=dword:00000000
AutoShare:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
AutoShareWks=dword:00000000
AutoShareServer=dword:00000000
IPC:
Serverdienst deaktivieren(dann geht auch RPC usw nicht mehr)

10. Dienste konfigurieren(so schauts bei mir aus-nur ein Beispiel wenn ihr gewisse Dienste benötigt müssen diese aktiv bleiben):

Arbeitsstationsdienst
AutomatischeKonfiguration(verkabelt)
Computerbrowser
DCOM-Server-Prozessstart
DHCP Client [kann weg]
DNS-Client [kann weg]
Druckwarteschlange [kann weg]
Ereignisprotokoll
Geschützter Speicher
HTTP-SSL
IPSEC-Dienste [kann weg]
Kryptographiedienst [kann weg]
Konfigurationsfreie drahtlose Verbindung [kann weg]
Netzwerkverbindungen
NLA (Network Location Awareness)
Plug & Play
Remoteprozeduraufruf (RPC)
Shellhardwareerkennung [kann weg]
Sicherheitskontenverwaltung
Taskplaner
TCP/IP-NetBIOS-Hilfsprogramm [kann weg]
Telefonie
Überwachung verteilter Verknüpfungen (Client)
Verwaltung logischer Datenträger
Windows Audio
Windows Installer
Windows Bilderfassung
Windows Verwaltungsinstrumentation
Windows Zeitgeber[kann weg]

11. Die Konfiguration mit GFI LANguard überprüfen und restl. Lücken durch updates Patchen.
Es dürften nur noch 2 Ports offen sein(137,139) welche für SMB/CIFS benötigt werden.
Brauchen sie diesen Dienst auch nicht, so entfernen sie in ihrer Netzwerkverbindung Datei- und Druckerfreigabe und Client für Microsoft Netzwerke. Bei TCP/IP klicken sie auf Erweitert und dann auf NetBIOS über TCP/IP deaktivieren. Jetzt dürften die letzten beiden Ports auch geschlossen sein.

Ihr System ist jetzt fertig?? Sehr gut!
Dann machen sie von der Systempartition ein Image und speichern dieses auf der 2. Festplatte bzw. der 4. Partition.
(Wenn ihr Windows streikt können sie dieses mit der CD des Image Programms und dem Image auf der 2. HDD schnell zurücksichern)
Gute Programe gibts gratis in der Ubuntu live CD oder komerziell von Acronis

PS: regelmäßiges Defragmentieren und Scandisk hat noch keiner HDD geschadet:-)

Kein Kommentar

Suche

RSS

  • Beiträge RSS
  • Kommentare RSS

Letzte Artikel

    • XMLRPC Server und Client
    • PHP:XML2ARRAY <-> ARRAY2XML
    • Mein Framework – Überarbeitet Version 2.00 online
    • Mein Framework – #13 – Mailer
    • Mein Framework – #12 – Filter

Letzte Kommentare

    • w13531 bei Mein Framework – #4 – Die Views
    • w13531 bei Mein Framework – #2 – Die Workbench
    • Simon bei Mein Framework – #4 – Die Views
    • Simon bei Mein Framework – #2 – Die Workbench
    • w13531 bei Mein Framework – Inhaltsverzeichnis

Kategorien

    • Allgemein
    • code
    • framework
    • http
    • javascript
    • mod_rewrite
    • os
    • php
    • recommendations
    • security
    • travel
    • web
    • xml

Archiv

    • Juli 2010
    • Juni 2010
    • Mai 2010
    • April 2010
    • März 2010
    • Februar 2010
    • Januar 2010
    • Dezember 2009
September 2010
M D M D F S S
« Jul    
 12345
6789101112
13141516171819
20212223242526
27282930  

Blogroll

    • 5 RegEx every Web Programmer should know
    • Ajax Mistakes
    • AVL Tree in JAVA – very nice
    • Bruder Baum
    • design-pattern factory und singleton
    • Entwurfsmuster in PHP
    • Gzip your @font-face files
    • http://netalyzr.icsi.berkeley.edu/ Network Analyzer
    • Konstenten in PHP Trick
    • Overview about secure web programming
    • PHP BitFlags
    • php fluent-interface
    • php mvc-framework
    • PHP Quine
    • php-browser
    • PHP-Template Engine
    • Reducing the number of page components
    • some infos and examples about RegEx
    • survive heavy traffic with your webserver
    • What tells your Browser about you
    • wordpress security howtos
© 2010 Wired by terrorhippiecrew – Weblog
Design von Dezzain Studio
Übersetzt von Htwo
Nature Pictures | Bamboo Blinds