<![CDATA[PHPhil's Playground]]> http://phphil.ch/index.php Fri, 03 Sep 2010 05:59:59 +0200 Fri, 03 Sep 2010 05:59:59 +0200 phil@bigwhoop.ch (Philippe Gerber) Copyleft - All Rites Reversed Zend_Feed http://blogs.law.harvard.edu/tech/rss <![CDATA[Wusstest du, dass absolute Pfade auch relativ zum Protokoll gesetzt werden können?]]> http://bigwhoop.ch/fakt/9/Wusstest-du-dass-absolute-Pfade-auch-relativ-zum-Protokoll-gesetzt-werden-koennen Stellen wir uns folgendes Szenario vor:

  • http://example.org/index.html
  • http://example.org/img/image.png

In der index.html kann das Bild entweder relativ oder absolut eingebunden werden.

<!-- absoluter Pfad -->
<img src="http://example.org/img/image.png" title="..." alt="..." />

<!-- relativer Pfad -->
<img src="img/image.png" title="..." alt="..." />

<!-- absoluter Pfad, relativ zum Host -->
<img src="/img/image.png" title="..." alt="..." />

Was aber ebenfalls möglich ist, ist ein absoluter Pfad relativ zum Protokoll.

<!-- absoluter Pfad, relativ zum Host -->
<img src="//example.org/img/image.png" title="..." alt="..." />

Und dies kann in bestimmten Situation sehr, sehr nützlich sein. Zum Beispiel wenn man sicherstellen will, dass bei einer SSL Anfrage alle eingebundenen Ressourcen über HTTPS geladen werden, obwohl die Ressourcen auf einem anderen Host liegen (z.B. einer Subdomain).

]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass in PHP 5.3 Exceptions verschachtelt werden können?]]> http://bigwhoop.ch/fakt/8/Wusstest-du-dass-in-PHP-53-Exceptions-verschachtelt-werden-koennen Und so geht das Exception Linking ...

try {
    try {
        throw new Exception('Ich hab dich Jerry!!');
    }
    catch (Exception $e) {
        throw new Exception('No way, Tom ...', 0, $e);
    }
}
catch (Exception $e) {
    echo $e->getPrevious()->getMessage(); // Ich habe dich Jerry!!
    echo $e->getMessage();                // No way, Tom ...
}

Als neuen, dritten Parameter kann der Exception Klasse ein Exception Objekt mitgegeben werden. Leider gibt es keine Methode um zu überprüfen ob ein solches Objekt vorhanden ist, man muss den Rückgabewert von getPrevious() auf null checken.

]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass SOS ____ ___ _____ heisst?]]> http://bigwhoop.ch/fakt/7/Wusstest-du-dass-SOS-____-___-_____-heisst Save Our Souls ;-)

]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass es in Firefox einen "Design Modus" gibt?]]> http://bigwhoop.ch/fakt/6/Wusstest-du-dass-es-in-Firefox-einen-Design-Modus-gibt Einfach mal in der Adresszeile folgendes eingeben und ein bisschen staunen. :-)

javascript:document.body.contentEditable='true'; document.designMode='on'; void 0;

Funktioniert übrigens auch in IE8. Wie's mit anderen Browsern/Versionen ausschaut habe ich nicht getestet.

]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass PHP's mysql_real_escape_string() nicht zwingend gegen SQL Injections schützt?]]> http://bigwhoop.ch/fakt/5/Wusstest-du-dass-PHPs-mysql_real_escape_string-nicht-zwingend-gegen-SQL-Injections-schuetzt Schauen wir uns dieses Code-Beispiel an:

$sql = "SELECT fields FROM table WHERE id = " . mysql_real_escape_string($_POST['id']);

Wenn da jetzt ein böser Angreifer 1 OR 1 = 1 mitschickt resultiert dies in folgendem SQL Statement:

$sql = "SELECT fields FROM table WHERE id = 1 OR 1 = 1";

Da in 1 OR 1 = 1 keine bösartigen Zeichen vorkommen, wird durch mysql_real_escape_string() auch nichts entfernt. Einzige Abhilfe würde da ein intval($_POST['id']) schaffen.

Die viel bessere Alternative heisst aber Prepared Statements. Diese werden sowohl in PDO als auch in mysqli unterstützt.

// PDO
$pdo = new PDO('mysql:dbname=database;host=host', 'user', 'pwd');
$stmt = $pdo->prepare("SELECT fields FROM table WHERE id ?");
$stmt->bindParam(1, $_POST['id'], PDO::PARAM_INT);
$stmt->execute();

// mysqli
$db = new mysqli('host', 'user', 'pwd', 'database');
$stmt = $mysqli->prepare("SELECT fields FROM table WHERE id ?");
$stmt->bind_param('i', $_POST['id']);
$stmt->execute();
]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass Guybrush Threepwood ein Gott ist?]]> http://bigwhoop.ch/fakt/4/Wusstest-du-dass-Guybrush-Threepwood-ein-Gott-ist KETZEEEERR!!!!

]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass es ein RFC zur Kommunikation mit Kaffeemaschinen gibt?]]> http://bigwhoop.ch/fakt/2/Wusstest-du-dass-es-ein-RFC-zur-Kommunikation-mit-Kaffeemaschinen-gibt HTCPCP (Hyper Text Coffee Pot Control Protocol) ist ein Protokoll zur Kontrolle und Überwachung vernetzter Kaffeemaschinen und wurde 1998 als 1. Aprilscherz von Larry Masinter als RCF 2324 eingereicht. Obwohl als Spass gedacht, ist das Protokoll sehr detailiert und genau beschrieben.

Sehr gut finde ich den Status Code 418 I'm a teapot ... ;-)

418 I'm a teapot
Any attempt to brew coffee with a teapot should result in the error code "418 I'm a teapot". The resulting entity body MAY be short and stout.
]]>
Fri, 03 Sep 2010 05:59:59 +0200
<![CDATA[Wusstest du, dass an Funktionen übergebene Arrays in PHP bis zum ersten Schreibzugriff als Referenz angesehen werden?]]> http://bigwhoop.ch/fakt/1/Wusstest-du-dass-an-Funktionen-uebergebene-Arrays-in-PHP-bis-zum-ersten-Schreibzugriff-als-Referenz-angesehen-werden Dieser Mechanismus nennt sich Copy-On-Write (COW) und ist in der Softwareentwicklung weiterverbreitet.

Da das Kopieren von Daten zeitaufwändig und nicht gerade Ressourcenschonend ist, werden die Daten erst bei Schreibzugriff kopiert. Dabei müssen nicht zwingend alle Daten kopiert werden.

]]>
Fri, 03 Sep 2010 05:59:59 +0200