PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for Juli, 2011

Slides der International PHP Conference 2011 Spring Edition

without comments

Berlin, Mai 2011. Die International PHP Conference Spring Edition fand wieder statt im Maritim proArte Hotel. Übrigens können bereits Tickets für die IPC11 im Oktober (9.-12.) gekauft werden, es läuft gerade die „Very Early Bird“ Phase, das Ticket ist günstiger und es gibt ein Netbook geschenkt.

29. Mai 2011

RIA – Entwicklung mit Ext JS
Dominik Jungowski

XP Practices
Sebastian Schürmann

Git for Subversion Users
Stefan Koopmanschap

DevOps für PHP
Johann-Peter Hartmann

30. Mai 2011

Weiterlesen »

Written by Michael Kliewe

Juli 14th, 2011 at 9:55 am

Per Index auf einen assoziativen Array zugreifen

with 13 comments

Hä? Was ist das denn für eine Überschrift? Das geht doch garnicht! Richtig, normalerweise geht das nicht, aber mit etwas tricksen schon.

Wir haben das folgende Array und möchten den 4. Wert haben, ohne aber den Key zu kennen. Bei einem 0-basierten Array wäre es also das Element mit dem Index 3:

<?php

$array = array(
    '10.07.2011' => 14,
    '11.07.2011' => 51,
    '12.07.2011' => 46,
    '13.07.2011' => 9,
    '14.07.2011' => 20,
    '15.07.2011' => 37,
);

echo $array[3];

Wie zu erwarten erhalten wir eine Notice und keinen Wert:

Notice: Undefined offset: 3 in test.php on line 12

Doch wie kommen wir nun an das 4. Array-Element? Ich habe 3 Möglichkeiten für euch, zuerst die unschönen:

$i=0;
foreach ($array as $a) {
    if ($i == 3) {
        echo $a;
        break;
    }
    $i++;
}

Bei einem großen Array ist diese Methode natürlich sehr langsam. Vergleichbar schlecht der folgende Code:

for ($i=0; $i<3; $i++) {
    next($array);
}
echo current($array);

Besser ist die folgende Lösung:

echo current(array_slice($array, 3, 1));

Wer kennt noch eine?

Edit:

Zwei weitere Lösungen aus den Kommentaren, wahrscheinlich irgendwo in der Mitte anzusiedeln was die Geschwindigkeit bei sehr großen Arrays angeht:

$values = array_values($array);
echo $values[3];

Mit PHP 5.4 geht es sogar noch kürzer ohne das „Zwischenarray“:

echo array_values($array)[3];

Oder aber auch:

$keys = array_keys($array);
echo $array[$keys[3]];

PHP 5.4:

echo $array[array_keys($array)[3]];

Written by Michael Kliewe

Juli 13th, 2011 at 8:42 am

Posted in PHP

Tagged with , ,

Auf Warnings, Notices und sogar Fatal Errors reagieren

with 14 comments

In besonders kritischen Scripten baue ich gern zur Sicherheit noch eine erweiterte Log-Funktion ein, die auch noch aufgerufen wird bei einem FATAL ERROR oder bei einem exit() oder die() in einer Fremdbibliothek (pfui). Man kann so auch beim Vorkommen einer Notice das Script beenden, das kann manchmal sehr sinnvoll sein. Natürlich kann man mit Hilfe der error_log Einstellung in der php.ini und einem error_reporting „E_ALL^E_STRICT“ diese Fehler auch wegloggen, aber man ist nicht flexibel wenn man im Code darauf reagieren möchte. Beispielsweise könnte es sein dass bei einem FATAL ERROR noch etwas aufzuräumen ist, damit kein Müll hinterlassen wird.

Nehmen wir folgendes Beispiel:

<?php
register_shutdown_function('shutdownFunction');
function shutDownFunction() {
    $error = error_get_last();
    if ($error['type'] == 1) {
        // log error to syslog, send email or sms, this should not happen!
    }
}

echo nonExistingFunction();

Bei sauberem Code sollte das natürlich nicht passieren. Aber es gibt Situationen in denen ein Fatal Error passieren kann, wenn man beispielsweise eine Funktion aufruft mittels call_user_func() ohne eine vorherige is_callable() Prüfung, oder oder.

OK, nächstes Beispiel:

Weiterlesen »

Written by Michael Kliewe

Juli 12th, 2011 at 9:29 am

Passwortmythen oder „Was Du schon immer über Passwörter wusstest, aber nie zu sagen wagtest“

with 89 comments

Gastartikel von Oliver Sperke.

Ich bin 34 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängisten Internetsprachen: PHP, HTML, Javascript und CSS.

Was Du vor dem Lesen wissen solltest

Die Sicherheit eines Passwortes ergibt sich aus dem verwendetem Zeichensatz und der Länge des Passwortes. Besteht ein Passwort nur aus den Ziffern 0 bis 9, hat der Zeichensatz eine Länge von 10. Besteht ein Passwort aus maximal 8 Ziffern, ergibt sich eine Anzahl möglicher Passwörter von 10^8+10^7+10^6+10^5+10^4+10^3+10^2+10^1 oder ~ 111,11 Mio. Möglichkeiten. In den meisten Erklärungen steht übrigens nur 10^8, allerdings gilt das nur, wenn ein Angreifer die Länge des Passwortes kennt. Ansonsten muss er nämlich alle Möglichkeiten ausprobieren, d. h. 0, 1, 2…01, 02, usw bis 99999999. Werden zusätzlich Kleinbuchstaben (also 0-9, a-z, äöüß) verwendet, ergibt sich ein „Schlüsselraum“, d. h. die mögliche Anzahl Passwörter von 40^8+40^7+…+40^1, also 6.72 Billionen Möglichkeiten usw.

Mythos: Ein Passwort mit mindestens 8 Zeichen ist sicher

Diesen Satz lese ich seit 10 Jahren mindestens dreimal im Jahr, nur vor 10 Jahren arbeiteten die schnellsten Heimcomputer in etwa auf dem Niveau eines heutigen Smartphones. Innerhalb dieser 10 Jahre hat sich die Computerwelt rasend schnell verändert. Auch durch das „pöse Internetz“, in dem viele Menschen ihre Ideen und ihr Wissen verknüpfen können. Während damals die wenigen Hochleistungsrechner in den Geheimdienstzentralen und IBM Laboren standen, gibt es heute völlig andere Methoden, um ein hohes Maß an Computerleistung zu erreichen. Diese reichen von der Nutzung der kompletten Hardware inkl. Grafikkarte, über Botnetze bis hin zu mietbaren Cloudlösungen.

Moderne Systeme erreichen dadurch heute weit höhere Werte beim Erraten („Brute Force“) von Passwörtern als damals. Vergleichsweise neue Techniken wie „Rainbow Tables“, die es damals einfach noch nicht gab verschärfen die Situation. Der Schlüsselraum von 8 Zeichen mit einem Zeichensatz von 102 Zeichen kann auf einem handelsüblichem Supercomputer innerhalb weniger Stunden durchprobiert werden. Das ist kein Puffer, auf den man sich verlassen sollte. Im Jahr 2011 sollte man diesen Standard endlich auf 12 Zeichen anheben, zumindest bis zum Jahr 2020.

Mythos: Ein drei Monate altes Passwort ist unsicher

Weiterlesen »

Written by Oliver

Juli 11th, 2011 at 9:41 am

Posted in Allgemein,PHP

Tagged with , ,

Gewinner der Verlosung zum zweiten Geburtstag

with 46 comments

So, endlich habe ich Zeit die Gewinner der Verlosung preiszugeben, so ein Urlaub ist echt stressig, danach hat man immer so viel nachzuholen, unglaublich.

Zuerst möchte ich mich nochmals bei allen Firmen die Preise zur Verfügung gestellt haben bedanken!

Dann wollen wir uns anschauen wie die Gewinner zustande gekommen sind. Der folgende SQL Query hat die Gewinner-Reihenfolge ermittelt:

SELECT comment_author, comment_author_email,
SHA1(CONCAT(comment_author_email, 'Zweiter Geburtstag')) as hash

FROM wp_comments

WHERE comment_post_ID = 2728
AND comment_author != 'Michael Kliewe'
AND comment_date < '2011-07-05 00:00:00'
AND comment_author_email != ''

GROUP BY comment_author_email
ORDER BY hash

Zu jedem Kommentar wurde also ein Hash generiert, und dann alphabetisch sortiert, derjenige mit dem „kleinsten Hash“ gewinnt. Das führt uns zu folgender Tabelle:

Weiterlesen »

Written by Michael Kliewe

Juli 8th, 2011 at 1:31 pm

Posted in PHP

Tagged with , ,