Hallo!
Mein Name ist David Müller, ich arbeite bei der Public Cloud Group und wohne in Frankfurt. Hier geht es hauptsächlich um Webentwicklung.Kategorien
- webdev (131)
- php (84)
- Javascript (32)
- Datenbanken (22)
- Software Engineering (12)
- Performance (8)
- Security (27)
- PHP-WTF (11)
- Best of the Web (13)
- Quicktips (32)
- Linux (4)
- Java (3)
- misc IT (10)
- Persönlich (9)
- webdev (131)
Blogroll
Neueste Kommentare
- Tristan Tate bei Javascript: Arrays kopieren
- Daniel Marschall bei Dealing with Trusted Timestamps in PHP (RFC 3161)
- Login Mit Facebook Tutorial – Logini helper bei Facebook API – Tutorial
- PHP validation/regex for URL - Design Corral bei Why URL validation with filter_var might not be a good idea
- Manuel bei Meine ultimativen Buchempfehlungen
Archiv der Kategorie: webdev
Reingefallen: Wie man sich auf Facebook „Likes“ erschleicht
Ich dachte eigentlich, immun gegen so billige Spielchen zu sein. Aus dem „Ich weiß schon, wo ich hinklicke“-Grund hatte ich auch lange Zeit keinen Virenscanner drauf und fuhr eigentlich immer gut. Gestern hat michs jedoch erwischt – auf Facebook. Also jetzt nicht so richtig erwischt, aber ich habe ein Video geliked, ohne es zu wollen. Erbost ging ich der Sache auf den Grund und war ziemlich schockiert über diese miese Praktik. Aber der Reihe nach.
Es handelt sich „http://ksmp3.de/Guten-Morgen-Schatz-geht-daneben/„. Bitte erstmal nix klicken. Facebook packt den Like-Button sinnvollerweise in ein IFrame, weil man so mit Javascript keinen Klick auslösen kann (Cross Domain Policy).… Den ganzen Post lesen
Veröffentlicht unter Javascript, misc IT, Persönlich
83 Kommentare
Dealing with Trusted Timestamps in PHP (RFC 3161)
This article won’t be pariculary interesting for the most readers. My aim is to help the billions of developers that are confused about dealing with trusted timestamping. If you don’t know what Trusted Timestamps are, carry on.
Explanation of the concept behind Trusted Timestamps
I can’t put it better as Wikipedia (Trusted timestamping) does:
… Den ganzen Post lesenTrusted timestamping is the process of securely keeping track of the creation and modification time of a document. Security here means that no one — not even the owner of the document — should be able to change it once it has been recorded provided that the timestamper’s integrity is never compromised.
Veröffentlicht unter php, Security, webdev
16 Kommentare
PHP WTF #5
…oder: Bei magischen Funktionen gut aufpassen.
class TestingEmpty { public function __get($var) { if ($var == "test_empty") return "Hi there!"; } } $t = new TestingEmpty(); echo $t->test_empty; //Hi there! var_dump(strlen($t->test_empty)); //int(9) var_dump(empty($t->test_empty)); //bool(true) $externalvar = $t->test_empty; var_dump(empty($externalvar)); //bool(false)
Aha, also empty, aber mit String-Length von 9 Zeichen. Nach dem Zuweisen zu einer „wirklichen“ Variable dann auch nicht mehr empty.
Zur Abwechslung wollen wir aber nicht nur meckern, sondern noch konstruktiv zeigen, wie man diesen WTF (der vielleicht garkeiner ist?) behebt:
class TestingEmpty { public function __get($var) { if ($var == "test_empty") return "Hi there!"; } public function __isset($var) { echo "__isset triggered"; if ($var == "test_empty") return true; return false; } } $t = new TestingEmpty(); echo $t->test_empty; //Hi there!… Den ganzen Post lesen
Veröffentlicht unter php, PHP-WTF, webdev
9 Kommentare
Zip-Archive entpacken mit Javascript
Unzippen mit Javascript? Wer sollte sowas wollen? Egal! Es geht, reicht das als Begründung? Und das garnicht mal so schlecht. Wie üblich schmeiße ich gleich mit Code um mich:
<script src="ZipFile.complete.js"></script> <script> var zipFile = new ZipFile("zipfile.zip", readingDoneCallback); function readingDoneCallback(zip) { console.log("Zipfile reading finished! " + zip.entries.length + " files found in zip"); for (var i = 0; i < zip.entries.length; i++) { zip.entries[i].extract(extractCallback); } }; function extractCallback(entry, entryContent) { var filename = entry.name, csize = entry.compressedSize, ucsize = entry.uncompressedSize; console.log("File " + filename + " - comp.: " + csize + ", uncomp.: " + ucsize + "byte"); console.log("File-Content: " + entryContent); } </script>
Simpler Aufbau, logische Implementierung.… Den ganzen Post lesen
Veröffentlicht unter Javascript, Quicktips, webdev
7 Kommentare
Testen mal anders: phpt
phpt ist ein schmuckes, kleines Testframework, welches u.a. auch zur PHP Quality Assurance verwendet wird, um damit PHP-eigene Funktionen in PHP zu testen. Wir beginnen mit einem Beispiel:
--TEST-- My first cool test! --FILE-- <?php class Foobar { public function __construct() { for ($i = 0; $i < 6; $i++) { if ($i % 2 != 0) echo $i; } } } new Foobar(); ?> --EXPECT-- 135
Und das Beste: Mit PEAR kommt der Spaß gleich mit:
Das ists aber lang noch nicht gewesen. Man führe sich folgenden Test zu Gemüte:
--TEST-- Second example: errortesting --FILE-- <?php $foo = array(1, 3) * array(2, 6); ?>… Den ganzen Post lesen
Veröffentlicht unter php, Software Engineering, webdev
3 Kommentare
Systemaufrufe, Linux, Windows, Rückgabewerte und der Errorstream
Heute folgendes Problem gehabt: Es soll ein Systemaufruf an openssl ts zur Signierung von Timestamps (siehe hier) erfolgen. Das an sich ist ja erst mal noch kein Problem. Allerdings soll die geschriebene Klasse gleichermaßen unter Linux und Windows mit möglichst aussagekräftigen Fehlermeldungen zum Einsatz kommen. Jetzt ist die pikante Sache daran, dass der ts-Parameter von openssl erst ab Version 0.99 mit dabei ist, die standardmäßig unter Debian Lenny nicht mit installiert ist. Jetzt erzeugt netterweise ein Aufruf von openssl ts einen Returnwert von 0 (= alles okay), obwohl openssl den ts-Befehl in der installierten Version garnicht kennt – wir haben also keine Möglichkeit über eine Prüfung des Returnwertes alleine über Erfolg oder Misserfolg der Funktion zu entscheiden:
Als Waffe der Wahl haben wir uns nun also für exec entschieden, da shell_exec keinen Returnwert zurückliefert und system / passthru den Programmoutput einfach rausfeueren und nicht returnen.… Den ganzen Post lesen
Veröffentlicht unter php, Quicktips, webdev, Linux
1 Kommentar
Java Applet Tutorial: Applet erstellen, einbinden und mit Javascript ansprechen
Wenn ich an Java Applets denke, ist damit immer ein verstaubtes Web 1.0 – Bild assoziiert, gepaart mit animierten gifs und anderen Schandtaten. Heutzutage haben die Applets ihre Nische gefunden und werden vor allem da benutzt, wo Javascript noch zu langsam / umständlich ist, bspw. mathematische Zwecke. Wir widmen uns dem Thema mal ganz von vorne. Selbst wenn keine Javakenntnisse bestehen, soll man also noch gut folgen können. Soweit der Plan.
Was am Ende bei rumkommen wird
Wir werden ein Java-Applet bauen, das den Inhalt von Ordnern auf dem PC des Users in einer Liste anzeigt. Auch das Löschen von Dateien ist möglich.… Den ganzen Post lesen
Veröffentlicht unter Javascript, webdev, Java
15 Kommentare
Änderungen einer Form überwachen
Aufgabenstellung: Ich möchte eine <form> mit allen ihren Elementen überwachen, ob der Benutzer eine Änderung vorgenommen hat. Wenn dem so ist und er die Seite verlässt / neu lädt, ohne die Form abgeschickt zu haben, soll ein Hinweis erscheinen, der ihn darauf aufmerksam macht und fragt, ob er die Seite wirklich verlassen möchte.
Das HTML-Gerüst
Mal alles hingezimmert, was wir so an Formularelementen kennen:
<!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery-1.5.js"></script> <script> //Code folgt dann hier </script> </head> <body> <form> <select name="select-single" id="select-single"> <option>Single1</option> <option>Single2</option> </select> <select name="select-multiple" id="select-multiple" multiple="multiple"> <option selected="selected">Multiple1</option> <option>Multiple2</option> <option selected="selected">Multiple3</option> </select> <input type="checkbox" name="check" value="check1" id="check1" /> <input type="checkbox" name="check" value="check2" checked="checked" id="check2" /> <input type="radio" name="radio" value="radio1" checked="checked" id="radio1" /> <input type="radio" name="radio" value="radio2" id="radio2" /> <input type="text" name="text" value="default text" id="text" /> <textarea name="textarea" id="textarea">foobar</textarea> </form> </body> </html>
Da wären also ein Select, ein Select mit Mehrfachauswahl, ein Textfeld, eine Textarea, zwei Radiobuttons und zwei Checkboxen.… Den ganzen Post lesen
Veröffentlicht unter Javascript, webdev
10 Kommentare
Best-of-the-Web 6
Hier die nächste Runde netter Sachen aus dem Netz. Diesmal weniger Artikel und mehr „Goodies“.
- SQL Injection Cheat Sheet – Nach dem schon verbloggten XSS Cheat Sheet hier paar Tipps und böse Queries, die man im Hinterkopf haben sollte.
- On UA sniffing / browser detection – Javascript: Warum die allseits gepriesene „Feature Detection“ vielleicht doch nicht immer das Allheilmittel ist und wann Browser Detection sinnvoll sein kann.
- Sample datasets for benchmarking and testing – Fette Datenansammlung in Form von Datenbankdumps / Testdatensätzen. Gut, wer für Benchmarkzwecke eine dicke Datenbasis braucht.
- Rewrite Rule Tester – Macht die Arbeit mit ModRewrite ein Stück weniger schmerzhaft.
Veröffentlicht unter Best of the Web
1 Kommentar
Javascript: selbstausführende, anonyme Funktionen
Ziel des Artikels: Den Sinn folgenden Konstrukts verstehen
(function(window, document, undefined) { //some fancy code })(this, document);
Mag auf den ersten Blick für den nicht täglich mit Javascript schaffenden Menschen beängistend aussehen. Aber der Reihe nach. Eine ähnliche Konstruktion kommt übrigens in jQuery zum Tragen (siehe source).
Anonym?
Erstmal ist die Funktion anonym, also ohne Namen. Einfach aus dem Grund, weil sie keinen Namen braucht, da sie sich ja selbst aufruft. Man könnte ihr übrigens einen Namen geben, funktionieren würde es trotzdem. Vereinfacht sieht das dann z.B. so aus:
(function nichtMehrAnonym() { //some fancy code })();
Vorteil: Wenn wir vorhaben, die Funktion aus sich selbst heraus nochmal aufzurufen, ist das so bequemer möglich (Rekursion).… Den ganzen Post lesen
Veröffentlicht unter Javascript, webdev
6 Kommentare