Tja, der Grund ist schlichtweg, dass es komplett nervt bei Blogger Quellcode einzufügen. Der Editor wandelt andauernd absichtlich umformatierte HTML-Entities um und zerstört das Layout.
Daher: Schluss - bis hier und nicht weiter! Gebloggt wird absofort Zuhause! Natürlich habe ich die Gelegenheit beim Schopfe gepackt, ein eigenes "Blog"-System dafür zu erstellen, auf Grundcode denn ich schon für ähnliche Aufgaben gedacht hatte. Entwicklungsname seit 2001: "TinCan". Doch dazu mehr auf den eigenen Seiten.Ab nach Hause! (ja, klicken!)
QuiBui LE download
Download QuiBui LE
Version 1.5.1 (beta) |
QuiBui - PHP & MySQL Rapid Prototyping
Montag, 17. März 2008
"Gebloggt wird Zuhause!!"
Freitag, 29. Februar 2008
HTML-Ausgabe ohne XSS-Schwachstelle
Bei den "Best practices" des BSI von 2006 wird unter anderem die Filterung der Ausgabedaten behandelt. Es gibt dazu ein Beispiel einer Filterfunktion für Perl. Für PHP wird nur auf die üblichen Funktionen verwiesen.
* strips_tags()
* htmlentities()
Beide Funktionen können nicht immer sicherstellen, dass XSS-Schwachstellen abgedichtet sind.
strip_tags() entfernt HTML-Tags aus dem Eingabestring. Es werden aber nicht immer Tags gebraucht, um JavaScript-Code zu injizieren. Ist die Feldausgabe (value) nicht mit Hochkommas (") abgeschlossen, kann über JavaScript-Events erfolgreich XSS betrieben werden.
Beispiel: INPUT-Feld mit nicht abgeschlossenem "value"
echo "<input name=id value=" . $_GET['id'] . " type=text>";
Beispiel: JS-XSS-Code
3 onclick=alert('XSS')
Beispiel: XSS-Code in INPUT-Tag
<input name=id value=3 onclick=alert('XSS') type=text>
Sobald der Nutzer dort klickt, wird der Code ausgeführt. Was höre ich da? "magic_quotes_gpc" ist an? Ausgabe wird zuvor mit htmlentities() kodiert und anschließend mit strips_tags() behandelt? (Jetzt zappelt da nix mehr!)
Beispiel: XSS-Code, dem "magic_quotes_gpc", htmlentities() und strips_tags() nichts anhaben kann
3 onclick=eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))
Wir sehen: XSS-Schutz ist mit Blacklist-Filter keine gute Idee. Die "Best practices" des BSI haben aber für Perl einen schönen Whitelist-Filter. Heißt: was nicht erlaubt ist, wird kodiert. Und erlaubt ist wenig:
Beispiel: Erlaubte Zeichen des Whitelist-Filters
a-z A-Z 0-9 _ . -
Die Übertragung des Filters von Perl nach PHP ist nicht schwer. Ergibt also einen Ausgabefilter für PHP, welches alle Zeichen außer den oben genannten nach Hexadezimal kodiert.
Beispiel: PHP-Whitelist-Filter
function seq_string_reformat_($match_ = '') {
return sprintf('%04x;', ord($match_[1]));
}
function SEQ_OUTPUT($string_ = '') {
$string = seq_remove_slashes_($string_);
$string = preg_replace_callback('/([^a-zA-Z0-9_.-])/', "seq_string_reformat_", $string);
return $string;
}
ANMERKUNG: Die Funktion "seq_remove_slashes_" findet sich im Post davor!
Freitag, 22. Februar 2008
PHP: "intelligent" Slashes entfernen
Eine Funktion, die etwas "Intelligenz" bei der Säuberung der Ausgabe vor "Escapes" (\) verwendet. Ganz egal, ob der String aus POST, GET, COOKIE (mit ein- oder ausgeschaltetem "magic_quotes_gpc") kommt oder aus der Datenbank ("escaped" oder nicht), er wird korrekt aber ohne Escape-Zeichen (\) ausgegeben.
function seq_remove_slashes_($string_ = '') {
if (get_magic_quotes_gpc()) {
$string_ = stripslashes($string_);
}
$orig = $string_;
$stripped = stripslashes($orig);
if ($orig != $stripped) {
$escaped = addslashes($stripped);
if ($orig == $escaped) {
$sec_value = stripslashes($escaped);
} else {
$sec_value = $orig;
}
} else {
$sec_value = $orig;
}
return $sec_value;
}
| c:\doc | c:\doc |
| Eingabe | Ausgabe |
|---|---|
| c:\\doc | c:\doc |
| O\'Reilly | O'Reilly |
| c:\\doc\\O\'Reilly | c:\doc\O'Reilly |
| c:\doc\O'Reilly | c:\doc\O'Reilly |
ANMERKUNG:
Die Funktion entscheidet nicht für Teilstrings, ob eine Konvertierung erfolgt oder nicht. Wenn die Eingabe also gemischte ("escapte" und nicht "escapte") Stringstücke enthält, wird NICHT konvertiert.
| c:\doc\O\'Reilly | c:\doc\O\'Reilly |
Samstag, 1. Dezember 2007
Für zwischendurch: hier werkelt QuiBui (#4)
QuiBui wird bei dem großen Bio-Shop KaRo eingesetzt z.B. bei den Rezepten, der Warenkunde, den Kontaktformularen und fast für die komplette Administration.
Für die Pflege der Bestellungen und der Kundendaten kommt dazu DynaFace zur Hilfe. Dabei wird davon die tabellarische Darstellung verwendet.
Auf der Benutzerseite wurde hier das Shopsystem oscommerce dahingehend erweitert, dass der Bestellprozess vollständig mit AJAX umgesetzt wurde. Die Vorteile davon:
- Kunde verlässt nicht das aktuelle Produkt nach dem Bestellen - er kann einfach weiter einkaufen
- Anzahl des Produktes im Warenkorb lässt sich am Produkt selbst ändern - Klick zum Warenkorb entfällt
- Es wird am Produkt die Anzahl aus dem Warenkorb ausgewiesen - erhöhte Übersichtlichkeit
Mittwoch, 31. Oktober 2007
Für zwischendurch: hier werkelt QuiBui (#3)
In Vorbereitung auf das Eintreffen des iPhone auf dem deutschen Markt, wird für ich-habe-geburtstag.de eine spezielle Seite eingerichtet, die mit dem Look & Feel des iPhone aufwartet. Dahinter arbeitet auch hier QuiBui.
Getestet werden kann die Seite auch ohne iPhone: Voraussetzung ist aber der Browser "Safari" von Apple, der ja ebenfalls auf dem iPhone läuft.
Die iPhone-Seite findet sich hier:
http://www.ich-habe-geburtstag.de/iphone
Dienstag, 30. Oktober 2007
Für zwischendurch: hier werkelt QuiBui (#2)
http://www.ich-habe-geburtstag.de
Basiert ganz und gar auf QuiBui: Formulare, Plausibilitäten, News-System, Sicherheit. War auch das erste Projekt, das ich komplett mit QuiBui erstellt habe. Der Grund war Zeitnot - ich wollte dafür nicht länger als ein Wochenende in Anspruch nehmen, was mir auch gelungen ist.
Die jetzt sichtbare Version basiert auf das aktuelle Update.
Freitag, 21. September 2007
QuiBui in Foren
Ich habe im Forum von www.php-resource.de zu einem Problem eines Nutzers eine Antwort gegeben. Sie war so, wie ich gerne eine Antwort gebe, wenn ich sie weiss: einfach zu zielführend.
Es ging um das Erzeugen eines Pulldowns aus den Daten einer MySQL-Abfrage. Und ich schilderte die QuiBui-Funktion QB_TABLE2PULLDOWN, die ja genau das macht...
Wie hätte ich vermuten können, dass es einigen im Forum gar nicht darum geht, eine Lösung für ein Problem zu liefern, sondern nur darum, den Hilfesuchenden mit kleinen "Schubsern" zu einer mehr oder weniger funktionierenden Codierung zu helfen??
Dann fand man es auch noch sehr nett, meinen absichtlich verschleierten QuiBui-Code zu entschleiern und dort teilweise zu posten. Das wurde dann später gekürzt, was ok ist aber nicht von der Art und Weise des Umgangs mit fremden Code ablenken kann.
Ich für mein Teil habe daraus etwas gelernt: wer nach Problem-Lösungen sucht, wird sie nicht in öffentlichen Foren suchen. Dafür sind die meisten einfach zu sehr auf Nutzer geeicht, die JavaScript-Funktionen zwischen "PHP"- Tags einbinden... Diesen dann mit fertigen Funktionen zu kommen ist dort einfach nicht Sinn der Sache. Wie heisst es dort in mehreren Beiträgen so oft: "hier wird dir niemand den fertigen Code machen". Fokus ist also auf selbst lernen gesetzt und immer wieder und immer wieder, Generation für Generation, auf Erfragen und Lösen der selben Probleme...