terrorhippiecrew – Weblog

IT und alles was mich sonst noch so interessiert

  • Home
  • Framework
  • Über mich
  • Communities
  • Freelance
  • Impressum
  • Projekte
  • SSL on
04. Mai 2010

Mein Framework – Überarbeitet Version 2.00 online

w13531 in Allgemein, code, framework, http, javascript, mod_rewrite, php, web, xml

Soo is ja auch schon wieder ein Monate her und viel ist geschehen.

Featurelist:

  • Struktur komplett überarbeitet
    Im ‘framework’ Verzeichniss befinden sich nun nurnoch die notwendigsten Komponenten, quasi der Core.
    Im ‘library’ Verzeichniss befinden sich die Facklassen, sowie spezielle Implementierungen der im Framework festgelegten Interfaces
  • alle Verzeichnisse sind in Model/View/Controller Subdirs unterteilt
  • es gibt nun auch Funktionen die dem View übergeben werden können(sog. View helper), um z.B. Texte zu formatieren usw…. Achtung: Natürlich kann man im Helper auch Datenbankmanipulation oder anderes durchführen, dies kann zu Inkonsistenz des MVC-Pattern führen und die Komponententrennung zerstören, also mit Bedacht verwenden oder nur dafür wofür Sie gemacht wurden
  • ein paar kleine Fachkassen sind dazu gekommen(Events, Guestbook, News, Mailer, Validator), weitere Folgen
  • Datenbank Klassen komplett überarbeitet
  • ein paar Bugs entfernt(und ein paar hinzugefügt:D)
  • Autoloader ausgelagert
  • FW_Workbench überarbeitet
  • FW_Session überarbeitet
  • alle Kassen an die neue Struktur angepasst
  • ACL hinzugefügt
  • es können jetzt dank autoloader prefixe beliebig viele applications mit unterschiedlichen domains auf dem selben framwork ausgeführt werden
  • TODO: application modul system

Insgesamt wirkt es durch die saubere Trennung wesentlich einfacher in der Handhabung.
Viel Spass damit!

zur neuen Version

Kein Kommentar
15. Februar 2010

Mein Framework – #1 – Planung

w13531 in Allgemein, code, framework, http, javascript, mod_rewrite, php, web, xml

< – Inhaltsverzeichnis – >

Ok wir haben die Framework Definition und die MVC Definition kennengelernt.
Hier ein paar Richtlinien die für ein bisschen Ordnung sorgen:

  1. einfaches und sauberes Design
    • HTML soll wie HTML aussehen
    • PHP Code im View einfach halten, PHPs Template Syntax benutzen
  2. Sicher
    • Eingabe&Ausgabefilterung mit pecl/filter(Wrapper) als “Datenfirewall”
    • Programmcode wartbar gestalten, soviel Abstraktionen wie unbedingt nötig
  3. Schnell
    • Nutzung von Cache für statischen Content
    • Lock-Situationen weitestgehend vermeiden
  4. Dieses Framwork ist/soll/wird für RAD(RapidApplicationDevelopment) Web Applications gelten, es basiert daher auf PHP(5),XHTML,XML,JavaScript, desweiteren wird hier primär auf den PHP Aspekt eingegangen, das FW soll modular erweiterbar sein, um so zB. noch Ausgaben in PDF oder als Debug View zu ermöglichen
  5. die Verzeichnisstruktur:
    • /
      • admin <— admin.example.com
      • application
      • backup
      • config
      • framework
      • public <— www.example.com(nicht zwingend, kann auch im ROOT verankert sein)
      • resources
        • css
        • img
        • js
        • swf
        • xml
        • tpl
        • ico
        • pdf
      • scripts
      • tmp
        • cache
        • logs
        • sessions

    Die Verzeichnisstruktur ist noch nicht entgültig, aber ich denke nicht, das sie sich noch großartig verändern wird. Sie bietet ausreichend Platz. Ich weiß leider noch nicht wie es in den Verzeichnissen “framework” und “application” aussehen wird. Ihr seht auch schon wo eure Domains hinzeigen werden.

  6. Coding conventions:
    • Alle Namen im Programm auf Englisch(Klassen, Kontroller, Modelle und Ansichten, usw.)
    • MySQL Tabellen im plural, kleingeschrieben, zB.: items, cars, users
    • Models im singular, erster Buchstabe groß, zB.: Item,Car,User
    • Controller im singular, erster Buchstabe groß, immer “_Controller” am Ende des Namens, zB.: Item_Controller, Car_Controller, User_Controller, Controller_Controller :D
    • Views im singular, mit “_View” am Ende, zB.: HTML_View
    • Klassen/Interfaces beginnen mit “FW_”
    • Klassen besitzen wenn mgl CRUD Methoden

    Damit sind erstmal die grundlegenden Teile des Frameworks klar, dessen ungeachtet gibt es noch eine Menge zu tun:

  7. Erstellen des Entry Points
    Der EntryPoint ist ein zentraler Einstieg in das Programm, dies hat etliche Vorteile zB.: Sicherheit, alle Daten die kommen und gehen fließen durch diesen einen Einstiegspunkt, das schreit förmlich nach Filterung und Überprüfung(PostFilter und PreFilter pecl/filter). Wir haben nebenbei SEO Freundliche URLs, und eine Zentrale Stelle die Sachen lädt, initialisiert und so weiter. Bei mir ist der EntryPoint die index.php im “public” Ordner. In diesem Ordner befindet sich sonst nur eine “.htaccess” eine “robots.txt” und eine “sitemap.xml”.
    Damit wären wir auch schon bei der .htaccess:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
    </IfModule>

    Sollte die Domain im Root liegen kommt noch folgende .htaccess zur weiterleitung hinzu(im root):

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^$ public/    [L]
    RewriteRule (.*) public/$1    [L]
    </IfModule>

    die index.php im /public/ Verzeichniss, sie setzt die wichtigsten Konstanten(absolut pfad zum RIAD-F Ordner, Entwicklungsumgebung oder Produktivsystem, Fehlerlogging in Daily-Logs), includiert den Framwork-Core, und erfüllt noch ein paar andere kleiner Sachn wie zB. Controllerpfad setzen, Filter registrieren, Zeitzone setzen und zu guter letzt das wichtigste überhaupt, das Request Routing, ein abschließen der Logeintrag mit Zeit- und Spreicherverbrauch und ein exit, um speicher so schnell wie mgl wieder frei zu lassen:

    /** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
    define(DIRECTORY_SEPERATOR, '/');
    define(DS, DIRECTORY_SEPERATOR);
    
    define(DIRECTORY_ROOT, dirname(dirname($_SERVER['SCRIPT_FILENAME'])) . DS);
    define(DR, DIRECTORY_ROOT);
    
    define(DEVELOPMENT_ENVIRONMENT, false);
    define(DISABLE_LOGGING, false);
    
    $mtime = microtime();
    
    //include core framework
    require(DR . 'framework' . DS . 'bootstrap.php');
    
    //set the timezone
    $workbench->setTimezone('Europe/Berlin');
    
    //set controller path
    $frontCntrl->setControllerPath();
    
    //set filters
    $frontCntrl->addPreFilter(FW_Workbench::ClassLoader('FW_Headers_Filter'));
    $frontCntrl->addPostFilter(FW_Workbench::ClassLoader('FW_GZip_Filter'));
    
    //request routing
    try {
      $frontCntrl->route($request, $response);
      $frontCntrl->run($request, $response);
    
    } catch(Exception $e) {
      FW_Workbench::EventLog($e->getMessage());
    }
    
    FW_Workbench::EventLog(date('H:i:s',time()) . "\t################## REQUEST END ################## " . abs(round(microtime() - $mtime, 4)) . 'sec - ' . memory_get_peak_usage() / 1024 . ' kB', true);
    
    exit(0);
    

    Wichtig: nicht den PHP Tag schließen, um Whitespace-injection zu verhindern(fmi:ZendFramework)

    Die bootstrap.php im /framework/ Verzeichniss initialisiert erst einmal die nötigen Objekte, quasi den Core, damit das ganze überhaupt funktioniert:

    /** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
    //core class
    require(DR . 'framework' . DS . 'Workbench.class.php');
    
    //fatal error handler
    if(DEVELOPMENT_ENVIRONMENT == false) {
        ob_start(array('FW_Workbench', 'fatalErrorHandler'));
    }
    
    $workbench  = FW_Workbench::getInstance();
    
    $config     = FW_Config::getInstance();
    
    $request    = FW_HTTP_Request::getInstance();
    
    $response   = FW_HTTP_Response::getInstance();
    
    $frontCntrl = FW_Front_Controller::getInstance();
    
    //standart configurations
    $config->read_ini(DR . 'config' . DS . 'config.ini');
    
Kein Kommentar
08. Dezember 2009

fast sichere Logins ohne SSL

w13531 in Allgemein, code, http, javascript, security, web

Auf manchen Servern steht leider keine SSL zur verfügung oder nur mit Aufpreis.
Um einigermassen sichere Loginvorgänge ausführen zu können bietet sich folgendes Verfahen an:

  1. Übergabe eines random-Seeds(Zufallszahl) vom Server an das Login Form (Server merkt sich die Zahl zB in Session, kann nach erfolgreichen Login weitergenutzt werden).
  2. Loginform(Passwort) wird via SHA256() gehasht, die random-Seed wird ebenfalls SHA256() gehasht und die beiden Hash aneinandergehängt werden ebenfalls SHA256() gehasht.
  3. Der Hash wird an den Server übertragen und mit dem hash des gehashten Passworts und der gehashten Zufallszahl verglichen, stimmen beide überein dann darf der Login als erfolgreich betrachtet werden.

Warum fast sicher??
Naja es gibt immer möglichkeiten etwas zu umgehen:D
Hier der zugehörige Code(Login Form):

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
<script type="text/javascript" src="sha256.js"></script>
<script type="text/javascript">
<--
function doChallengeResponse() {
var rnd = <?php echo $_SESSION["rand"]; ?> //zufallszahl holen
document.getElementById('usr_id').value = SHA256(document.getElementById('login').value); //username(email) hashen
document.getElementById('usr_pwd').value = SHA256(SHA256(document.getElementById('password').value) + SHA256(rnd)); //session passwort erzeugen
document.getElementById('password').value = "";//plaintexte löschen
document.getElementById('login').value = "";//plaintexte löschen
}
// -->
</script>
<form action="" method="post" onsubmit="return doChallengeResponse();">
<input id="login" type="text" name="login" value="e-Mail Adresse"/>>br/>
<input id="password" type="password" name="pw" value="Passwort" />
<input type="hidden" id="usr_id" name="usr_id" value=""/>
<input type="hidden" id="usr_pwd" name="usr_pwd" value=""/>
<input name="send" type="submit"/>
</form>

Nützliche Infos:

  • lass die Zufallszahl IMMER vom Server erzeugen, da die gesamte Sicherheit auf Ihr basiert
  • übertrage weder das Passwort noch den Hash vom Passwort, sondern nur wie hier sha256( sha256(PWD) + sha256(RND) ) Die Zufallskomponente sorgt gegen man-in-the-middle-Angriffe
  • speichere das Passwort nicht im Klartext in der DB(sondern den Hash sha256(PWD))
  • nutze eine Kollisionsfreie Hash-Funktion, atm SHA256
  • braucht für jeden Aufruf eine Session um die RND zu speichern
  • JavaScript kann kein sha256, um es zu nutzen muss man diese Datei einbinden: sha256.js
  • Der so gewonnene Hashwert kann als Schlüssel für sym. Verfahren verwendet werden um weitere Daten zu verschlüsseln(zB AJAX-Anfragen und Results, nicht zu empfehlen da langsam und rechenaufwändig)
Kein Kommentar
08. Dezember 2009

Simple AJAX JS

w13531 in Allgemein, code, http, javascript, web, xml

Hier eine kleine von mir gebastelte AJAX Klasse(anleihen von MDC.com). Sie erzeugt einen Query(HTTP GET <url>), returnt das result als javascript-Objekt(assoziativer 2d-Array) und übergibt dies einer vom Entwickler festgelegten Funktion namens doStuff(data):

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
function makeRequest(url) {
        var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ... httpRequest = new XMLHttpRequest(); if (httpRequest.overrideMimeType) { httpRequest.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { // IE try { httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } }
if (!httpRequest) { alert('Giving up :( Cannot create an XMLHTTP instance'); return false; }
httpRequest.onreadystatechange = function() { alertContents(httpRequest); }; httpRequest.open('GET', url, true); httpRequest.send(''); }

function alertContents(httpRequest) {
if (httpRequest.readyState == 4) { if (httpRequest.status == 200) { var Data = createObject(httpRequest.responseXML); doStuff(Data); } else { alert('There was a problem with the request.'); } } else { dontdoStuff(); } }

function createObject(xmldoc) { var root = xmldoc.getElementsByTagName('set'); var xObject = new Array(); //durchlaufe vertikal for (var iNode = 0; iNode < root.length; iNode++) {

var node = root.item(iNode); var xData = new Array();
//durchlaufe horizontal for (var iSub = 0;iSub < node.childNodes.length; iSub++) {
var xelement = node.childNodes.item(iSub); var xe_name = xelement.nodeName; var xe_value; //kein wert?? if(xelement.hasChildNodes() == false) { xe_value = ' '; } else { xe_value = xelement.firstChild.data; } //zeilen xData[xe_name] = xe_value; } //spalten(mit zeilen) xObject.push(xData); } //gebe den 2d assoziativen array zurück return xObject; }

Ok die Funktion doStuff() hat jetzt die Daten, Aber was damit tun??
Hier erstellen wir zB eine HTML Table(oder einen Ladescreen fals die Daten noch auf sich warten lassen):

/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
function doStuff(Data) {
createHTMLTable(Data);
}
function dontdoStuff() {
createHTMLLoading();
}
function createHTMLTable(xObject) {
for (var g = 0;g < xObject.length; g++) {
add_row('page_table',xObject[g]);
}
}
function add_row(tablename ,arr) {
var tbl = document.getElementById(tablename);
var lastRow = tbl.rows.length;
var row = tbl.insertRow(lastRow);
var cell0 = row.insertCell(0);
var cell1 = row.insertCell(1);
var cell2 = row.insertCell(2);
var cell3 = row.insertCell(3);
var cell4 = row.insertCell(4);
cell0.innerHTML = arr["xml_tag_name"];
cell1.innerHTML = arr["xml_tag_name"];
cell2.innerHTML = arr["xml_tag_name"];
cell3.innerHTML = arr["xml_tag_name"];
cell4.innerHTML = arr["xml_tag_name"];
}

Und schon hat man einen simplen AJAX-Request ausgeführt.

Kein Kommentar

Suche

RSS

  • Beiträge RSS
  • Kommentare RSS

Letzte Artikel

    • XMLRPC Server und Client
    • PHP:XML2ARRAY <-> ARRAY2XML
    • Mein Framework – Überarbeitet Version 2.00 online
    • Mein Framework – #13 – Mailer
    • Mein Framework – #12 – Filter

Letzte Kommentare

    • w13531 bei Mein Framework – #4 – Die Views
    • w13531 bei Mein Framework – #2 – Die Workbench
    • Simon bei Mein Framework – #4 – Die Views
    • Simon bei Mein Framework – #2 – Die Workbench
    • w13531 bei Mein Framework – Inhaltsverzeichnis

Kategorien

    • Allgemein
    • code
    • framework
    • http
    • javascript
    • mod_rewrite
    • os
    • php
    • recommendations
    • security
    • travel
    • web
    • xml

Archiv

    • Juli 2010
    • Juni 2010
    • Mai 2010
    • April 2010
    • März 2010
    • Februar 2010
    • Januar 2010
    • Dezember 2009
September 2010
M D M D F S S
« Jul    
 12345
6789101112
13141516171819
20212223242526
27282930  

Blogroll

    • 5 RegEx every Web Programmer should know
    • Ajax Mistakes
    • AVL Tree in JAVA – very nice
    • Bruder Baum
    • design-pattern factory und singleton
    • Entwurfsmuster in PHP
    • Gzip your @font-face files
    • http://netalyzr.icsi.berkeley.edu/ Network Analyzer
    • Konstenten in PHP Trick
    • Overview about secure web programming
    • PHP BitFlags
    • php fluent-interface
    • php mvc-framework
    • PHP Quine
    • php-browser
    • PHP-Template Engine
    • Reducing the number of page components
    • some infos and examples about RegEx
    • survive heavy traffic with your webserver
    • What tells your Browser about you
    • wordpress security howtos
© 2010 Wired by terrorhippiecrew – Weblog
Design von Dezzain Studio
Übersetzt von Htwo
Nature Pictures | Bamboo Blinds