Seiten- und Menünamen in Editland

Silke Schümann wrote this 14:51:

Dank Ingo Turski wird in dem hoffentlich bald offiziell werdenden Update die URL deutlich vereinfacht. Statt zwei Parameter, wird es nur noch einen Parameter geben, es sei denn ein Plugin verlangt hier etwas anderes.

Ein guter Grund sich mit dem Url-Design ein wenig zu befassen.

Es gibt zwei Benutzergruppen, die Seitennamen lesen: (more…)

These: Der Gemüsehändler auf dem Dorf braucht keine Website

Silke Schümann wrote this 12:00:

Ich bin geneigt, dieser These zuzustimmen. Eine Website bei der der Gemüsehändler seine Waren listet und seine Adresse kund gibt, ist unnötig wie ein Kropf. Er wird seinen Laden in der Nähe der Ortsmitte haben oder sichtbar von den Durchgangsstraßen auf seinen Laden hinweisen. Seine Kundschaft besteht aus Äkofreaks, die nie im Supermarkt ihr Gemüse einkaufen würden (auch wenn der kleine Gemüsehändler und der Supermarkt die Frischware vom selben Großmarkt geliefert bekommen … ) und von den Senioren des Ortes, die kein Fahrzeug mehr führen können und von all jenen, die den Plausch genießen ohnehin gerade beim Bäcker waren und nun vom Schälchen Erdbeeren verführt werden. Keiner dieser Kunden würde auf eine Website schauen, welches Saisongemüse aktuell im Laden zu haben ist.

Das traditionelle Alltagsgeschäft des Gemüsehändlers profitiert nicht von einer Website. Das heißt aber nicht, dass nicht ein Gemüsehändler nicht eine Website gewinnbringend in seine Geschäftsprozesse integrieren kann. MIt Template-System und ein zwei Plugins ist die Investition zur Ertragschance in einem absolute genialen Verhältnis, schließlich verliert der Gemüsehändler fast 70-80% seiner Kundschaft an den Supermarkt. Warum also nicht versuchen, einen Teil dieser Kundschaft zurückzuerobern? Ich hole mir hierzu eine Geschichte aus England aus meiner Au Pair Zeit zu Hilfe. (more…)

Mailformular auf meinen Rechnern umgetauft und etwas angepasst

Silke Schümann wrote this 23:47:

Das Wort ‘mail’ ist aus den Formulardateien verschwunden. Nun können die Bots erst einmal wieder für eine Weile suchen gehen, wie die eigentlichen Formulare heißen, die sie ansprechen wollen und in den Filter ist nun noch @ das @-Zeichen dazugekommen. Auch entdeckte ich ein paar Formulare, wo ich noch nicht die Maskierten Zeichen ausschloß. Angesichts der üblen Zahl formulare auf der Tmplaterie … ich muss hier wirklich einmal die plugins.csv bearbeiten und alle Formulare aus den anderen Ordnern der Editlandinstallationen rausschmeissen. … Zuleicht vergisst man hier eines und das ist dann früher oder später Opfer der Spamspacken.

XY Problem ungelöst: Wo ist mein Waffeleisen?

Silke Schümann wrote this 19:00:

Der heutige Tag ging wieder einmal damit drauf, dass ich mich mit Suchen von Lösungen beschäftigte und leider nur eines von aktuell zahlreichen “Problemen” lösen konnte.

Auchd er IE7 hat ein Attribut namens “hasLayout”, dass man sich einfangen kann, aber nicht wirklich abschalten. Zum Thema gefunden habe ich diese zwei Seiten

  1. On having layout
  2. IE hasLayout “Property”

Aufgrund eines alten Templates, dessen Aufbau und deren Gedankengänge ich längst schon nicht mehr parat im Kopf habe, übersah ich eine Anweisung und zog falsche Schlüsse in Bezug auf hasLayout. Ich hatte mich auf den Holzweg begeben, dass “hasLayout” im IE vererbt wird. Ich arbeite gerne mit Vererbung und denke hier wie dieser Autor: CSS Inheritance, Kaskaden und deren Vererbungsregeln geschickt nutzen, statt jedes Element einzeln ausweisen. Weiche ich wie in dem heutigen ABM-Template einmal davon ab, dann suche ich nach Problemen, die ich gar nicht habe, oder doch zumindest nicht haben muss, löscht man aus dem CSS nur die richtigen Anweisungen.

Nach Stunden sinnlosem forschen, Arbeitsergebnis: hätte ich es gleich gesehn Lösung 5 Minuten. Jetzt bleibt nur noch ein drängendes Problem, das ich angesichts meines heißhungers auf Waffeln bald lösen muss, das ist mein Waffeleisen finden, das ich verkramt habe und das sich wie dieses “max-width” auf die Blockelemente p, h1-h6, Listen etc. in der Fülle der Boxen meinem Blick entzieht. Vielleicht ziehe ich auch einfach morgen los und kaufe ein neues Waffeleisen. Waffeleisen kann man ruhig zwei, drei haben. Dann ist bei der Bewirtung von Gästen wenigstens schnell für alle eine heiße Waffel gemacht.

Auf der Suche nach der Sicherheitslücke im Kontaktformular

Silke Schümann wrote this 19:49:

Ein sicheres PHP-Kontaktformular ist heutzutage unerlässlich. An und für sich, war ich der Meinung, ich hätte alles wesentliche ausgefiltert und anhand des Filters geblockt, auch die lästigen Spamversuche geblockt. Der folgende Posteingang, von vier meiner Kontaktformulare, verrät mir, dass ich noch nicht ganz angekommen bin.

Gesendet von: ½­Î÷æAÔ´

        ____________________________________________________________
        Email: y @ y12.com
        Name: ½­Î÷æAÔ´
        Telefonnummer: 0786820-78907568100687890
        Rückantwort:
        ____________________________________________________________

        Anfragetext:

        Erwuenschte Rueckantwort:
        ____________________________________________________________
  1. //Prüffunktion:
    function check_malicious($input) {
  2. $is_malicious = false;
  3. $bad_inputs = array("mime-version", "content-type", "cc:", "to:", "bcc:", "c", "t","o", ":", "#");
  4. foreach($bad_inputs as $bad_input) {
  5. if(strpos(strtolower($input), strtolower($bad_input)) !== false) {
  6. $is_malicious = true; break;
  7. }
  8. }
  9. return $is_malicious;
  10. }
  11. //Prüfung ausführen:
  12. if(check_malicious($namefield) || check_malicious($emailfield) || check_malicious($telfield) || check_malicious($anfragfield) || check_malicious($rueckfield) || check_malicious($siteemailxyz)) {
  13. $ok = false; $reason = 'malicious';
  14. }
  15. //Konsequenz bei Malicious:
    if($reason == 'malicious') {
  16. echo "<p>Entschuldigen Sie, leider ist Ihre Eingabe ung&uuml;ltig.</p> <p>Bitte die folgenden Bestandteile Ihrer Eingabe <br{$slash}>nicht verwenden oder verfremden:</p><ul><li>mime-version</li><li>content-type</li> <li>bcc:, cc:, to:</li></ul> <p>Herzlichen Dank.</p>";
  17. }
  18. else {... Prüfe übliche Fehleingaben nicht OK prüfe auf malicious und ob ok. Wenn alles ok, versende Formular ...}

Ich sehe allerdings noch nicht wie. Ich kann mir vorstellen, dass (more…)

Link-Tipp: CSS-Zeuchs oder wie man Webdesign per Webformular realisiert :-)

Silke Schümann wrote this 14:47:

Von Esim Can, seines Zeichens ein von mir hoch geachteter Screen-, Applikationsdesigner … (Editland ist in Sachen Einfachheit einfach fantastisch gelöst, auch wenn die Fernbedienung beim aktuellen Stand der CSS-Fähigkeiten des noch gebräuchlichen MSIE6 ein spezielles Template benötigt, soll es bei langen Texten nicht nerven ) … öh … ich schweife etwas ab … oder auch nicht, denn ein Online-Formular für’s Webdesign ist hier zu unflexibel und will man das Template hier wieder den Umständen händisch anpassen, braucht es Erfahrung.

Nichts desto trotz ein lustiger Web-Tipp für alle, die sich jetzt eine Seite per Onlineformular zusammenbasteln wollen:

Positioning is everything: CSS Source Ordered Variable Border 1-3 Columned Page Maker

Etwas lästig bei diesem Formular ist noch, dass es keinen Colorpicker hat, mit dem man die Farbe per Mouserclick eingeben kann.

Achja: Es ist auch ein guter Weg sich mit CSS und Templates vertraut zu machen.

Merci Esim.

PHP: Wo bin ich, wo will ich hin — Pfade Switchen

Silke Schümann wrote this 01:42:

Häufig gebraucht wird, dass man den aktuellen Pfad herausfindet und von dort innerhalb eines CMS- oder Shopsystem in einen anderen bekannten Ordner wandern muss. Den Ort hole ich mir mit self_php. Mir wurde zwar gesagt, dass $_SERVER['SELF_PHP'] bei manchen Server-Einstellungen in die Hose geht, wenn der Aufruf via include erfolgt, aber soweit ich feststellen konnte, klappt das besser als $_SERVER['PATH_TRANSLATED'] oder getcwd(), ergo verwende ich am liebsten $_SERVER['SELF_PHP']. Danach wird augehend von dem Ort, brav der Weg zu Fuß gegangen:

  1. $actDir = $_SERVER[PHP_SELF];
  2. $actDirArr = explode('/',$_SERVER[PHP_SELF]);
  3. array_pop($actDirArr);
  4. $actDir = array_pop($actDirArr);
  5. $actDir = file_exists('root.info')? 'root' : $actDir;
  6. switch($actDir){
  7. case root:
  8. $pathAdmin = "admin/";
  9. $pathRoot = "";
  10. $pathTemplates = "templates/";
  11. break;
  12. case admin:
  13. $pathAdmin = "";
  14. $pathRoot = "../";
  15. $pathTemplates = "../templates/";
  16. break;
  17. }

Die Methode ist simple, übersichtlich und einmal von dem include-Issue, das ich selbst noch nicht beobachtet habe, relativ Narrensicher. Root einer Installation ist nicht immer auch das Rootverzeichnis des Hostingplatzes oder Servers. Ergo lege ich mir eine Datei (root.info), welche leer sein darf, in das Rootverzeichnis, nach der ich fragen kann, oder frage nach einem Ordner, der vom Root aus eineindeutig ist.

Übrigens die Methode den Pfad per array_pop zu ermitteln, habe ich mir von Holger Struck abgeschaut. Wo er ihn her hat weiß ich nicht, aber ich finde es praktisch und schnell und hier auch gleich im doppelten Sinne brauchbar. Denn es kürzt den Array um den letzten Eintrag, der Datei, aus der der Pfad $_SERVER['SELF_PHP'] abgerufen wird und gibt beim zweiten Mal, gleich auch den Namen den aktuellen Ordners Preis. Praktisch wäre es, wenn man nun einem Switch nachträglich einen weiteren Case anhängen könnte. Muss ich mal drüber nachdenken … Wenn mir oder einem Käpsele in den Kommentaren etwas einfällt, gibt es ein Update. :-)

Apropos: dem Thema ging ich schon einmal auf die Spur und habe mir verzweifelt einen abgekrampft: Kein Schleifchen um die PHP Schleife

Update: Und schon gibt es etwas Neues und lesenswert im Rahmen der Sicherheit von PHP-Applikationen. (more…)

PHP-Infektionen und anderen Unfug via $_GET in Editland ausschließen

Silke Schümann wrote this 15:44:

Editland verwendet eine Whitelist, so dass, wenn Editland und Plugins über die index.php im Root aufgerufen wird, nichts passieren kann, dennoch kann es nicht schaden ein wenig Vorsicht walten zu lassen. Auch wenn man Plugins programmiert ist die folgende Prüfung kein Fehler.

  1. if (!ereg("^[()A-Za-z0-9_-]+$",$_GET['s'])) {callError("illegalPagenameChars","$_GET['s']");}
  2. if (!ereg("^[()A-Za-z0-9_-]+$",$_GET['c'])) {callError("illegalOrdChars","$_GET['c']");}

In der Funktion callError() werden alle Variablen in dem kommenden Update durch einige Filter laufen, bevor der Inhalt dieser Variablen im in einer Fehlerseite angezeigt wird.

Seiten zur Sicherheit in PHP ist sicherlich eine Seite, die man sich früh zu Gemüte führen sollte.

Zum Beispiel: php-faq: Wie unterscheide ich böse Variablen von guten?

Mir fallen hierzu folgende Maßnahmen ein, wenn man beliebige Eingaben als harmlosen String ausgeben will, wie z.B. in einer Fehlermeldung.

  • In http:// und ../ Leerschritte einfügen, bzw. / durch &#47; ersetzen
  • < und > durch &lt; und &gt; ersetzen

  • Die Variable durch die Filterfunktion addslashes() jagen
    und ein Vorkommen der Funktion strippslashes durch anfügen von fkt_ vor stripslashes verhindern, dass addslashes neutralisiert wird.
  • Die vier Funktionen (include, include_once, require, require_once) um Dateien in PHP einzufügen ebenfalls durch das anfügen von fkt_ funktionslos auszugeben.

Habe ich eine Möglichkeit vergessen, wie über eine der Variablen der $_REQUEST[]-Familie sich ausführender Programmcode ins Programm schleichen kann?

PS: strip_tags() kommt nicht in Frage, weil, damit alles zwischen den spitzen Klammern entfernt wird und das ist nicht gewollt.

Update: Claudia Reiser machte mich in einem kleinen Maildialog drauf aufmerksam, dass ereg() ein Auslaufmodell sei. Preg_match sei ereg vorzuziehen. Aha. Ausprobiert. Nur !preg_match("^[()A-Za-z0-9_-]+$",$_GET['s']) funktioniert nicht. Die Syntax für preg_match() ist anders. Preg_match bemötigt Delimiter. Nach einigem hin und her, Frustration über die Doku, die meines Erachtens einen im Regen stehen lässt, fand ich es aber dann doch heraus:

  1. if (!preg_match("/^[()0-9a-z_-]+$/i",$_GET['s']) {callError("illegalPagenameChars","$_GET['s']");}

Die Syntax ist wie folgt:

  1. Funktion: preg_match(”Pattern”, “String”)
    Ich brauche nur ein true oder false, das heißt ich kann auf die Teile in den eckigen Klammern in der Doku auf php.net verzichten.
  2. Pattern: ‘/’ Delimiter ‘^’Anfang ‘[' gesuchte Zeichen Start ']‘ gesuchte Zeichen Ende ‘0-9′ Alle Zeichen zwischen 0 und 9 (a bis z dito) und das Minuszeichen als letztes vor die eckige Klammer gesetzt, erspart einem das Minus zu escapen ‘+$’ Prüfen bis zum bitteren Ende, ‘/’ Delimiter am Ende und ‘i’ auf Groß und Kleinschreibung muss nicht geachtet werden.

Hilfen, die ich benötigte, um auf die Lösung zu kommen: Reguläre Ausdrücke und meine Notiz vom November 06 auf Silkester: PHP: regex kurz notiert

PPS: Mein Kampffile mit dem ich mich dem Regulären Ausdruck näherte, ist hier zu finden: Pregmatch-Schlachtfeld und der Quelltext: preg_match.phps

Übel aber lieber Jetzt als Später … Sorry: Das Post-Slug in Wordpress nach der Veröffentlichung zu ändern ist nicht gerade der Hit. Aber lieber solange es nur ein paar RSS-Reader betrifft als später, wenn der Post verlinkt ist. Ich hatte hier die Wörter mehr als unglücklich im Titel verdreht. Das konnte so nicht bleiben. “via $_GET” musste einfach vor “in Editland” und nicht dahinter stehen. Ich entschuldige mich hiermit bei allen, die mit murren oder sonstwie vom Feeder über den alten Slug ins Leere gelaufen sind.

PHP: Fehlermeldungen sammeln und ausgeben

Silke Schümann wrote this 15:43:

Es gehört zur Programmierung, dass man ixfach Fehler-Szenarien abdecken und abwehren muss, bei denen sich der Programmierer vertippt, der User Fehleingaben macht oder Installationen unvollständig sind. Die Ausgabe von Fehlermeldungen ist also Täglich Brot.

Als Lernende gehe ich natürlich für den erfahrenen Programmierer längst ausgetretene Pfade. Für andere Lernende, die meinen Stand haben, mag es aber so wie für mich hilfreich sein, wenn man diese Pfade einfach noch einmal zu fuß geht. So einen Pfad habe ich heute angefangen. Optimierung von der Ausgabe der Fehlermeldung

  1. function errm($emx,$param1,$param2){
  2. $em = array();
  3. //Fehlermeldungen sammeln:
  4. $em[0] = "Tippfehler im Pfad bzw. Dateinamen oder $param1 in $param2 existiert nicht";
  5. //Fehlermeldungen ausgeben
  6. echo $em[$emx];
  7. }

An der Stelle wo nach “param1 in param2″ gesucht wird:

  1. $settingsFile = file_exists($rf.'settings.php') ? include($rf.'settings.php') : errm(0,'settings.php','admin/') ;

Der zweite Teil nach dem Fragezeichen (if-Shorthand [-1-][-2-]), wenn als das vor dem Doppelpunkt nicht eintrifft ruft die Funktion aus:

  1. ‘0′ ist die Nummer der Fehlemeldung, denkbar wäre auch ein sprechender Key für den Fehler-Array, man sollte sich hier nur entscheiden (entweder oder), denke ich.
  2. ’settings.php’ ist param1. Was param1 jeweils ist (Verb, Dateiname, Pfad, Variable …), hängt vom jeweiligen Satz ab.
  3. ‘admin/’ ist param2. Was param2 jeweils ist wie schon bei param1 abhängig von der Fehlermeldung selbst, also keine feste Regel. Allenfalls, dass in der Fehlermeldung param1 vor param2 kommt.

Jetzt wäre es noch schön, wenn ich wüsste, wie ich die Parameter optional in die Function zoomen könnte. so dass wenn kein Parameter gebraucht wird, man auch nicht daran denken muss und sollte Ausnahmsweise mal mehr als zwei Parameter benötigt werden, dass man eben soviele Parameter anhängen kann, wie diese Fehlermeldung verarbeiten muss.

Es ist auf alle Fälle für mich schon der Clou, das ich nun der Funktion errm() textbausteinmäßig viele Fehlermeldungen zusammenfassen kann und mir viel viel Tipperei spare. Für eine ‘Faule Sau’ wie mich unerlässlich.

Update: Ein wenig nachgedacht … (voila): über Arrays und schon hat man die Lösung, wie man in die Funktion eine beliebige Zahl Variablen zoomt:

  1. function echoError($emx,$param){
  2. $em = array();
  3. $param = split(',',$param);
  4. $em[0] = "Tippfehler im Pfad bzw. Dateinamen oder $param[0] in $param[1] existiert nicht";
  5. echo $em[$emx];
  6. }
  7. Fehlerausgabe-Syntax im Skript:
    $thisError = echoError(0,'parameter1,parameter2');

echoError() ist ein sich selbst erklärender Funktionsname und man muss weniger in die Doku schreiben, weil selbsterklärend … :-) optional wäre auch logError() ok, wenn man den Fehler nicht nur ausgibt, sondern in ein Logfile inklusive Timestamp wegschreibt.

Kein Wunder WAP ist so selten

Silke Schümann wrote this 20:16:

Ich habe erstmals die Anforderung auch für ein Handy die Seite aufzubereiten. Ergo ist es kein Fehler, die Seite während der Arbeit zu testen. Dafür gibt es sogar einen Browser für den PC von Nokia. Schön denkt man sich und folgt dem Link auf der WAP-Demo von W3CSchools. Und wenn man dann auskunftsfreudig wie man so eben gestimmt ist, sich durch 5 Seiten Aufnahmeformular durchgeklickert hat, darf man das tool auch herunterladen. Nur Nutzen ist noch nicht, denn das gute Teilchen will eine Seriennummer. Tja und da beginnt der Arger. Man kann sich erst einmal über die Installationsroutine erneut im Forum anmelden. Blöderweise aber weiß das Forum zwar, dass man das Toolchen heruntergeladen hat und auch dass man gerade mitten im Installationsprozess ist, aber eine Seriennummer findet man dennoch nicht. Wenn ich nicht demnächst den Installationsprozess abschließen kann, suche ich mir einen anderen Weg. Heckmeck!

Update:   OK. Kleine Veräppelung. Die Seriennummer kam per (more…)