Darknet – Was es im Web sonst noch so gibt

Für die Behörden gleich vorweg:
JA, ich war auf diversen Internetseiten, die illegales Material oder Services anbieten.
NEIN, ich hab KEINES dieser Materialien heruntergeladen und keinen dieser Services in Anspruch genommen.
NEIN, ich habe mich NICHT an dem zum Teil tiefst pornographischen Materialien
(für die meisten sollte klar sein, was ich meine) belustigt oder befriedigt.
Sollte eine Behörde diesen Artikel hier lesen und die Onion-Addressen benötigen, wovon ich mal nicht ausgehe, denn die sind 1. wahrscheinlich bei denen eh schon bekannt und 2. lässt sich auf Grund des Onionroutings nicht wirklich viel dagegen machen, dann bitte Kontakt via E-Mail aufnehmen. Es wird dann meinerseits eine umfassende Prüfung unter anderem durch Telefon und Vorlage eines Dienstausweises durchgeführt, so wie eine persönliche Übergabe vor Ort.
(mehr …)

Hacking and Cracking #1: Warum C#, Java und co. nicht für proprietäre Software taugt

Ich werde in diesem Artikel ganz bewusst die Namen der beiden Programmen, an denen ich mich versucht habe, verzichten, da ich den Entwicklern und Herstellern keinen Schaden machen will.

Immer mehr Firmen entwickeln in immer leichteren Programmiersprachen: Typische Beispiele sind hierbei C#, VB.NET und Java. Allerdings sind Programme von Firmen meist mit Lizenzmodelenen oder anderweitigem bestückt. Was viele Hersteller jedoch nicht beachten, ist dass die Compiler dieser drei Programmiersprachen nicht wie bei C oder C++ nach Maschinencode, sondern nach Bytecode übersetzen. Und aus Bytecode lässt sich mehr oder weniger dem Originalsourcecode äquivalenten Code erzeugen. Als Entwickler hat man nun drei Möglichkeiten diesem unerwünschten Verhalten entgegenzuwirken:

  1. Man Programmiert in einer Sprache, die sich nicht derart einfach decompilen lässt.
  2. Man lässt das ganze Lizenzding einfach sein und stellt das Programm unter OpenSource.
  3. Man benutzt einen Obfuscator, der den Sourcecode soweit wie möglich unleserlich macht (dies ist bereits eine gute Methode seinen Quellcode zu schützen, decompilt kann er allerdings nach wie vor werden).

(mehr …)

ModPageSpeed: Flotter Seitenaufbau trotz Telekomdrossel

Bitte verzeiht mir die kleine Anekdote im Titel 😉

Heute möchte ich euch ein kleines Webserver-Modul (unterstützt werden dabei Apache (Pre-Build) und Ngnix (Sourcecode)) vorstellen: ModPageSpeed. Dieses sorgt für schnelleren Seitenaufbau durch Kompression und Entfernung unnötiger Leerzeichen, Tabs und Kommentaren bei CSS-Stylesheets und JS-Skripten sowie automatische Verkleinerung bei width oder height Angabe und Metadatenentfernung bei Bildern. Dies alles zusammen spart natürlich eine Menge Bits und Bytes wodurch der Seitenaufbau spürbar schneller geht. (mehr …)

Neuer Google Play Store lässt gelöschte Apps wieder erscheinen

Das große Internetfirmen wie Google und Facebook nichts löschen, auch wenn man den Löschen-Button betätigt, ist eigentlich nichts Neues, allerdings finde ich es immer wieder amüsant, wenn dann bei einem Redesign (oder ähnlichem) solche alten Daten plötzlich wieder auftauchen, die man schon vor Jahren gelöscht hat, so wie es aktuelle beim Google Play Store der Fall ist. (mehr …)

Joomla mit PHP 5.5 betreiben

UPDATE 1.10.14: Mittlerweile ist einiges an Zeit vergangen und der Fehler müsste mittlerweile in den neuen Versionen behoben sein (Patch wurde wie bereits gesagt September 2013 bereits in den Master Branch gemergt). Wenn also nun mit einer neuen Joomla Version ein Problem mit PHP5.5 wird sich der Fehler mit ziemlicher Sicherheit nicht mit diesem Patch beheben lassen, da er ja bereits integriert ist.

UPDATE 6.9.13: Seit einigen Wochen gibt es im Joomla-Master-Branch auf Github einen offiziellen Patch für das Problem. Ich hab meinen Patch entsprechend angepasst.

Heute hatte ich die Freude, ein Joomla-System auf einen neuen virtuellen Server mit der aktuellen PHP 5.5 Vesion zu installieren. Leider kommt der Joomla-Installer allerdings nicht über die erste Config-Seite hinweg. Grund dafür ist eine Ajax Abfrage im Hintergrund, die von PHP (oder auch nicht, je nach Konfiguration von display_errors) einen Fehler übermittelt bekommt, der jedoch während der Installation nie angezeigt wird. Der Serverlog in /var/log/httpd/error_log gab allerdings Aufschluss: Grund für die Verweigerung der Installation liegt bei der PHP-Funktion preg_replace in Kombination mit der Verwendung des Regexmodifizierers „e“ (PREG_REPLACE_EVAL). Durch diesen wurde $replacement nicht direkt eingesetzt, sondern wie bei der Funktion eval vorher ausgeführt. Da eval allerdings in Verbindung mit Benutzereingaben niemals eine gute Idee ist, gibt es ab PHP 5.5 nur mehr die Variante mit preg_replace_callback.

Folglich müssen in der Datei /pfad/zu/joomla/libraries/joomla/filter/input.php folgenden Zeilen leicht abgeändert werden:

	protected function _decode($source)
	{
		static $ttr;

		if (!is_array($ttr))
		{
			// Entity decode
			$trans_tbl = get_html_translation_table(HTML_ENTITIES);
			foreach ($trans_tbl as $k => $v)
			{
				$ttr[$v] = utf8_encode($k);
			}
		}
		$source = strtr($source, $ttr);

		// Convert decimal
		//$source = preg_replace('/&#(\d+);/me', "utf8_encode(chr(\\1))", $source); // decimal notation
		$source = preg_replace_callback(
			'/&#(\d+);/m',
			function ($var)
			{
				return utf8_encode(chr($var[1]));
			},
			$source
		);

		// Convert hex
		//$source = preg_replace('/&#x([a-f0-9]+);/mei', "utf8_encode(chr(0x\\1))", $source); // hex notation
		$source = preg_replace_callback(
			'/&#x([a-f0-9]+);/mi',
			function ($var)
			{
				utf8_encode(chr('0x' . $var[1]));
			},
			$source
		);

		return $source;
	}

Weitere Fehler sind mir bis dato nicht bekannt. Falls ich noch welche finden sollte, werden sie auch in diesem Artikel veröffentlicht.

Firefox, Google Chrome oder doch lieber ein anderer Browser?

Die ewige Frage nach dem „perfekten Browser“ wird auch dieser Artikel nicht lösen, doch ich habe mal ein paar durchprobiert und wollte euch hier meine Ergebnisse präsentieren. Noch eine kleine Anmerkung: Das hier wird KEIN Browserbashing oder dergleichen, sondern ich ziehe nur ein (persönliches) Fazit.

Mozilla Firefox

Ich war lange Zeit ein großer Verfechter von Firefox, da ich praktisch mit ihm groß geworden bin (vorher mit meinem Freund Internet Explorer damals noch Version 6 – Ach die guten alten Zeiten… NOT (Kleine Anekdoten sind vom Bashing im Übrigen ausgenommen :3)). Nur in letzter Zeit musste ich mich immer öfters mit ihm Ärgern, weniger mit der Geschwindigkeit beim Laden von Webseiten wie jetzt wahrscheinlich viele vermuten würden, sondern eher mit der Tatsache das viele Sachen nur mehr für Chrome entwickelt werden aber auch dem eigentlich sonst nicht so schlechten Dienst FirefoxSync. Vor allem letzteres treibt seit gestern verstärkt sein Unwesen. Ständig blendet er einen unbekannt Fehler bei FirefoxSync ein und meint, dass er es automatisch nochmals versuche würde, aber kaum habe ich den nervigen Balken weg geklickt kommt er auch schon wieder. Dies brachte mich soweit, dass ich heute schon mehr oder weniger dabei war auf Chrome umzustellen, was ich jedoch vor nicht all zu vielen Stunden wieder rückgängig machte. (Mehr dazu später im Chrome-Abschnitt).

Google Chrome

Wie im Firefox-Abschnitt schon angekündigt, war ich heute mehr oder weniger auf Chrome umgesattelt, was ich allerdings mittlerweile wieder rückgängig gemacht habe. Die Gründe sind ganz einfach: die Browsergeschwindigkeit (nicht die Ladegeschwindigkeit) bzw. der RAM-Speicherverbrauch. Machen wir mal eine kleine Firefox-Chrome-Speichertabelle (kleiner ist besser):

Firefox Chrome
RAM lt. TaskManager 394,25MB 455,84MB
Neuer Tab lt. Memoryübersicht 0,86MB 10,88MB
about:memory lt. Memoryübersicht 1,09MB 8,44MB
Addon AdBlocker lt. Memoryübersicht 15,59MB 95MB
Addon Ghostery lt. Memoryübersicht 2,98MB 13,47MB

Ich könnte diese Tabelle beliebig lange weiterführen… Chrome sieht im Task-Manager vielleicht auf dem ersten Blick nicht so speicherhungrig aus, alle Werte zusammengezählt fallen besonders Addons und Tabs ins Gewicht. Der Browser an sich selbst fällt nicht schlecht aus, nur was nützt mir ein Browser ohne Tabs und Addons? Besonders stark ist mir diese Speicherverschleiß bei Facebook aufgefallen, wo ich im Chat zum Teil mal dahin tippte und 3 Sek. später wurde es erst angezeigt; selbiges beim Schließen des Chat-Fensters. Auch aufgefallen ist mir, dass die Rechtschreibkorrektur einige Sekunden zum Laden braucht, was oft auch sehr ärgerlich ist. Was mir jedoch an Chrome sehr gefallen hat sind natürlich die schnelleren Ladezeiten, die funktionsreichere URL-Leiste so wie manches Entwicklertool, dass man z.B. im Firefox nicht vorfindet.

Maxthon Cloud Browser

Der Chinese unter den Browser tritt zum Kampf an, und ist (meiner Meinung nach) eine beachtliche Gefahr gegenüber den anderen Browser gegenüber. Nicht nur, dass er teilweise noch schnellere Ladezeiten (gefühlt) als Chrome hat, sondern schießt der mit seinen 476 Punkten im HTML5-Test zum Teil weit über die Punktzahl der Konkurrenz hinaus. Des Weiteren bietet Maxthon (meiner Meinung nach) die beste Cloudunterstützung zur Synchronisation von Lesezeichen, Verlauf, Passwörter und ja sogar Daten. Allerdings hat er noch ein paar Kinderkrankheiten wie z.B. die fehlende Unterstützung von Multitouch-Pads zur Seitennavigation (im Vergleich zu den anderen Browsern; nur mit meinen Notebook getestet). Früher gab’s auch mal Probleme mit dem @-Zeichen (wenn man es mit Strg+Alt+Q machte) aber dies scheint, wie ich gerade feststellen musste bereits behoben.

Fazit

Firefox, der Alleskönner

Chrome der schnelle Speicherfresser

und Maxthon der gefährliche Konkurrent

Was bleibt abschließend noch zu sagen? Ich werde vorerst noch bei Firefox bleiben, da mir die fehlende Touchnavigation im Maxthon einfach zu sehr fehlen würde. Chrome ist für mich nach dem heutigen Tag kein Thema mehr, aber vielleicht ändert sich das ja noch einmal.

Systemspezifikationen

Acer Aspire S5 mit einem Intel Core i7-3517U (3te Generation) und 4GB RAM auf einem Windows 7 (64bit) betrieben mit einer 256GB SSD.

Kommentarsystem mit Antwortfunktion

Vor einiger Zeit arbeitete ich an einem Projekt und brauchte bzw. wollte das erste Mal ein Kommentarsystem mit Antwortfunktion einbauen. Leider gab es im ganzen World Wide Web nicht wirklich etwas. Folglich habe ich mir das Ganze überlegt und selbst eines gebaut. Als Lösungsansatz diente mir ein rekursiver Funktionsaufruf. Hinweis: Ist wird davon ausgegangen, dass sie bereits ein Newssystem haben. Andernfalls würde ich Ihnen Kapitel 33 aus dem Quakenet PHP-Tutorial ans Herz legen.

Tabellenaufbau

Spalte Beschreibung
id Der eindeutige Schlüssel zur Identifikation eines Kommentars (UNIQUE, PRIMARY, A_I, UNSIGNED)
newsID Zu welcher News gehört das Kommentar? (UNSIGNED)
author Benutzername oder dergleichen (mit VARCHAR 32 dürfte man auskommen)
parentID Übergeordnetes Kommentar (wenn das Kommentar keine Überordnung hat -> 0) (UNSIGNED)
content Das Kommentar selber (TEXT)
date Abschließend noch das Datum (DATETIME)

Daraus ergibt sich folgendes SQL-Statement zum erstellen der benötigten Tabelle:

CREATE TABLE `news_comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `newsID` int(10) unsigned NOT NULL,
  `author` varchar(32) DEFAULT NULL,
  `parentID` int(10) unsigned NOT NULL,
  `content` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`)
)

Anzeigen der Kommentare

Zu Beginn benötigt man einmal den Funktionskopf des rekursiven Aufrufs. Übergeben muss man die newsID, die parentID (Standard 0) und einen Zähler (im Sinne von, dass wievielte Unterkommentar bin ich? | Standard ebenfalls 0). Daraus ergibt sich folgender Header:

function getComments($newsID, $parentID = 0, $i = 0)
{
    //Funktionscode
}

Zu Beginn der Funktion wird der Zähler gleich einmal mit $i++ erhöht, allerdings nur, wenn $parentID != 0 ist. Das ist deshalb wichtig, da die Unterkommentare später mit $i * 25px eingerückt werden und das erste Kommentar ja noch keine Einrückung haben soll.

Dann werden die Einträge mit newsID = $newsID und parentID = $parentID aus der Datenbank geladen und die Funktion wird erneut aufgerufen. Sollten keine Einträge vorhanden sein und $parentID den Wert 0 besitzen, wird noch ein Hinweis ausgegeben, dass keine Kommentare vorhanden sind.
Hier nun die ganze Funktion:

function getComments ($newsID, $parentID = 0, $i = 0)
{
    //$db enthält die mysqli-Verbindung zur Datenbank
    global $db
    if ($parentID != 0)
    {
        $i++
    }
    //Hier fehlt noch die Fehlerbehandlung, allerdings sollte die jeder selber hinbekommen. Ansonsten wird es dringendst Zeit sich mit den Grundlagen von PHP zu beschäftigen
    $stmt = $db->prepare('SELECT id, newsID, author, content, date FROM news_comments WHERE newsID = ? AND parentID = ?');
    $stmt->bind_param('ii', $newsID, $parentID);
    $stmt->execute();
    if ($stmt->num_rows > 0)
    {
        $stmt->bind_result($cID, $cNewsID, $cAuthor, $cContent, $cDate);
        while ($stmt->fetch())
        {
            echo '<span id="comment-author-' . $cID . '">' . $cAuthor . '</span> (am ' . $cDate . ') <a onclick="set_comment_parent(' . $cID . ')" href="#">Antworten</a>: ' . $cContent;
            getComments($newsID, $cID, $i);
        }
    }
    elseif ($parentID == 0)
    {
        echo 'Keine Kommentare vorhanden';
    }
    $stmt->close();
}

Hinzufügen von neuen Kommentaren

Hinweis: Das „normale“ hinzufügen eines Kommentars sollte eigentlich für jeden selber machbar sein und wird hier deshalb nicht behandelt. In diesem Abschnitt geht es rein um die clientseitige Setzung der parentID.

Wie der eine oder andere Aufmerksame Leser dieses Beitrags sicher schon gemerkt hat, habe ich die obige Ausgabe etwas „formatiert“. Dies ist nötig, um auf Dinge wie den Benutzernamen zuzugreifen können.

Zuerst werden ein paar neue Elemente im Formular benötigt:

  • <div id="comment_answer_to"></div>

    – Darin wird später ein kleiner Infotext angezeigt, auf welchen Benutzer geantwortet wird

  • <input name="parent_id" type="hidden" value="0" id="parent_id" />

    – Ein verstecktes Formularfeld, zur Übergabe der parentID

Nun brauchen wir nur noch die Funktion, die aufgerufen wird, wenn auf den „Antworten“-Link geklickt wird. In dieser wird die parentID gesetzt und der Benutzername auf dem man antwortet angezeigt. Wenn als Parameter 0 übergeben wird, wird die Benutzernamen-Anzeige wieder entfernt.

function set_comment_parent(id)
{
    document.getElementById('parent_id').value = id;
    document.getElementById('comment_answer_to').innerHTML = (id == 0) ? '' : 'Sie antworten auf das Kommentar von: ' + document.getElementById('comment-author-' + id).innerHTML + ' - <a href="#" onclick="set_comment_parent(0)>Zurücksetzen</a>"';
}

Damit hätten wir nun alle wichtigen Sachen für ein Kommentarsystem mit Antwortfunktion 🙂 Viel Spaß!

Eröffnung & Vorstellung

Heyjo Nerds, Geeks and the rest of the world 🙂

Mein neuer Coding-Blog DevGrid ist hiermit offiziell eröffnet.

Themen und Releasezyklus

In diesem Blog wird es vor allem um Themen gehen, die mich besonders interessieren. Diese währen unter anderem Webentwicklung, Betriebssystemprogrammierung mit Assembler, Optimierung, Gamification und Sicherheitsbewusste Programmierung. Artikeln, Anleitungen oder Tutorials werden immer dann erscheinen, wenn ich etwas Interessantes gefunden habe, wo ich selber noch etwas wichtiges beitragen kann.

Über mich

Mein Name ist „cheesi“ (so könnt ihr mich zumindest einfach nennen), bin aktuell 16 Jahre alt und besuche derzeit den zweiten Jahrgang (EDIT vom 25.6: SOMMERFERIEN und dann auf in die Dritte :D) der HTL-Grieskirchen (Fachrichtung Informatik). Mit „Programmieren/Coding“ habe ich mich das erste Mal ~2006 beschäftigt (habe damals mit HTML begonnen (deshalb Programmieren/Coding auch in „“) bin dann allerdings relativ schnell mit CSS und PHP nachgezogen). Fragen kann man mich im IT-Bereich so ziemlich alles, egal ob es jetzt um Betriebssysteme, Netzwerktechnik oder eben Coding/Programmierung geht.