Kategorie: Coding

Die Sicherheitslücken von JavaScript: Fremdcodes und Bibliotheken

JavaScript-Bibliotheken sind unbestreitbar praktisch, doch ihre Sicherheit wird oft fahrlässig gehandhabt. Dabei gibt es ein paar simple Regeln, die man befolgen sollte, um seine Webseite vor Cyberattacken zu schützen.

JavaScript bietet vielfältige Möglichkeiten, dynamische und interaktive Webseiten-Inhalte zu kreieren. Im Laufe der Zeit hat sich die einst recht simple Skriptsprache an die gängigen Programmiersprachen angenähert und ist dadurch unweigerlich komplexer geworden. Zum Glück gibt es ja die zahlreichen JavaScript-Bibliotheken für nahezu jeden Zweck, in denen geübte Coder die am häufigsten verwendeten Funktionen und Anweisungen zusammengefasst haben – ein Segen für Einsteiger und diejenigen, die regelmäßig am DOM verzweifeln.

Was viele Webseiten-Designer und -betreiber aber gerne vergessen, ist die Tatsache, dass diese hilfreichen Programmierwerkzeuge auch das größte Sicherheitsproblem von JavaScript darstellen. Denn jeder Code, den man nicht selbst geschrieben hat, kann versehentliche oder gar beabsichtigte Fehlerstellen enthalten, die sich Hacker für Cyberangriffe zunutze machen können.

Vernachlässigte Problematik

Wie ernst das Problem ist, enthüllten im März dieses Jahres sechs Wissenschaftler von der Northeastern University of Boston in einer Studie: Von 133.000 untersuchten Webseiten verwendeten knapp 38% mindestens eine als verwundbar geltende JavaScript-Bibliothek, 10% sogar zwei oder mehr. Im Jahr 2014 hatte es bereits eine ähnliche Studie gegeben – mit noch schlechteren Ergebnissen.

Jüngste Ereignisse zeigen, wie problematisch sogenannter „third party code“ für die Webseiten-Sicherheit sein kann. Im angefügten (englischsprachigen) YouTube-Video demonstriert Guy Podjarny von der Firma Snyk anschaulich einige solcher „vulnarability exploits“ aus der realen Welt und macht damit deutlich, dass bereits kleinste Veränderungen des Codes ausreichen, um eine Webseite angreifbar zu machen.

Was man als Programmierer tun kann

Leider existieren bislang keine einheitlichen Datenbanken für Sicherheitslücken in JavaScript-Bibliotheken. Das ist besonders problematisch, wenn man bedenkt, dass zum Beispiel das vielseitig einsetzbare jQuery 37% der Sicherheitslücken in der genannten Studie ausmachte. Der Liebling eines jeden Coders und seine dazugehörige Erweiterung UI werden nämlich in vielen Webseiten verwendet, die mit weit verbreiteten CMS wie etwa WordPress programmiert wurden. jQuery Version 1 ist immer noch mit Abstand auf häufigsten im Einsatz, Version 2 und 3 werden kaum benutzt.

jQuery Versionsverteilung

jQuery Versionsverteilung (Quelle: W3Techs)

Das Bundesamt für Sicherheit in der Informationstechnik gibt zu diesem Thema ein paar Empfehlungen ab, die im Folgenden kurz zusammengefasst werden:

  • Drittanbieter-Bibliotheken weisen gemäß Studie tendenziell mehr Sicherheitslücken auf, da sie veränderten Code enthalten können, vor allem wenn sie aus vertrauensunwürdigen Quellen heruntergeladen werden. Es ist also empfehlenswert, die Reputation einer ausgewählten Seite vor dem Download zu überprüfen und im Zweifelsfall sämtliche Funktionen der Bibliothek selbst auszutesten.
  • Bei vielen der untersuchten Bibliotheken lag die letzte Software-Aktualisierung im Durchschnitt drei bis vier Jahre zurück! Dabei sind regelmäßige Updates eine unabdingbare Voraussetzung in jedem Aspekt der Webseiten-Security.
  • Es gilt die Faustregel: Je mehr Codes vorhanden sind, desto größer ist die Fehleranfälligkeit. Jedoch werden durchschnittlich 50% der Funktionen von „multipurpose libraries“ gar nicht verwendet. Man sollte sich also darüber klarwerden, welche Funktionen man wirklich benötigt, und im Anschluss gründlich ausmisten.
  • Egal, wie praktisch und bewährt sie sein mögen – veraltete Bibliotheken wie SWFObject erfahren schon lange keinen Support mehr und sollten deshalb gänzlich gemieden werden. Nicht umsonst verfielen beispielsweise 87% der Sicherheitslücken in der genannten Studie auf die Bibliothek YUI, von der keine aktuelle Version mehr existiert.

Javascript Code

Kategorien: Coding Internet

WordPress REST-API deaktivieren

WordPress Logo

Die WordPress REST-API ist ein spannendes Thema. Grundsätzlich soll die API eine einfach zu erweiternde Schnittstelle für die Kommunikation mit anderen Programmen bereitstellen. Mit WordPress Version 4.4 wurde die grundlegende REST-API-Infrastruktur in den WordPress-Core integriert. Die gestern veröffentlichte Version 4.7 integriert sogenannte Inhalts-Endpunkte, welche bisher nur über ein separates Plugin vorhanden waren. Durch die Endpoints können andere Programme mit WordPress interagieren und bestimmte Informationen ein- oder auslesen.

Die REST-API ist unter der URL „http://www.meine-seite.de/wp-json/“ erreichbar. Das Auslesen der Artikel ist beispielsweise folgendermaßen möglich: „https://www.meine-seite.de/wp-json/wp/v2/posts“.

Wer eine Webseite mit WordPress betreibt und die REST-API nicht nutzt, möchte die API vielleicht lieber deaktivieren. Die API komplett zu deaktivieren ist keine gute Idee, da mittlerweile immer mehr Funktionen im Backend die REST-API benötigen. Allerdings lässt sich die API so umbiegen, dass sie nur von angemeldeten Benutzern verwendet werden kann. Dies ist relativ einfach möglich und erfordert nur ein paar Zeilen Code, die in der „functions.php“ eures Themes bzw. Child-Themes eingefügt werden müssen.

/* ------------------------------------------------------------------------- *
* Returning an authentication error if a user who is not logged in tries to query the REST API
/* ------------------------------------------------------------------------- */
function only_allow_logged_in_rest_access( $access ) {
    if( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_API_cannot_access', 'Only authenticated users can access the REST API.', array( 'status' => rest_authorization_required_code() ) );
    }
    return $access;
}
add_filter( 'rest_authentication_errors', 'only_allow_logged_in_rest_access' );

remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action( 'template_redirect', 'rest_output_link_header', 11 );
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );

Die unteren drei Zeilen sorgen dafür, dass der Ausgangspunkt der REST-API nicht im Quellcode, Header und unter der XMLRPC-Schnittstelle publiziert wird.

In den Kommentaren wurde ich darauf hingewiesen, dass Contact Form 7 ab Version 4.8 bei deaktivierter REST-API nicht mehr richtig funktioniert. In diesem Fall kann aber auf das Plugin „Disable REST API“ zurückgegriffen werden, welches das Whitelisting bestimmter Routen erlaubt. Damit können dann die für Contact Form 7 benötigten Routen erlaubt werden, während alles andere deaktiviert ist.

Kategorien: Coding Wordpress

Amazon Web Services Tutorials

Unter dem Namen Amazon Web Services (AWS) bietet der weltbekannte Internetshop eine Sammlung verschiedener Webservices als Cloud-Lösung an. Viele Entwickler setzen auf die recht günstigen und vor allem zuverlässigen Dienste von Amazon.

In seinem Amazon Web Services Blog hat der Internetriese nun eine Übersicht mit Artikeln, Tutorials und Videos zusammengestellt, die im Jahr 2012 veröffentlicht wurden. Ein Muss für Cloud-Entwickler und welche, die es noch werden wollen.

Kategorien: Coding Internet

Mit w3af Webseiten auf Schwachstellen untersuchen

Das „Web Application Attack and Audit Framework“ (w3af) ist ein kostenloses Tool, um Webseiten auf Sicherheitslücken und Schwachstellen zu untersuchen. Beispielsweise kann mit w3af SQL-Injection, Remote File Inclusion und Cross-Site-Scripting (XSS) getestet werden. Das Tool ist in Python geschrieben und kann sowohl per Kommandozeile, als auch mit einer grafischen Benutzeroberfläche bedient werden. w3af ist modular aufgebaut und beinhaltet mehr als 130 Plugins. Die integrierte Updatefunktion hält das Programm immer auf dem aktuellsten Stand.

Download w3af
w3af GUI

Tutorial Kommandozeile

Nachfolgend eine kurze Anleitung, wie eine Webseite mit w3af untersucht werden kann und die Ergebnisse als HTML-Datei ausgegeben werden.

  1. Zuerst muss das Ziel definiert werden.
    w3af>>> target
    w3af/config:target>>> set target http://localhost
    w3af/config:target>>> back
  2. Jetzt müssen die gewünschten Plugins ausgewählt werden. In meinem Beispiel nutze ich je zwei Plugins aus dem audit- bzw. discovery-Bereich. Außerdem definiere ich HTML als Ausgabeformat für die Ergebnisse.
    w3af>>> plugins
    w3af/plugins>>> audit htaccessMethods buffOverflow
    w3af/plugins>>> discovery phpinfo serverHeader
    w3af/plugins>>> output htmlFile
    w3af/plugins>>> back
  3. Anschließend wird der Scan gestartet.
    w3af>>> start
  4. Die Ergebnisse werden in der Datei „report.html“ gespeichert. In Windows ist die Datei unter dem Pfad „C:\Programme (x86)\w3af\w3af“ zu finden.

Durch die vielen verfügbaren Plugins lassen sich auch deutlich komplexere Untersuchungen durchführen. Eine genaue Erklärung würde jedoch die Länge des Artikels sprengen.

Java – was sind Filter und Listener?

Wer sich mit Webprogrammierung in Java beschäftigt, wird früher oder später auf die Begriffe Filter und Listener stoßen. Ich möchte euch ganz kurz erklären, wobei es sich darum handelt.

Filter

Filter werden bei jedem Request vor und nach dem Servlet durchlaufen und können auf die Werte des Requests und der Response zugreifen und diese auch verändern. Dabei können mehrere Filter hintereinander geschaltet werden, die dann eine Filterkette bilden.

Anwendungsbeispiele:

  • Logging (welche Ressource wurde angesprochen, wie lange hat die Bereitstellung der Ressource gedauert)
  • korrektes Encoding für einen Request festlegen
  • Request entschlüsseln, Response verschlüsseln
  • Response komprimieren (deflate, gzip)
  • Transformation von XML mit Hilfe von XSLT

Listener

Listener sind Programmteile, die bei bestimmten Ereignissen automatisch aufgerufen werden.

Anwendungsbeispiele:

  • aktive Sessions verfolgen
  • herausfinden, wenn ein Attribut an eine Session gebunden wird

Kategorien: Coding

Basis Theme für WordPress

Es existieren verschiedene Möglichkeiten ein eigenes Themes für WordPress zu entwickeln. Vom komplett eigenen Aufbau über die Verwendung von Frameworks und die Modifikation bestehender Themes, ist so gut wie alles möglich. Eine sinnvolle Alternative ist das WordPress Basis Theme.

Wie der Name schon vermuten lässt, stellt das Basis Theme ein schlankes Grundgerüst für einen einfachen Start bereit. Die Vorlage lässt sich leicht den eigenen Bedürfnissen anpassen und bietet auch schon einige wichtige Grundfunktionen.

Das Basis Theme wird regelmäßig aktualisiert und ist bereits in HTML5 verfasst. Auch CSS3 Media Queries, um das Design automatisch auf mobile Endgeräte anzupassen, sind bereits definiert.

Download WordPress Basis Theme (automatisch die aktuellste Vesion)
Homepage des WordPress Basis Theme

Kategorien: Coding Wordpress

RailsInstaller 2 für Windows

Vor ein paar Monaten habe ich beschrieben, wie ihr Ruby on Rails 3 unter Windows von Hand installieren könnt.

Mittlerweile ist Version 2 des RailsInstallers erschienen. Im Regelfall würde ich das Tool der manuellen Installation von Ruby on Rails 3 vorziehen. Neben dem Update auf Ruby 1.9.2 ist in der neuen Version auch bereits Rails 3.1 enthalten. Außerdem ist TinyTDS enthalten, wodurch mittels FreeTDS eine MSSQL-Datenbank genutzt werden kann. Alternativ kann auch das integrierte SQLite in Version 3.7.3 verwendet werden.

Download RailsInstaller

Java 7: Verbesserungen an der Programmiersprache

Nach mehr als fünf Jahren Entwicklungszeit erschien vor kurzem Java in Vesion 7. Insgesamt enthält die neue Version rund 9.500 Verbesserungen. Nachfolgend eine Liste der wichtigsten Neuerungen:

  • neue API für Dateisystem-Operationen (NIO.2)
  • neue API für Multi-Core-Systeme
  • neuer Garbage Collector (G1)
  • verbesserten Unterstützung von dynamischen Programmiersprachen (Ruby, Python und Javascript)
  • Unterstützung von Unicode 6.0
  • Überarbeitung zahlreicher Bibliotheken

Eine detaillierte Übersicht aller Neuerungen findet ihr in den Release Notes.

Programmieren in Java soll leichter werden

Zu den oben genannten großen Änderungen kommen noch einige kleinere Verbesserungen, die vor allem das Programmieren in Java erleichtern sollen. Nachfolgend ein paar Beispiele.

Numerische Literale lassen sich nun neben der dezimalen (36), hexadezimalen (0x24) sowie oktalen (044) auch in der binären (0b100100) Schreibweise definieren.

[sourcecode language=“java“]public static final float PI = 3.141592f;
int decimal = 36;
int hex = 0x24;
int octal = 044;
int binary = 0b100100;
[/sourcecode]

Zur besseren Lesbarkeit dürfen numerische Literale nun mit Unterstrichen versehen werden. Allerdings nicht am Anfang oder am Ende und an zweideutigen Stellen, wie beispielsweise vor oder nach dem „x“ in der hexadezimalen Schreibweise. Der Compiler entfernt beim Parsen die Unterstriche.

[sourcecode language=“java“]int longBinary = 0b1001_0011_0110_1011;
int longHex = 0xAA33_BE41;
int million = 1_000_000;[/sourcecode]

Das Anlegen von Objekten mit generischen Parametern wurde durch die Einführung des Diamond-Operators (<>) erleichtert. Auf der rechten Seite muss die Zuweisung nicht mehr wiederholt werden. Dadurch spart man sich Tipparbeit und der Quellcode wird kürzer und übersichtlicher.

[sourcecode language=“java“]HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();
HashMap<String, List<Integer>> map = new HashMap<>(); // kürzere Schreibweise
ArrayList<String> liste = new ArrayList<String>();
ArrayList<String> liste = new ArrayList<>() // kürzere Schreibweise;[/sourcecode]

Switch-Case-Anweisungen funktionieren ab Java 7 neben primitiven Datentypen nun auch mit Zeichenketten. Dabei wird der String im Switch-Ausdruck mit der Methode „equals“ mit dem Case-Fall verglichen. Anschließend gibt er die entsprechende Zahl zurück.

[sourcecode language=“java“]public static int getDay(String day) {
int dayNumber = 0;
if (day == null) { return dayNumber; }
switch (day.toLowerCase()) {
case "montag": dayNumber = 1; break;
case "dienstag": dayNumber = 2; break;
case "mittwoch": dayNumber = 3; break;
case "donnerstag": dayNumber = 4; break;
case "freitag": dayNumber = 5; break;
case "samstag": dayNumber = 6; break;
case "sonntag": dayNumber = 7; break;
default: dayNumber = 0; break;
}
return dayNumber;
}[/sourcecode]

Bei den Exceptions gibt es nun die Möglichkeit mehrere Exceptions in einem Catch-Block zu fangen. Zwischen den verschiedenen Typen steht dann jeweils ein OR-Zeichen (|). Sehr hilfreich um eine Aneinanderreihung von Catch-Blöcken zu vermeiden.

[sourcecode language=“java“]
try{
// …
} catch (IOException e) {
System.out.println("Operation xyz fehlgeschlagen: " + e);
} catch (ParseException e) {
System.out.println("Operation xyz fehlgeschlagen: " + e);
}

try {
// …
} catch (IOException | ParseException e) {
System.out.println("Operation xyz fehlgeschlagen: " + e);
}[/sourcecode]

IE cached AJAX-Requests

Beim Test eines AJAX-Requests ist mir aufgefallen, dass dieser im IE nicht immer funktionierte. Nach kurzer Fehlersuche habe ich herausgefunden, dass der Internet Explorer AJAX-Requests ziemlich aggressiv cached. Bei jQuery gibt es die Möglichkeit das Caching für den AJAX-Aufruf explizit zu deaktivieren:

[sourcecode language=“javascript“]$.ajax({
url: "ajax.php",
type: "GET",
data: ({id : this.getAttribute(‚id‘)}),
cache: false
}[/sourcecode]

Kategorien: Coding

PHP: cURL als Alternative für allow_url_fopen

Gestern bekam ich eine Mail von meinem Webhoster, dass ab sofort die aktuellste PHP-Version 5.3.6 zur Verfügung steht. Die neue Version ist nun direkt als Modul in Apache integriert, anstatt wie früher als CGI-Programm. Dadurch sollen sich spürbare Geschwindigkeitsverbesserungen ergeben. Tatsächlich muss ich sagen, dass mein Blog deutlich schneller lädt, vor allem der Admin-Bereich.

Allerdings wurde aus Sicherheitsgründen auch die Funktion „allow_url_fopen“ standardmäßig deaktiviert. Damit funktioniert mein kürzlich vorgestelltes Skript zum RSS-Feeds auslesen leider nicht mehr. Den Code habe ich auch zum Anzeigen der „Hartware News“ in der Sidebar ganz unten auf der Startseite verwendet. Also was tun? Zurück auf die alte PHP-Version und die bessere Performance herschenken? Nein, kommt nicht in Frage. Also musste mein Skript angepasst werden. War sogar deutlich einfacher als ich anfangs dachte.

Anstatt des bisherigen Codes zum Laden des RSS-Feeds

$xml =simplexml_load_file('http://www.hartware.net/xml/news.rdf

hier die Lösung mit cURL:

$url = "http://www.hartware.de/xml/news.rdf";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml_raw = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($xml_raw)

Kategorien: Coding Internet