by:

Ich möchte euch hier demonstrieren wie man eine XML Schnittstelle einfach und schnell
programmiert...
Wir haben auf der einen Seite einen Script, der eine XML Anfrage an den Server schickt
und auf der anderen Seite einen Script, der die Anfrage bearbeitet.
Angenommen wir wollen 3 Funktionalitäten über XML steuern können:
ADD, UPDATE und DELETE sprich Hinzufügen, Ändern und Löschen.

Als erstes zeige ich euch wie man ein XML erzeugt und an den Server sendet:

Code

<?php     
   
function createxml($array) {
            
            
$buf '';
            foreach(
$array as $key => $value)
            {
                if(
is_array($value))
                {
                
$buf .= "<".strtolower($key).">" createxml($value) . "</".strtolower($key).">\n";
                }
                else{
                
$buf .="<".strtolower($key)."><![CDATA[$value]]></".strtolower($key).">\n";
                }
            }
            return 
$buf;
        }

        
$aPOST["content"]["id"]        = "2";
        
$aPOST["content"]["author_id"] = "1";        
        
$aPOST["content"]["header"]    = "Wir schreiben eine XML Api";
        
$aPOST["content"]["content"]   = "Ich m?chte euch hier Demonstrieren wie man eine
XML Schnitstelle.."
;
        
$aPOST["content"]["date"]      = date("Y-m-d H:i:s");
        
        
$url 'http://www.codejungle.org/xml-api.php';
        
$POST["cmd"]="ADD";
        
$POST["apikey"]="kmlnjierg8795th2bughj3fg02jgkm0ggi";
        
$POST["data"]=createxml($aPOST);

        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$url);
        
//curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $pwd);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_POSTFIELDS$POST);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$feedback       curl_exec($ch);
        
$ErrNum         curl_errno($ch);
        
$ErrMsg         curl_error($ch);
        
curl_close($ch);
        echo 
$feedback;
?>


Wir erstellen hier mit Hilfe der createxml Funktion aus einem Array eine XML
Datei. Danach senden wir mit Hilfe von curl drei Parameter an die Datei xml-api.php,
cmd damit unser Script weiß, welche Funktion er aufrufen soll, in unserem Fall ADD,
den API Key um sicherzustellen, dass nicht jeder die Schnittstelle benutzen kann und
data die eigentliche XML Datei.

Nun müssen wir einen Script erstellen, der die Anfrage entgegennimmt und richtig
verarbeiten kann.

Code
<?php    
$allowed_api_keys
=array("kmlnjierg8795th2bughj3fg02jgkm0ggi");

//check if api key is valid
if(in_array($_POST[apikey], $allowed_api_keys)){
        switch(
$_POST[cmd]){

        case 
ADD;
        
$xml simplexml_load_string($_POST[data]);
        foreach(
$xml as $name => $value){
        echo 
"$name => $value";
        }
        break;
        default:
        echo 
"Please check your provided command";
        break;
        }
} else {

echo 
"Your API - Key is invalid";
}
?>

Diese Datei überprüft zuerst ob der gesendete API Key existiert,
wenn ja, überprüfen wir noch welche Funktion übergeben wurde (in unserem Fall ADD).
Hier laden wir die XML Datei mit Hilfe der simplexml_load_string Funktion ein und
geben sie anschließend aus.
Man kann nun eine Funktion schreiben, die die übergebenen XML Daten weiter verarbeitet.
Die meisten Probleme machen nach meiner Erfahrung Umlaute und Sonderzeichen,
sie führen oft zu parse errors. Dies kann man teilweise mit Hilfe des Tags
lösen, wobei der Tag selbst allerdings auch zu parse errors führen kann...
Auf Wunsch von einem guten Freund möchte ich auch noch auf XML-RPC und Soap hinweisen,
beide eignen sich ebenfalls zur Remote XML Verarbeitung.

Ich hoffe euch hat mein kleiner Exkurs gefallen und freue mich über eure Kommentare.

LG
Andreas


Kommentare

by:

Hallo,

nachdem mir heute etwas langweilig war und ich alles machen wollte, nur nicht das was ich sollte, hier ein kleiner Script der eine Shoutbox erzeugt.

Das Besondere ist, er kommt ohne Datenbank aus und benutzt ajax damit neu hinzugefügte Inhalte gleich angezeigt werden. Man kann ihn also auch als simplen Chatscript benutzen. Noch nicht implementiert sind Smilies, sollte sich aber mit str_replace recht einfach umsetzen lassen.

Source Code Downloaden | Demo

Code

<?php
# Shoutbox 1.0
# by Andreas Beder
# codejungle.org
# Licence GNU GPL 2

//config

$filename="content.txt";
// be sure the file have write permissions
$url="http://www.codejungle.org/shoutbox/";

//function 

function get_content(){
global 
$filename;
      
$lines file ($filename);
      
$start count($lines)-12;
      if (
$start 1$start 1;
      for (
$i $start$i count ($lines); $i++){
      
$somecontent.=stripslashes($lines[$i]);
      }
return 
$somecontent;
}

function 
add_content(){
global 
$filename;
if(
$_POST[submit] and $_POST[nick] and $_POST[content]){
//check content
//add content
 
$_SESSION["nick"]=$_POST[nick];
 
$somecontent=strip_tags($_POST[nick]).": ".strip_tags($_POST[content])."<br/>n";
 
$handle fopen($filename'a+');
 
fwrite($handle$somecontent);
}
}

function 
output_form(){

echo 
'
<form action="" method="post">
Nick:'
;
if(
$_SESSION[nick]){echo $_SESSION[nick].'<input type="hidden" name="nick" value="'.$_SESSION[nick].'"><br>';} else { echo '<br>
<input name="nick" type="text" value="'
.$_SESSION[nick].'"><br>'; }
echo
'
Text:<br>
<textarea rows="5" cols="100" name="content"></textarea><br>
<input type="submit" name="submit" value="save">
</form>
'
;

}

if(
$_GET[content]=="true"){
echo 
get_content();
die();
}
?>
<html>
<head>
<title>shoutbox demo</title>
<script type="text/javascript" language="javascript">

    var http_request = false;

    function macheRequest(url) {

        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
                // zu dieser Zeile siehe weiter unten
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            return false;
        }
        http_request.onreadystatechange = alertInhalt;
        http_request.open('GET', url, true);
        http_request.send(null);

    }

    function alertInhalt() {

        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                document.getElementById("shoutbox").innerHTML=http_request.responseText;
                var objDiv = document.getElementById("shoutbox");
                objDiv.scrollTop = objDiv.scrollHeight;
                setTimeout('macheRequest("<?php echo $url?>?content=true")',2000);

            } else {
                alert('Bei dem Request ist ein Problem aufgetreten.');
            }
        }

    }
</script>
</head>
<body onload="macheRequest('<?php echo $url?>?content=true');">
<? add_content(); ?>
<div style="border:1px solid #ccc; width:500px; height:300px; max-height:300px; overflow:auto;"
 name="shoutbox" id="shoutbox">
</div>
<? output_form(); ?>

</body>
</html>

Beachte, dass die content.txt Schreibrechte für den Webserver haben sollte.

Unter *nix geht das folgendermaßen:

chmod 640 content.txt && chown nobody:nogroup content.txt

Ich hoffe euch hat mein Script gefallen, über Verbesserungsvorschläge freue ich mich natürlich auch.

LG

Andreas


Kommentare

by:

Hallo,


Nachdem ich in letzter Zeit viel zu tun hatte, dachte ich, es wird mal wieder
Zeit einen Beitrag zu schreiben.
Um dem Blog auch eine etwas persönlichere Note zu geben, behandelt dieser Artikel
diesmal keine technische Anleitung.
Es geht hier um meine aktuellen Projekte, etwas um mein Leben und was mir sonst noch so einfällt.

Gestern war ich auf der ISA 08 (Internet Summit), wo es hauptsächlich um
Web Accessibility ging. Wobei mir vorkam, dass die Anwesenden weniger
an einem barrierefreien Internet interessiert waren, als mehr an neuen Geschäftskontakten. Also mehr so was wie ein "Meet and Greet"... Aber das ist natürlich nur meine private Meinung.
Ansonsten war ich am letzten Wochenende in Berlin, was mir sehr gut getan hat.
Es war schön mal wieder Zeit mit der Familie zu verbringen und etwas von Berlin zu sehen. :)

Viel Zeit geht im Moment für Auftragsarbeiten drauf, weshalb meine OpenSource Projekte
wenig weiter entwickelt werden. Ich hoffe der Umstand wird sich bald wieder ändern.
Trotzdem möchte ich einen kleinen Überblick über meine Projekte geben:

1. CMS Bandits
2. b2b-portal
3. uploaded.ath.cx
4. webtools4larbin
5. Online Face Detection

1. CMS Bandits

Mein insgesamt aktivstes Projekt hat in letzter Zeit wenig neues erfahren.
Wie im Changelog geschrieben wurde das Menu überarbeitet, das Design auf Tableless
umgestellt und ist nun W3C konform. Außerdem gibt es einen noch nicht so ausgereiften
PDF Support.

Die nächsten Änderungen werden sein:

1. Template System
2. Admin - Verwaltungstool
3. Ein neuer Name

Bei Punkt 3 überlege ich schon seit längerem das Projekt unter
einem neuen Namen weiterzuentwickeln, habe aber noch keinen
passenen gefunden. Eventuell fällt dir ja einer ein, ich würde mich zumindest
über Vörschläge freuen ;)
Die nächste Release wird veraussichtlich zu Weihnachten veröffentlicht und
wird stark von der jetzigen Entwicklerversion abgeleitet sein.

2. b2b - portal

Ein sehr junges im konzeptuellen und experimentellen
Stadium befindliches Projekt das noch nicht veröffentlicht ist.
Das Ziel ist eine Mischung aus Firmendb und Community Portal.
Ähnlich wie Xing nur mit kostenlosen Community Funktionen, rein werbefinanziert.
Eine Alpharelease kann man sich hier anschauen:
http://www.codejungle.org/b2b
Wie gesagt handelt es sich um ein Projekt im Experimentierstadium,
d.h. die meisten geplanten Funktionen sind noch nicht verfügbar.

3. uploaded.ath.cx

Dieses Projekt wurde auch noch nicht der Öffentlichkeit vorgestellt, ist
aber soweit funktionsfähig.
Man kann über ein Webinterface bis zu 100 MB hochladen und bekommt anschließend eine
Adresse über die man die Daten wieder abrufen kann.
Es besteht auch die Möglichkeit via anonymen FTP auf die Daten zuzugreifen.

4. webtools4larbin

Dies ist ein sehr altes Projekt von mir (2006) was eigentlich nur aus
einer Release besteht. Ich habe über die Jahre immer wieder mit
Webcrawlern und Möglichkeiten zum effizienten indexieren experimentiert und werde vermutlich
in diesem Jahr noch eine überarbeitete Version des Indexers Online stellen.

5. Online Face Detection

Man kann derzeit Bilder hochladen wenn Gesichter erkannt werden, werden Sie rot Umramt und Angezeigt. Für die Zukunft ist auch Gesichtserkennung in Videos angedacht.



Ich hoffe euch hat dieser kleine Exkurs zu meinen Projekten gefallen.
Wie immer freue ich mich natürlich über Anregungen, Kritik und Kommentare.

Andreas


Kommentare

by:
  1. Was ist ein transparenter Proxy?
  2. Beispiel Implementierung
  3. Anwendungsbeispiele
  4. Spaß mit Proxys


Was ist ein transparenter Proxy?

Ein transparenter Proxy beschreibt im wesentlichen die Technik bestimmte
Anfragen an einen Proxy weiterzuleiten.
Der Benutzer bekommt von der Umleitung in der Regel nichts mit.


Beispiel Implementierung

In unserem Beispiel gehen wir mal davon aus, alle http Anfragen (also TCP Port 80)
an unseren Proxy weiterzugeben.
Dies machen wir mit Hilfe einer IP Tables Regel auf unserem Router:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Nun werden alle Anfragen auf den Proxy Port 3128 weitergeleitet.
Eventuell müsst Ihr noch das Input Device (im Beispiel eth1) wechseln.


Anwendunsbeispiele

Da es relativ viele Möglichkeiten gibt seinen Proxy zu konfigurieren, möchte ich hier
nur einen Überblick geben, wozu ich bisher Proxys installiert habe.

Der Cache
Der Klassiker ist sicher ein reiner Webseiten-Cache. Er dient dem Zweck Webseiten
zwischenzuspeichern und spart somit Bandbreite und verkürzt dazu noch die Ladezeit.

Der Anonyme
Der Proxy bewirkt, dass Verbindungsdaten anonymisiert werden.
Bei der Variante Tor hat man in der Regel bei jeder Anfrage eine andere IP die nach
außen sichtbar ist.
Die Rechtslage dazu ist derzeit unklar, da innerhalb der EU alle Verbindungsdaten gespeichert
werden müssen.
Auch die Zuverlässigkeit ist umstritten, da es vereinzelt Meldungen gibt,
wie man Tor Traffic beeinflussen kann.
Ein Nachteil ist außerdem, dass die Verbindungen unter anderem sehr langsam sind.

Der Filter Proxy
Er kann so konfiguriert werden, dass man Werbung, bestimmte Webseiten
oder einzelne Texte/Bilder filtert.
Vor einiger Zeit habe ich auch mal einen Proxy installiert, der alle Downloads zuerst durch den Virenscanner laufen ließ.

Andere Formen von Proxys
Web Proxy: Er dient der Zwischenspeicherung von Anfragen an den Webserver um diesen zu
entlasten.
MySQL- Proxy: Er verteilt die Anfragen an die Datenbank.

Natürlich kann man einen Proxy auch dazu verwenden um Mitarbeiter zu
überwachen und deren gesamten Webverlauf zu protokollieren.

Wie ihr seht, gibt es viele Einsatzgebiete, wo es Sinn macht einen Proxy einzusetzen,
sei es aus Performance- oder Sicherheitsgründen.

Es gibt selbstverständlich noch zahllose andere Anwendungsmöglichkeiten für einen Proxy,
diese hier aufzulisten würde wohl den Rahmen sprengen...
Dennoch hoffe ich, ihr konntet einen kurzen Einblick in die Materie erhalten.

Ich denke das Internet würde es heute nicht in der Form geben, würden nicht vereinzelt Proxys
die Inhalte zwischenspeichern und so uns einen schnellen Zugriff auf die gewünschten
Informationen gewährleisten.


Spaß mit Proxys

Spaß mit Proxys kann man haben, wenn man z.B. Bilder oder einzelne Texte ersetzt.
Die Erfahrung hat gezeigt, dass viele Anwender Manipulationen nicht mal bemerken, solange man es nicht allzu offensichtlich macht und einfach alle Bilder mit seinem Allerwertesten ersetzt.


Wer Fragen zur Konfiguration der vorgestellten Varianten hat, kann sie gerne stellen,
auch Kommentare sind herzlich Willkommen! ;)

LG

Andreas


Quellen:

http://de.wikipedia.org/wiki/Proxy_(Rechnernetz)

http://www.squid-cache.org
http://www.squid-handbuch.de/hb/
http://www.torproject.org
http://forge.mysql.com/wiki/MySQL_Proxy


Kommentare

by:

Die Angriffsformen sind gefährlich und können erheblichen Schaden anrichten, um ihnen effizient begegnen zu können ist es notwendig ihre Funktionsweise zu verstehen.

Anmerkung:

Alle vorgestellten Techniken sind ausschließlich zu edukativen Zwecken gedacht! Die Anwendung dieser Angriffe in öffentlichen Netzwerken ist ILLEGAL.

Bedenkt auch, dass in manchen Ländern schon das reine Beschaffen der Software strafbar ist (siehe sogenannter Hackerparagraph § 202c).

Was ist eine Man in the Middle Attacke (MitM) ?

Eine MitM Attacke bedeutet, dass man seinem Opfer vortäuscht, das eigentliche Ziel zu sein.

In der Praxis sendet der Angreifer dem Opfer gefälschte ARP Pakete indem er vorgibt, der Gatewayrechner zu sein. Ab diesem Zeitpunkt werden alle Anfragen vom Opfer an den Angreifer gesendet, man spricht auch von ARP Spoofing. Der Angreifer kann jetzt die Pakete weiterleiten und manipulieren. Natürlich ist es nun möglich alle in Klartext gesendeten Passwörter ohne große Mühe mitzulesen, sowie gefälschte Antworten an das Opfer zu senden.

Typisches Angriffsszenario

Der Angreifer führt eine MitM Attacke durch und leitet mit Hilfe von DNS Spoofing das Opfer auf eine gefälschte Webseite weiter. Diese entspricht rein optisch zumeist der eigentlichen Zielseite des Opfers. Hier hat der Angreifer jedoch die Möglichkeit die gefälschte Webseite so zu manipulieren, dass Passwörter und andere Eingaben gespeichert werden. Das Opfer bleibt in dem Glauben, dass alles in Ordnung ist und lediglich der Service vorübergehend nicht verfügbar ist oder das Passwort nicht mehr gültig sei...

Der Angriff

Ich persönlich empfehle Ettercap (0.6.b), da es Plattform unabhängig ist und eine Reihe von nützlichen Plugins mitliefert.

Wir editieren für unser DNS Spoofing zuerst die etter.dns Datei, die nach der Default- Installation im Verzeichnis /usr/local/share/ettercap zu finden ist.

78.41.112.52 *

Bei diesem Eintrag werden alle DNS Anfragen mit der IP 78.41.112.52 beantwortet.

Es ist natürlich auch möglich einzelne Hostnamen einzutragen:

78.41.112.52 microsoft.com

Nun können wir Ettercap starten, das Gateway mit der Entertaste auswählen, die a- Taste aktiviert das ARP Spoofing und das Plugin können wir mit p auswählen und aktivieren.

Bitte beachte, dass du als Angreifer nicht von der DNS Attacke betroffen bist, suche dir daher zum Testen und Überprüfen des Angriffs einen anderen Client Rechner in deinem lokalen Netzwerk.

Prävention

Eine gut gemachte MitM Attacke ist für den Laien nicht erkennbar und selbst für Leute, die sich damit auskennen, oft nicht leicht zu bemerken. Prävention ist daher eine wichtige Maßnahme.

Eine einfache Form der Prävention ist beispielsweise seine Daten zu verschlüsseln, was man bei sensiblen Daten prinzipiell immer machen sollte.

Der Chaos Computer Club hat allerdings schon bewiesen, dass auch verschlüsselte Webseiten mit SSL nicht unbedingt sicher sind.

Eine andere effektive Form der Prävention wäre z.B. statisches Routing, was allerdings bei größeren Netzwerken viel Administrationsaufwand bedeutet.

Desweiteren gibt es sogenante IDS (Intrusion Detection System) Systeme wie Snort, die solche Attacken erkennnen und gegebenenfalls darauf reagieren können.

[UPDATE]

Nachdem die Nachfrage nach Prävention hoch ist, möchte ich hier noch näher darauf eingehen.

Unter Windows gibt es das Tool Xarp2, welches Manipulation des ARP Caches erkennt. Man kann eine kostenlose Testversion hier herunterladen:

http://www.chrismc.de/development/xarp/index.html

Ein kostenloses Tool unter Linux wäre Arpwatch, das ebenfalls die Übersetzung Hardware zu IP Adresse überwacht und gegebenfalls den Administrator informiert:

http://www-nrg.ee.lbl.gov/ Download

Ich habe auch von dem Lösungsansatz gehört, dass jeder User in einem eigenen VLAN ist.

Ein Warnhinweis in eigener Sache:

Ich habe solche Attacken mit Erfolg in vielen Netzwerken getestet, dabei war mir die gesamte Tragweite oft nicht klar. Zum Beispiel bin ich nach einer erfolgreichen MitM- Attacke auf über 400 Rechner drauf gekommen, dass im Nachbarzimmer atomarer Abfall gelagert wurde... Ich gehe zwar davon aus, dass dieser gesondert gesichert ist, dennoch waren mir am Beginn des Angriffes die eventuellen Folgen nicht bewusst.

Ich bitte daher nochmals solche Angriffe nur im lokalen Netzwerk zu testen und es auch dabei zu belassen.

Ich hoffe euch hat der Beitrag gefallen und ich würde mich sehr über Feedback freuen.

Wer noch mehr Erfahren möchte kann hier weiterlesen.

Liebe Grüße

Andreas

Quellen:

http://de.wikipedia.org/wiki/Man-In-The-Middle-Angriff

http://ettercap.sourceforge.net/

http://www.monkey.org/~dugsong/dsniff/

http://www.snort.org


Kommentare


Seiten: