Archiv der Kategorie: webdev

PHP Session-Management erklärt

Anmerkung: Dieser Post ist dem Teil über Session-Highjacking und Session-Fixation vorgeschaltet, da der Artikel darüber sonst zu lang geworden wäre.

In dem Moment, indem der Benutzer per

session_start();

eine Session verpasst bekommt, wird ein Session-Cookie auf dem PC des Benutzers angelegt, der bei jedem folgenden Request wieder an den Server übertragen wird. Dieser Cookie hat den Name PHPSESSID und im Inhalt steht der Session-Name. Der sieht etwa so aus: 3cm12d11d14fg0ssklulk1k274. Dieser Session-Cookie wird verwendet, um den Benutzer wiedererkennen zu können. Mit Firebug oder dem coolen Firefox-Addon Edit Cookies (welches wir später sowieso noch brauchen) lässt sich gut sehen, welche Cookies übertragen werden und was deren Inhalt ist.… Den ganzen Post lesen

Veröffentlicht unter php, Security, webdev | 3 Kommentare

Angriffe auf Webanwendungen – Teil 1: XSS (+Beispielangriff)

Das ist der Anfang einer kleinen Serie, die das Thema „Websecurity“ umreißt. Dabei werde ich mit konkreten Angriffsszenarien auf die Techniken XSS, Session Highjacking + Session Fixation, SQL Injection und CSRF eingehen. Die Grundlage legen wir mit diesem Artikel und XSS, da viele der späteren Angriffe auf XSS aufsetzen.

Was ist XSS / Cross-Site-Scripting?

Sollte doch eigentlich mittlerweile jeder wissen, oder? Jegliche Möglichkeit, als Angreifer eigenen Javascript-Code auf eine Webseite zu schleusen.

Varianten von XSS

Grundsätzlich unterscheidet man zwischen 2 verschiedenen Arten des Cross-Site-Scriptings: Die dauerhafte Unterbringung von eigenem Code auf einer Webseite und die temporäre. Auf beide gehe ich nachher mit konkreten Angriffsszenarien ein.… Den ganzen Post lesen

Veröffentlicht unter php, Security, webdev | 7 Kommentare

PHP-Errors zu Exceptions konvertieren

Wie wir ja alle wissen, ist der @-Fehlerunterdrückungs-Operator gemeinhin böse. Was aber nun, wenn wir mit PHP-eigenen Funktionen arbeiten müssen, die im Fehlerfall eine Warning produzieren?
Was ich meine ist z.B. file_get_contents. Wenn die aufzurufende URL nicht erreichbar ist, heißt es

Warning: file_get_contents() [function.file-get-contents]: php_network_getaddresses: getaddrinfo failed: Der angegebene Host ist unbekannt

Unschön. Glücklicherweise kann man mittels eines eigenen Errorhandlers einen Workaround basteln, indem der Fehler zu einer Exception konvertiert wird:

function errorhandler($code, $error, $file, $line)
{
	throw new ErrorException($error, $code, 0, $file, $line);
}

set_error_handler("errorhandler");

try
{
	echo file_get_contents("http://www.this-is-not-a-real-url.org");
}
catch (ErrorException $ex)
{
	echo "Die Webseite ist gerade nicht erreichbar";
}

Im Produktivbetrieb sollten die Fehler bekanntlich ohnehin nur geloggt und nicht angezeigt werden, trotz allem fühle ich mich wohler mit solch einer Lösung.… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev | Hinterlasse einen Kommentar

Codevisualisierung mit pfff: PHP Frontend For Fun

Das von facebook stammende Tool soll vor allem eine Hilfe zur Codevisualisierung und beim Refactoring sein. Kennt ihr diese anschaulichen Grafiken, die euren Festplatteninhalt visualisieren und auf vermeintliche Platzfresser aufmerksam machen (sowas in der Art)? Das macht pfff – nur eben auf Sourcecode zugeschnitten.

Was sagt facebook selbst dazu?

pfff is a set of tools and APIs to perform some static analysis, dynamic analysis, code visualizations, code navigations, or style-preserving source-to-source transformations such as refactorings on source code.

Finde ich – ohne es bis jetzt produktiv eingesetzt zu haben – zumindest mal eine nette Spielerei (…was ja auch der Namensbeisatz for Fun andeutet).… Den ganzen Post lesen

Veröffentlicht unter php, Quicktips, webdev, misc IT | 1 Kommentar

Yahoo Placefinder-API Tutorial

Habe mich gestern auf Arbeit für eine Geo-Location Klasse mit der Placefinder API auseinandergesetzt und war ganz angetan davon, deswegen gebe hier mal die „Essentials“ wieder.

Was kann Placefinder?

Placefinder hat 2 Haupt-Einsatzbereiche:

  • Finde die Lat/Long-Koordinaten einer eingegebenen Adresse (Bspw: Neckarstraße 15, Darmstadt -49.869220, 8.645537)
  • Finde zu angegebenen Lat/Long-Koordinaten die nächstgelegene Adresse (Bspw: 48.1431,8.4176 -Am Doniswald 8, 78126 Königsfeld Im Schwarzwald)

Dabei ist der Placefinder sehr „tolerant“, spuckt also auch zu mies formatierten Eingaben oder Tippfehlern korrekte Ergebnisse aus.

Wie spreche ich die API an?

Yahoo bittet euch, erstmal einen API-Key zu besorgen (das geht hier). Komischerweise hat Yahoo aber auch nichts dagegen, wenn bei Anfragen kein API-Key angegeben wird – aber sicher ist sicher.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 3 Kommentare

Grundprinzipien der objektorientierten Programmierung

Loose Coupling – Schwache Kopplung

  • Definiert, wie sehr Systembesstandteile voneinander abhängen
  • Klassen sollten so strukturiert sein, dass sie auf möglichst wenige andere Klassen angewiesen sind, um funktionieren zu können
  • Erhöht Wiederverwendbarkeit der Klassen enorm!

sinnvolle Abhängigkeiten

  • Stark zusammengehörende Code-Teile sollten zusammengefasst werden
  • Nicht zusammenhängende Code-Teile sollten ausgelagert werden (don’t do too much!)
  • Veränderungen einer Klasse sollten im Optimalfall keine Änderung an weiteren Klassen hervorrufen

Information Hiding – Geheimnisprinzip

  • Jede Klasse gibt nur das nötigste nach außen und „weiß“ selbst auch nur das, was sie zum funktionieren wissen muss
  • Keine Interna werden nach außen getragen. Ich muss nicht wissen, dass intern ein Stack als Datenstruktur verwendet wird, um die Klasse zu benutzen
  • Änderungen innerhalb der Klasse selbst sollten nach außen nicht sichtbar sein, da andere Klassen nur das nötigste von ihr kennen
  • Spielt auf sinnvolle Verwendung von public / private / protected an

Homogenität

  • Vergleichbare Probleme sollten mit vergleichbarer Komplexität gelöst werden
  • Wiederverwendung von bereits bestehenden Lösungen soweit wie möglich
  • Leitlinie: „Erwartungshaltung“ anderer Teammitglieder sollte erfüllt werden, was den Umfang der Realisierung einer Klasse angeht

Don’t repeat yourself – Redundanzfreiheit

  • Jede Funktionalität ist an genau einer Stelle vorhanden und wird – bei Bedarf – von anderen Systembestandteilen verwendet (Don’t reinvent the wheel)
  • Sollte Code mehrfach verwendet worden sein (Copy & Paste aus Faulheit), wird eine neue Funktion daraus erschaffen, die dann von allen Teilen aus aufgerufen wird
  • Vorteil: Bei einem Fehler muss nur an einer Stelle korrigiert werden und alle anderen, davon abhängigen Teile sind automatisch „gefixt“
Den ganzen Post lesen
Veröffentlicht unter Software Engineering, webdev | 4 Kommentare

Die Wahrheit über den Doctype

Mit dem neuen, ultracoolen und leicht zu merkenden HTML 5-Doctype

<!DOCTYPE html>

kamen viele Bedenken auf. Ist meine Webseite dann überhaupt noch standardkonform? Falle ich nicht dem Quirks-Mode der Browser zum Opfer? Nichts davon ist der Fall. Der Doctype ist generell extrem überschätzt! Kein Browser wird sich wirklich darum kümmern, was für ein Doctype angegeben ist.

Was in Wirklichkeit passiert

Es wird (einheitlich bei allen Browsern) danach geschaut, ob überhaupt ein Doctype angegeben wurde. Ist das nicht der Fall, gehts direkt in den Quirksmode. Wird nun ein Doctype gefunden, gibt es nur noch eine „Chance“, doch noch in den Quirksmode zu geladen: Es wird ein Uralt-Doctype wie

<!DOCTYPE
Den ganzen Post lesen
Veröffentlicht unter Quicktips, webdev | 2 Kommentare

usort

usort war mir zwar bisher schon bekannt, wirklich benutzt habe ich es aber nicht – was ich jetzt rückblickend bereue. Kurz gefasst ist usort die Waffe der Wahl, wenn man Arrays sortieren möchte die entweder heftig verschachtelt sind oder für die es keine trivialen Sortierkriterien gibt (wie etwa größer / kleiner). Für beides kommen später Beispiele. Bisher kam ich zwar auch ohne usort um die Runden, habe aber ersatzweise dann ziemlich aufwändige Ersatzkonstruktionen bauen müssen, für die usort die eindeutig bessere Wahl gewesen wäre.

Ein Beispiel

Man nehme folgendes Array:

$data = array(
"P1915" => array("name" => "Manfred Schmidt", 
				 "work" => array("income" => 61000, 
				 "pos" => "Abteilungsleiter")),
"P2193" => array("name" => "Wilfried Mueller", 
			     "work" => array("income" => 42300, 
				 "pos" => "Entwickler")),
"P0813" => array("name" => "Herbert Mann", 
			     "work" => array("income" => 93500, 
				 "pos" => "Chef")),
"P3913" => array("name" => "Klaus Kaiser", 
			     "work" => array("income" => 42700, 
				 "pos" => "Entwickler")),
"P2881" => array("name" => "Juergen Koenig", 
			     "work" => array("income" => 43300, 
				 "pos" => "Marketing")));

Dabei haben wir eine Zuordnung der Personalnummer zu einem Unterarray, welches den Name beinhaltet und weitere Verzweigung auf ein „work“-Unterarray mit Position und Gehalt hat.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | Hinterlasse einen Kommentar

Reflection – Teil 4: ReflectionProperty

Vorangegangene Teile:

Nun sind also die Properties dran, womit dann der vierteilige Reflection-Ausflug auch schon beendet ist. Wie bekannt beginnen wir wieder mit einem Mustercode

class D
{
	/**
	 * this is a property
	 */
	public $prop = array("a","b","c");
}

Property erhalten

Der Weg um an das ReflectionProperty – Objekt zu kommen führt uns über das ReflectionClass – Objekt der Klasse.

$refclass = new ReflectionClass("D");
$refprop = $refclass->getProperty("prop");

DocBlock – Kommentar

print_r($refprop->getDocComment());
/**
 * this is a property
 */

Property-Name

print $refprop->getName(); 
//prop

Property-Value

Hierbei erwartet getValue eine Instanz der Klasse als Parameter.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 7 Kommentare

Reflection – Teil 3: ReflectionParameter

Vorangegangene Teile:

Wie im letzten Teil 2 über die ReflectionMethod und die ReflectionFunction angedroht soll es nun um die Parameter gehen, die man ebenfalls reflecten kann. Ob es sich dabei um die Parameter einer Funktion oder um die Parameter einer Methode handelt, spielt keine Rolle. Wie in allen anderen Teilen muss mal wieder ein Beispielcode herhalten:

class C
{
	public function fct($a,$b,array $c = array(1,2,3))
	{}
}

Default-Wert des Parameters

Erstmal müssen wir uns ein ReflectionParameter – Objekt ergattern. Das geht im – hier geschilderten – umständlichsten Fall von der Klasse über die Methode zu den Parametern.… Den ganzen Post lesen

Veröffentlicht unter php, webdev | 3 Kommentare