Archive for the ‘php & Co.’ Category

Inoffizielles Sicherheitsupdate für easyLink

Thursday, July 23rd, 2009

Seit mehreren Wochen ist nun bekannt, dass in verschiedenen Versionen von easyLink gravierende Sicherheitslücken vorhanden sind. Wie die Firma Mountaingrafix mit ihren Kunden im Forum umspringt, lasse ich an dieser Stelle besser unkommentiert. Ein Update steht von offizieller Seite anscheinend noch immer nicht zur Verfügung; im Forum gibt es zwar ein paar “dringende Sofortmaßnahmen”, diese bringen jedoch zahlreiche Nebenwirkungen mit sich.

Bis ein Sicherheitsupdate seitens Mountaingrafix erscheint, wird man sich wohl noch einige Zeit gedulden müssen. Herr Schoppengerd schreibt im Forum: “leider hat bei uns momentan leider niemand Zeit sich um die Version wirklich zu kümmern.”

Um die Nutzer von easyLink 2 nicht im Regen stehen zu lassen, habe ich daher nach bestem Wissen und Gewissen ein inoffizielles Sicherheitsupdate erstellt. Da es potenziellen Angreifern hilfreiche Informationen über die Lücken liefern könnte, werde ich es jedoch nicht öffentlich anbieten.

Betroffene easyLink-Besitzer können es kostenlos per E-Mail an sicherheitsupdate@naggel.com anfordern.

[Nachtrag 28.07.09: Mittlerweile stellt der Hersteller für die neueste Version ein Update zur Verfügung, das auf meinen Änderungen beruht. Benutzern älterer Versionen wird empfohlen, die Änderungen manuell anhand meiner Anleitung durchzuführen.]

Sicherheitslücken in easyLink 2.6

Monday, July 20th, 2009

Einer meiner Kunden rief mich besorgt an und teilte mir mit, dass es Sicherheitslücken in einem seiner Link-Kataloge gebe. Nach dem Gespräch schickte er mir noch ein Video zu, das das Ausmaß der Lücken demonstrieren sollte: es zeigte einen leicht bedienbaren Exploit, der anscheinend nach Eingabe einer URL private Daten wie E-Mail-Adressen und Kontonummern aus einem Web-Katalog auslas.

Das stank natürlich nach XSS, SQLi und mehr, und nach einiger Recherche im Code fand ich auch einige Sicherheitslücken, die das Ausspähen dieser Daten ermöglichten. Natürlich habe ich umgehend Fehlerkorrekturen erstellt und bei allen meinen betroffenen Kunden installiert!

Zitat meines Kunden: “Vielen Dank für die super schnelle Fehlerbehebung! Ich bin froh, dass Sie den Support für mein Portal leisten!”.

Danke, das hört man gerne :-)

[Nachtrag 28.07.09: Mittlerweile stellt der Hersteller für die neueste Version ein Update zur Verfügung, das auf meinen Änderungen beruht. Benutzern älterer Versionen wird empfohlen, die Änderungen manuell anhand meiner Anleitung durchzuführen.]

Funktionen mit Vorgabe-Parametern

Tuesday, February 24th, 2009

Betrachtet man folgenden php-Code,

function addToArray($number, $array=array()) {
    $array[] = $number;
    return $array;
}
print_r(addToArray(1));
print_r(addToArray(2));
print_r(addToArray(3));

so erwartet man als php-Programmierer die Ausgabe:

Array
(
    [0] => 1
)
Array
(
    [0] => 2
)
Array
(
    [0] => 3
)

Man stelle sich vor, die Ausgabe wäre:

Array
(
    [0] => 1
)
Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

und man müsste, um das gewünschte Ergebnis zu erhalten, folgendes schreiben:

function addToArray($number, $array=false) {
    if ($array === false) {
        $array = array();
    }
    $array[] = $number;
    return $array;
}

Sieht umständlich und merkwürdig aus?

Ist Python-Style.

Übersetzungen mit php-gettext

Friday, January 5th, 2007

Im aktuellen phpMagazin (2.2007) wird mein Artikel "Übersetzers Liebling" veröffentlicht, in dem ich die Vorteile, die man durch die Verwendung des php-Moduls gettext bzw. Danilo Å egans php-gettext erfährt, beschreibe. Es wird erklärt, wie man eine php-Anwendung übersetzbar macht und wie man die einem zur Verfügung stehenden Funktionen zu verwenden hat. Zum besseren Verständnis wird alles zusätzlich durch komplette Beispiele erläutert. Mein dort erwähnter Patch für php-gettext befindet sich hier.

Kommentare und Anregungen können gerne hier in meinem Blog hinterlassen werden; ich werde versuchen sie im kommenden Teil zu berücksichtigen.

now playing: Les Cowboys Fringants – Un P’tit Tour

Wenn ~$bm nicht will…

Thursday, May 11th, 2006

…flucht man zuallerst und fragt sich, wie solch ein essenzieller Operator nicht funktionieren kann. Dann bastelt man sich eben einen Workaround:

function complement($bm) {
    return $bm ^ (pow(2, floor(log($bm, 2))+1)-1);
}

Und schon interessiert die Ursache des Problems (vorerst) nicht mehr. Ursachenforschung muss halt bis nach Feierabend warten.

str_replace für JavaScript

Saturday, April 8th, 2006

Als Web-Entwickler ist man es ja gewohnt, beim Programmieren mit JavaScript regelmäßig über Unzulänglichkeiten in den Implementierungen der einzelnen Browser zu stolpern. Da ich mich in der letzten Zeit jedoch näher mit JavaScript beschäftigen musste, stellte ich weitere Ungereimtheiten fest, je tiefer ich mich in die Materie einarbeitete und meine Erfahrungen mit dem “JavaScript way of programming” machte.

In diesem Beitrag beschreibe ich die für mich drei größten Überraschungen. Besonders interessant dürfte für die meisten Punkt 3 sein, indem ich meine effiziente Lösung für eine str_replace wie in php für JavaScript vorstelle.

Doch der Reihe nach — aber ihr dürft natürlich auch direkt weiter scrollen ;-)

1. Semikolons am Befehlsende sind optional. Und alles was optional ist, macht in der Regel Probleme. In C, php, Java usw. fliegt einem der Compiler bei einem vergessenem Semikolon um die Ohren; man merkt, dass etwas nicht stimmt, und kann den Fehler schnell beheben. Nicht so in JavaScript, denn hier ist das Semikolon am Befehlsende optional, man kann auch einfach eine neue Zeile einfügen. Dumm nur, dass dadurch ungewünschte Effekte auftreten können. Es gibt Situationen – und das leider öfter, als man denkt! – da vergisst man ein Semikolon, und das was JavaScript dann dort reininterpretiert unterscheidet sich von dem, was man sich vorgestellt hatte. Ups! Abhilfe schaffen hier Tools wie jsLint.

2. Variablen in Funktionen und Objekten sind global. Jedenfalls solange man nicht var vor sie schreibt. Das kann übel sein, wenn man beispielsweise in zwei Funktionen die selben Variablennamen – bspw. i für eine Zählvariable – verwendet, und diese abwechselnd aufruft.

3. str_replace für JavaScript. String-Objekte in JavaScript besitzen zwar eine replace-Methode, die jedoch mit regulären Ausdrücken arbeitet und das Objekt modifiziert. Da ich jedoch nur eine simple Suchen/Ersetzen-Funktion benötige und die Einfachheit der str_replace(search, replace, subject)-Funktion aus php gewöhnt bin, wollte ich mir so etwas für JavaScript basteln, nachdem ich dies auch schon für foreach und in_array getan hatte. Zuerst wollte ich einen Wrapper für String.replace bauen, dann kam mir jedoch eine viel simplere Idee:

function str_replace(search, replace, subject) {
return subject.split(search).join(replace);
}

Der String subject wird an allen Vorkommen von search zerteilt, es entsteht ein Array mit den resultierenden Teil-Strings. Dieses Array wird dann wieder zu einem String verkettet, und zwar mit replace an allen Verknüpfungspunkten.

Mathematisches Rennspiel

Tuesday, December 27th, 2005

Wie einige vielleicht bei meinen geplanten Projekten gesehen haben, taucht dort der ominöse Punkt "Mathematisches Rennspiel" auf. Google findet außer meinem Blog keine Ergebnisse, also was soll das ganze nun sein?!

In meiner Schulzeit, in etwa als ich die siebte Klasse besuchte, ersann ich mir ein mathematisches Rennspiel. Ziel war und ist es, mit seinem Rennwagen als erster ins Ziel zu kommen ohne in komplett zu verschrotten. Das Spiel ist komplett deterministisch, es gibt keinen Zufall, die einzige Varianz vom im Kopf ersinnten perfektem Weg zum Ziel entsteht durch die Reaktionen der Mitspieler. Ein Wagen hat zwei Geschwindigkeitsvektoren, je einen in x- und y-Richtung, deren Summe den Ort im nächsten Zug bestimmt, sofern man weder Richtung noch Geschwindigkeit ändert. Die Kunst liegt nun darin so weit wie möglich voraus zu berechnen, mit welcher Geschwindigkeit und Lenkung man in eine bestimmte Kurve fahren darf usw. Miteinbeziehen muss man noch Sonderfälle wie in die Quere kommende Konkurrenten, verunreinigte Strecken und verschiedene Bodenbeläge. Die kompletten Regeln hier jetzt aufzuschreiben würde den Rahmen und so manche Planets sprengen, daher lasse ich das lieber und verweise auf die noch nicht existierende Anleitung, die ich noch zu schreiben habe.

Jedenfalls fiel mir vor einigen Wochen wieder ein, womit ich mir damals im Unterricht die Zeit vertrieben und meine Mitschüler in den Wahnsinn getrieben habe. Wen wundert’s, denn mit zwei verschiedenen Koordinatensystem zu arbeiten und dort einfache Vektorrechnung zu betreiben überfordert halt die meisten Dreizehnjährigen.

Gestern Nacht, nach einer feucht-fröhlichen Party bei Phil, spielten Straubi und ich bis morgens um 6 Uhr eine Runde des Rennspiels, er war begeistert, mehrfach verließ das Wort "genial" seinen Mund.

Trotz leichtem Kater bewaffnete ich mich daher heute Vormittag gegen 10 Uhr mit Pizza und Cola und fing an zu programmieren, herausgekommen ist eine erste Version des Streckeneditors (bisher nur mit Gecko getestet, Code-Qualität ist natürlich auch noch lange nicht fertig; Proof of Concept eben). Die Strecken werden im offenen PNG-Format gespeichert, was mehrere Vorteile bringt:

  • Hält man sich an die vorgegebene Farbpalette, so kann man eigene Strecken auch mittels Programmen wie bspw. Gimp bearbeiten.
  • Die resultierenden Strecken haben eine sehr kleine Dateigröße
  • Man kann komplett ohne Aufwand Vorschaubilder der Strecken anzeigen
  • Einfacher Austausch von Strecken, PNG-Dateien können quasi überall hoch geladen werden, was auch ImageShack und unzählige Internetforen miteinbezieht

Noch gibt es viel zu tun, aber zumindest das Grundgerüst steht und ist seitens des Streckeneditors schon gut benutzbar.

AJAX suxx, but rockz!

Friday, October 7th, 2005

KDEs James Ots schrieb gestern:

All because we have AJAX, which sucks, and I love it.

Und er hat Recht, meiner Meinung nach. AJAX (nicht der Allzweckreiniger, sondern Asynchronous Javascript and XML), schon seit einigen Jahren möglich, aber erst vor Kurzem so richtig bekannt geworden durch Google Suggest und Google Maps, ist zwar noch lange nicht perfekt, aber es existiert und kann benutzt werden. Endlich ist es möglich, Serverseitig direkt auf Benutzereingaben zu reagieren, ohne diesen erst ein Formular abschicken zu lassen. Gallery2 zeigt dem Benutzer beim Installieren beispielsweise an, welche Pfade auf dem Server möglich ist. Die Eingabe von “/srv/www/ht” zeigt bspw. direkt “/srv/www/htdocs/” usw. an, äußerst praktisch!

Anfang des Jahres habe ich einen WYSIWYG-Editor geschrieben, der dank AJAX und aspell eine eingebaute, on-the-fly Rechtschreibprüfung besitzt.

Auch wenn es momentan etwas überbewertet und im vB 3.5 fast schon zu exzessiv verwendet wird, man kann damit wirklich arbeitserleichternde, sinnvolle Dinge machen. Schöne neue AJAX-Welt also, ich bin gespannt, wie sich das ganze noch weiterentwickelt.

In meinem Rotwein schwimmt ‘ne Mücke

Thursday, October 6th, 2005

Ich hasse das.

Nachdem ich dank Fieber am Wochenende und bis heute anhaltendem Husten bis morgen krank geschrieben bin (weder Autofahren mit Fieber noch das Zubereiten von Essen mit Husten ist toll) habe ich die letzten Tage intensiv zum arbeiten genutzt. Seit heute Nachmittag hatte ich dann also nichts mehr zu tun, sodass ich mich einem Projekt widmen konnte, was mir im Urlaub 2001 in Frankreich, im Haus “Villa Ariba” meiner Tante, eingefallen ist. Ein kleines aber feines Online-Schach, webbasiert. Zugauswertung und -abgabe per AJAX usw. Bis gerade eben saß ich daran, und hätte auch schon etwas zum Vorzeigen, würde ich es endlich über’s Herz gebracht haben, auf meinem Server php5 zu installieren. Da ich bisher leider zu faul dazu war nicht dazu kam, muss also eine kurze Beschreibung herhalten. Das ganze ist momentan noch auf php5 getrimmt, da es von den dortigen Neuerungen bzgl. objektorientierter Programmierung Gebrauch macht. Auf php4 läuft es zwar ohne Murren trotz error_reporting(E_ALL), zeigt aber lediglich ein leeres Schachbrett an.

Lokal sehe ich ein hübsch-hässliches Schachbrett mit der Startaufstellung, die Bauern des weißen Spielers sind jedoch entfernt worden. Die “Figuren” sind anklickbar, daraufhin erscheinen alle Felder, zu denen sie sich mittels gültigen (!) Zügen bewegen können, markiert; Felder, die sie angreifen können, werden gesondert hervorgehoben. Dabei wird auch berücksichtigt, dass möglicherweise gegnerische oder eigene Figuren die Bewegung einschränken. Das Bewegen von Figuren ist im Quellcode schon möglich, damit man es “live” machen kann fehlen nur noch wenige Zeilen. Das ganze Frontend ist zur Zeit zwar nur rudimentär, d.h. ohne AJAX oder validen XHML-/CSS-Code (momentan noch nicht einmal valides HTML), aber darum wird sich später gekümmert. Bei der Anzeige der gültigen Züge fehlen “nur” noch die Rochaden, das Schlagen en Passant, die Bauernumwandlung sowie – oh Graus – die Überprüfung, dass ein Zug kein Matt des eigenen Königs verursacht.

Habe heute Abend also einiges geschafft, wobei noch viel zu tun bleibt. Ist aber endlich nochmal etwas anspruchsvollere Arbeit, Algorithmen zu finden, die funktional als auch schnell sind. Mal schauen, wann ich das nächste zum Rumbasteln komme, vielleicht kriege ich dann auch heraus, wieso php4 die “Figuren” nicht zeichnen will.

Morgen Abend steht übrigens Dream Theater in Dortmund an… Oshin meinte, dies bedeute 3 Stunden Musik ohne Vorband. Ich bin gespannt und voller Vorfreude!