Martin Lantzsch
Software Entwickler
22. August 2012

Nach Angriff alle .htaccess von einem Webspace löschen

22. August 2012 - Geschrieben von Martin - Keine Kommentare

Viele Bots platzieren auf Webspaces, die gekapert wurden .htaccess Dateien, in denen Redirects stehen, um die Besucher der jeweiligen Webseite auf dubiose andere Seiten zu leiten. Da man bei einem CMS System durchaus mehrere hundert Verzeichnisse hat, in das die .htaccess rekursiv reingeschrieben wurden, ist der Aufwand natürlich sehr hoch diese einzeln zu löschen.

Ich habe mir hierzu folgendes *zwei Minuten muss unbedingt die .htaccess schnell löschen* Script geschrieben, da doch immer wieder Webspaces bereinigt werden müssen, wenn deren Eigentümer zu einfache Passwörter verwendet oder diese weitergegeben haben.

<?php
function deleteHtaccess($dir) {
	$files = scandir($dir);
	$files[0] = null;
	$files[1] = null;
	foreach($files as $f) {
		if($f != null) {
			if(is_dir($dir.'/'.$f)) {
				deleteHtaccess($dir.'/'.$f);
			} else if($f == '.htaccess') {
				chmod($dir.'/'.$f, 777);
				unlink($dir.'/'.$f);
				echo 'delete '.$dir.'/'.$f.'<br>';
			}
		}
	}
}
deleteHtaccess('./');

17. August 2012

Firefox Hack – onresize page refresh

17. August 2012 - Geschrieben von Martin - Keine Kommentare

Die Entwickler von Firefox meinen es sei nicht nötig, dass man beim resizen des Fensters die Seite neu lädt und haben so bei der Behandlung des Resize Events jegliche Seiten reloads gesperrt.

Da ich das allerdings in einem bestimmten Anwendungsszenario trotzdem benötigte, habe ich herausgefunden, dass man es mit folgendem „Hack“ umgehen kann, weil der Reload dann natürlich nicht mehr vom resize initiiert wird:

$(window).resize(function() {
	setTimeout(function() { window.location.reload() }, 0);
});

Durch den Timeout mit der Verzögerung von 0 Millisekunden (also sofort) wird die aufgerufene Funktion sozusagen in ihrer Herkunft anonymisiert.

Sehr umständlich, in allen anderen Browsern funktioniert es direkt, aber die Saboteure von Mozilla meinten wieder sie müssen die Welt verbessern…

19. Juli 2012

PHP – Array zu Excel

19. Juli 2012 - Geschrieben von Martin - Keine Kommentare

Eine Excel Datei generiert man wohl am besten mit „PHPExcel„, hat am meisten Funktionen, unterstützt sehr viele Excel Eigenschaften – aber, genau da liegt der Hund begraben. Es ist für viele Projekte und einfache Exporte einfach zu viel.

Deshalb verwende ich für solche Fälle immer die „php-excel“ Klasse.

Diese hat keine 200 Zeilen Code, ist extrem schnell und wandelt ganz einfach verschachtelte Array’s in Excel Tabellen um.

<?php
require 'php-excel.class.php';
$data = array(
	array('Spaltenüberschrift 1', 'Spaltenüberschrift 2', 'Spaltenüberschrift 3'),
	array('Wert A2', 'Wert B2', 'Wert C2'),
	array('Wert A3', 'Wert B3', 'Wert C3')
);
$xls = new Excel_XML('UTF-8', false, 'Name der Arbeitsmappe');
$xls->addArray($data);
$xls->generateXML('Dateiname');

Dies wird nun dem Browser eine Excel Datei namens „Dateiname.xls“ zum Download anbieten, welche wie folgt aufgebaut ist:

Spaltenüberschrift 1 Spaltenüberschrift 2 Spaltenüberschrift 3
Wert A2 Wert B2 Wert C2
Wert A3 Wert B3 Wert C3
2. Juli 2012

TeamSpeak die Zicke

2. Juli 2012 - Geschrieben von Martin - Keine Kommentare

slogin superadmin a31akv
ERROR, invalid login
slogin superadmin a31akv
OK

Ahja…

11. Juni 2012

NodeJS Dateien aus Verzeichnis einlesen und ausgeben

11. Juni 2012 - Geschrieben von Martin - Keine Kommentare

Vieles bei NodeJS läuft synchron ab, was die Handhabung öfter etwas erschwert, wenn man wie ich z.B. von PHP kommt. Eben musste ich eine Lösung finden, wie ich alle Dateien aus einem Verzeichnis mit Inhalt einlesen, parsen und ausgeben kann.

Einen Array mit allen Dateien zu bekommen war kein Problem.

fs.readdir(filePath, function(err, files) { });

Nun wollte ich in dem Callback eine foreach Schleife laufen lassen um jede Datei einzulesen, zu parsen und an eine Variable anhänngen zu lassen. Natürlich auch kein Problem… Aber…

files.forEach(function(file) {
	fs.readFile(filePath + file, 'utf-8', function(err, data) {
		html += markdown(data.toString());
	});
});

wie gebe ich die Variable html nun an den Client zurück? Denn alles was nach dem „readdir“ kam, würde bereits ausgeführt, wenn ich es nach der foreach setze wurde es auch bereits ausgeführt. Also kommt hier Trick 17.

fs.readdir(filePath, function(err, files) {
	i = 0;
	files.forEach(function(file) {
		i++;
		fs.readFile(filePath + file, 'utf-8', function(err, data) {
			html += markdown(data.toString());
			if(--i === 0) {
				res.send(html);
			}
		});
	});
});

Eh alter was? Ja schon klar ;-) Und zwar setzen wir nachdem wir den Array mit den Dateinamen bekommen haben die Variable i, weisen ihr den Wert 0 zu und beim durchlaufen der einzelnen Dateien zählen wir immer um eines hoch. Wenn wir nun die Dateien einlesen zählen wir in der if Abfrage immer um eines runter und wenn in diesem Moment die Variable i auf 0 gesetzt wird, senden wir den Inhalt. Ja so einfach geht das. Achja, das *minus minus* muss vor das i, denn ansonsten wird der Wert von i für die if Abfrage genommen und danach erst runtergezählt.

23. Mai 2012

GitHub on Windows

23. Mai 2012 - Geschrieben von Martin - 3 Kommentare


So bequem hat noch keiner ein Repository unter Windows angelegt. Richtig cool das neue GitHub for Windows. So was hat die Welt gebraucht, denn bisher war Git unter Windows nur Gepfusche.

In den kommenden Tagen werde ich das mal in der Praxis testen, wenn ich meine ganzen C# Projekte hochlade.

23. Mai 2012

jQuery Easypassgen für Fomulare

23. Mai 2012 - Geschrieben von Martin - Keine Kommentare

Ich habe eine Modifikation an dem jQuery Plugin easypassgen vorgenommen um Passwörter auch in Formularfelder schreiben zu können. Es wird nun geprüft ob ein Attribut namens „value“ existiert, wenn ja wird das Passwort dort hineingeschrieben.

/* http://code.google.com/p/jquery-easypassgen/
   Easy Password Generator for jQuery v1.4.
   Written by Yuri Pikin (me{at}jurius.name) December 2010.
   Licensed under the MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) license.
   Please feel free to use it.
 
   Example page enable at http://pasw.pm-tools.ru
*/
 
(function( $ ){
 
    var methods = {
        init:   function ( options ){
 
            return this.each(function( ){
 
                var $this = $(this);
 
		if($this.attr('value') == undefined) {
			$this.html($.fn.easypassgen('generate', options ));
		} else {
			$this.attr('value', $.fn.easypassgen('generate', options ));
		}
            });
        },
        generate: function( settings ){
 
            var system = {
                commonChars:    "bcdfghkmnprstvz",
                allConsonants:  "bcdfghkmnprstvzjqwx",
                allVowels:      "aeuy",
                allChars:       "bcdfghkmnprstvzjqwxaeuy",
                specialChars:   "#^:_-",
                randomize:      function( from, to){
                    from = typeof(from) != 'undefined' ? from : 0;
                    to = typeof(to) != 'undefined' ? to : from + 1;	
                    return Math.round(from + Math.random()*(to - from));
                },
                getRandomCharacter: function(a){
                    return a.charAt(this.randomize(0,a.length-1));
                }
            };
 
            var defaultSettings = {
                'syllables':        3,
                'numbers':          true,
                'specialchars':     false
            };
 
            if (settings){
                $.extend( defaultSettings, settings );
            }
 
            var numberProbability = 0, numberProbabilityStep = 0.25;
            var specialProbability = 0, specialProbabilityStep = 0.5;
 
            var generatedPass = '';
 
            for(var i = 0; i < defaultSettings.syllables; ++i) {
                    if(Math.round(Math.random())) {
                            generatedPass += system.getRandomCharacter(system.commonChars).toUpperCase() +
                                                                    system.getRandomCharacter(system.allVowels) +
                                                                    system.getRandomCharacter(system.allChars);
                    } else {
                            generatedPass += system.getRandomCharacter(system.allVowels).toUpperCase() +
                                                                    system.getRandomCharacter(system.commonChars);
                    }
                    if(defaultSettings.numbers && Math.round(Math.random() + numberProbability) && ( i != (defaultSettings.syllables-1))) {
                            generatedPass += system.randomize(0,9);
                            numberProbability += numberProbabilityStep;
                    } else if (defaultSettings.specialchars && Math.round(Math.random() + specialProbability) && (i != (defaultSettings.syllables-1))){
                            generatedPass += system.getRandomCharacter(system.specialChars);
                            specialProbabilityStep += specialProbabilityStep;
                    }
            }
 
            return generatedPass;
        }
    }
 
    $.fn.easypassgen = function( method ) {
 
        if ( methods[method] ) {
            return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.easypassgen' );
        }
    };
 
})( jQuery );