<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1070265029118552054</id><updated>2012-02-16T21:22:37.574+01:00</updated><category term='php forum'/><title type='text'>QuiBui - PHP &amp; MySQL Rapid Prototyping</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-4850570481098154500</id><published>2008-03-17T19:35:00.005+01:00</published><updated>2008-03-17T19:43:24.931+01:00</updated><title type='text'>"Gebloggt wird Zuhause!!"</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.erich-kachel.de/blogtext"&gt;&lt;h1&gt;Ab nach Hause! (ja, klicken!)&lt;/h1&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-4850570481098154500?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/4850570481098154500/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=4850570481098154500' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/4850570481098154500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/4850570481098154500'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2008/03/gebloggt-wird-zuhause.html' title='&quot;Gebloggt wird Zuhause!!&quot;'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-2244007588280096400</id><published>2008-02-29T23:55:00.009+01:00</published><updated>2008-03-02T00:15:01.675+01:00</updated><title type='text'>HTML-Ausgabe ohne XSS-Schwachstelle</title><content type='html'>&lt;p class="MsoNormal"&gt;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.&lt;br /&gt;&lt;br /&gt;* strips_tags()&lt;br /&gt;* htmlentities()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Beide Funktionen &lt;b&gt;können nicht immer sicherstellen&lt;/b&gt;, dass XSS-Schwachstellen abgedichtet sind.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel: INPUT-Feld mit nicht abgeschlossenem "value"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;#101;&amp;#99;&amp;#104;&amp;#111;&amp;#32;&amp;#34;&amp;#60;&amp;#105;&amp;#110;&amp;#112;&amp;#117;&amp;#116;&amp;#32;&amp;#110;&amp;#97;&amp;#109;&amp;#101;&amp;#61;&amp;#105;&amp;#100;&amp;#32;&amp;#118;&amp;#97;&amp;#108;&amp;#117;&amp;#101;&amp;#61;&amp;#34;&amp;#32;&amp;#46;&amp;#32;&amp;#36;&amp;#95;&amp;#71;&amp;#69;&amp;#84;&amp;#91;&amp;#39;&amp;#105;&amp;#100;&amp;#39;&amp;#93;&amp;#32;&amp;#46;&amp;#32;&amp;#34;&amp;#32;&amp;#116;&amp;#121;&amp;#112;&amp;#101;&amp;#61;&amp;#116;&amp;#101;&amp;#120;&amp;#116;&amp;#62;&amp;#34;&amp;#59;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel: JS-XSS-Code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;3 onclick=alert('XSS')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel: XSS-Code in INPUT-Tag&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;#60;&amp;#105;&amp;#110;&amp;#112;&amp;#117;&amp;#116;&amp;#32;&amp;#110;&amp;#97;&amp;#109;&amp;#101;&amp;#61;&amp;#105;&amp;#100;&amp;#32;&amp;#118;&amp;#97;&amp;#108;&amp;#117;&amp;#101;&amp;#61;&amp;#51;&amp;#32;&amp;#111;&amp;#110;&amp;#99;&amp;#108;&amp;#105;&amp;#99;&amp;#107;&amp;#61;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41;&amp;#32;&amp;#116;&amp;#121;&amp;#112;&amp;#101;&amp;#61;&amp;#116;&amp;#101;&amp;#120;&amp;#116;&amp;#62;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;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!)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel: XSS-Code, dem "magic_quotes_gpc", htmlentities() und strips_tags() nichts anhaben kann&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;3 onclick=eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel: Erlaubte Zeichen des Whitelist-Filters&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;a-z A-Z 0-9 _ . -&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beispiel: PHP-Whitelist-Filter&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function seq_string_reformat_($match_ = '') {&lt;br /&gt;    return sprintf('&amp;#x%04x;', ord($match_[1]));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function SEQ_OUTPUT($string_ = '') {&lt;br /&gt;    $string = seq_remove_slashes_($string_);&lt;br /&gt;    $string = preg_replace_callback('/([^a-zA-Z0-9_.-])/', "seq_string_reformat_", $string);&lt;br /&gt;    return $string;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="border-left: solid 2px blue"&gt;ANMERKUNG: Die Funktion "seq_remove_slashes_" findet sich im Post davor!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-2244007588280096400?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/2244007588280096400/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=2244007588280096400' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/2244007588280096400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/2244007588280096400'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2008/02/html-ausgabe-ohne-xss-schwachstelle.html' title='HTML-Ausgabe ohne XSS-Schwachstelle'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-5986487124762155429</id><published>2008-02-22T18:05:00.012+01:00</published><updated>2008-02-29T00:08:47.747+01:00</updated><title type='text'>PHP: "intelligent" Slashes entfernen</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;seq_remove_slashes_&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$string_ &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;''&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;   if (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;get_magic_quotes_gpc&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()) {&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$string_ &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;stripslashes&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$string_&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;   }&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$orig &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$string_&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$stripped &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;stripslashes&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$orig&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;   if (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$orig &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;!= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$stripped&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$escaped &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addslashes&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$stripped&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;       if (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$orig &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;== &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$escaped&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sec_value &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;stripslashes&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$escaped&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;       } else {&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sec_value &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$orig&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;       }&lt;br /&gt;   } else {&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sec_value &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$orig&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;   }&lt;br /&gt;   return &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$sec_value&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table style="width: 439px; height: 151px;" border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;c:\doc&lt;/td&gt;&lt;td&gt;c:\doc&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;thead&gt;&lt;br /&gt;&lt;tr&gt;&lt;th&gt;Eingabe&lt;/th&gt;&lt;th&gt;Ausgabe&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/thead&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;c:\\doc&lt;/td&gt;&lt;td&gt;c:\doc&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;O\'Reilly&lt;/td&gt;&lt;td&gt;O'Reilly&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;c:\\doc\\O\'Reilly&lt;/td&gt;&lt;td&gt;c:\doc\O'Reilly&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;c:\doc\O'Reilly&lt;/td&gt;&lt;td&gt;c:\doc\O'Reilly&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;ANMERKUNG:&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;table style="width: 439px; height: 28px;" border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;c:\doc\O\'Reilly&lt;/td&gt;&lt;td&gt;c:\doc\O\'Reilly&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-5986487124762155429?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/5986487124762155429/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=5986487124762155429' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/5986487124762155429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/5986487124762155429'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2008/02/magicquotesgpc-oder-aus.html' title='PHP: &quot;intelligent&quot; Slashes entfernen'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-7695237304062949142</id><published>2007-12-01T01:49:00.000+01:00</published><updated>2007-12-01T02:17:11.038+01:00</updated><title type='text'>Für zwischendurch: hier werkelt QuiBui (#4)</title><content type='html'>QuiBui wird bei dem großen &lt;a href="http://www.biomarkt-karo.de/"&gt;Bio-Shop KaRo&lt;/a&gt; eingesetzt z.B. bei den Rezepten, der Warenkunde, den Kontaktformularen und fast für die komplette Administration.&lt;br /&gt;&lt;br /&gt;Für die Pflege der Bestellungen und der Kundendaten kommt dazu &lt;a href="http://www.erich-kachel.de/dynaface_app"&gt;DynaFace&lt;/a&gt; zur Hilfe. Dabei wird davon die &lt;a href="http://www.erich-kachel.de/dynaface_app/beispiele/os-commerce-contribution/orders.php"&gt;tabellarische Darstellung&lt;/a&gt; verwendet.&lt;br /&gt;&lt;br /&gt;Auf der Benutzerseite wurde hier das &lt;a href="http://www.oscommerce.de/"&gt;Shopsystem oscommerce&lt;/a&gt; dahingehend erweitert, dass der Bestellprozess vollständig mit AJAX umgesetzt wurde. Die Vorteile davon:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Kunde verlässt nicht das aktuelle Produkt nach dem Bestellen - er kann einfach weiter einkaufen&lt;/li&gt;&lt;li&gt;Anzahl des Produktes im Warenkorb lässt sich am Produkt selbst ändern - Klick zum Warenkorb entfällt&lt;/li&gt;&lt;li&gt;Es wird am Produkt die Anzahl aus dem Warenkorb ausgewiesen - erhöhte Übersichtlichkeit&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_6yJrf7iuvwo/R1C1_vNtU0I/AAAAAAAAAAo/ge-ThMu2wPI/s1600-R/shop_1.PNG"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_6yJrf7iuvwo/R1C1_vNtU0I/AAAAAAAAAAo/JKMLZH6I5K0/s400/shop_1.PNG" alt="" id="BLOGGER_PHOTO_ID_5138807281440084802" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-7695237304062949142?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/7695237304062949142/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=7695237304062949142' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7695237304062949142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7695237304062949142'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/12/fr-zwischendurch-hier-werkelt-quibui-4.html' title='Für zwischendurch: hier werkelt QuiBui (#4)'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_6yJrf7iuvwo/R1C1_vNtU0I/AAAAAAAAAAo/JKMLZH6I5K0/s72-c/shop_1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-6043058804930463654</id><published>2007-10-31T17:36:00.000+01:00</published><updated>2007-10-31T17:43:11.361+01:00</updated><title type='text'>Für zwischendurch: hier werkelt QuiBui (#3)</title><content type='html'>In Vorbereitung auf das Eintreffen des &lt;span style="font-weight: bold;"&gt;iPhone&lt;/span&gt; auf dem deutschen Markt, wird für ich-habe-geburtstag.de eine spezielle Seite eingerichtet, die mit dem Look &amp;amp; Feel des iPhone aufwartet. Dahinter arbeitet auch hier QuiBui.&lt;br /&gt;&lt;br /&gt;Getestet werden kann die Seite auch ohne iPhone: Voraussetzung ist aber der Browser "Safari" von Apple, der ja ebenfalls auf dem iPhone läuft.&lt;br /&gt;&lt;br /&gt;Die iPhone-Seite findet sich hier:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ich-habe-geburtstag.de/iphone"&gt;http://www.ich-habe-geburtstag.de/iphone&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-6043058804930463654?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/6043058804930463654/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=6043058804930463654' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/6043058804930463654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/6043058804930463654'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/10/fr-zwischendurch-hier-werkelt-quibui-3.html' title='Für zwischendurch: hier werkelt QuiBui (#3)'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-7097817528840410116</id><published>2007-10-30T15:54:00.000+01:00</published><updated>2007-10-30T15:59:06.639+01:00</updated><title type='text'>Für zwischendurch: hier werkelt QuiBui (#2)</title><content type='html'>&lt;a href="http://www.ich-habe-geburtstag.de"&gt;http://www.ich-habe-geburtstag.de&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Die jetzt sichtbare Version basiert auf das aktuelle Update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-7097817528840410116?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/7097817528840410116/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=7097817528840410116' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7097817528840410116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7097817528840410116'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/10/fr-zwischendurch-hier-werkelt-quibui-2.html' title='Für zwischendurch: hier werkelt QuiBui (#2)'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-6971153858567491256</id><published>2007-09-21T15:15:00.000+02:00</published><updated>2007-09-21T15:49:34.161+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php forum'/><title type='text'>QuiBui in Foren</title><content type='html'>Ich habe im Forum von &lt;a href="http://www.php-resource.de/"&gt;www.php-resource.de&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;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...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wie hätte ich vermuten können&lt;/span&gt;, 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??&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ich für mein Teil habe daraus etwas gelernt&lt;/span&gt;: 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...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-6971153858567491256?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/6971153858567491256/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=6971153858567491256' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/6971153858567491256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/6971153858567491256'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/09/fr-wen-quibui-gedacht-ist.html' title='QuiBui in Foren'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-7957980886165626166</id><published>2007-09-19T22:07:00.000+02:00</published><updated>2007-09-19T22:34:55.765+02:00</updated><title type='text'>Lektion 3: Durch MySQL-Liste blättern</title><content type='html'>Schauen wir uns mal an, wie durch eine lange Liste mit QuiBui geblättert werden kann. Was ich schon vorab sagen kann: es ist wirklich einfach ;)&lt;br /&gt;&lt;br /&gt;Gegeben sei eine MySQL-Tabelle, wie z.B. diese:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;&lt;pre&gt;Tabelle: albums&lt;br /&gt;-----------------------------------------&lt;br /&gt;| jahr | album                  | verkauft|&lt;br /&gt;-----------------------------------------&lt;br /&gt;| 1981 | Face Value             | 19 Mio. |&lt;br /&gt;| 1982 | Hello, I Must Be Going!| 15 Mio. |&lt;br /&gt;| 1985 | No Jacket Required     | 32 Mio. |&lt;br /&gt;| 1987 | 12"ers (Remixes)       |  1 Mio. |&lt;br /&gt;| 1989 | …But Seriously         | 26 Mio. |&lt;br /&gt;| 1989 | Serious Hits… Live!    | 22 Mio. |&lt;br /&gt;| 1993 | Both Sides             | 10 Mio. |&lt;br /&gt;| 1996 | Dance Into The Light   |  5 Mio. |&lt;br /&gt;| 1998 | ...Hits                | 15 Mio. |&lt;br /&gt;| 1999 | A Hot Night In Paris   |  1 Mio. |&lt;br /&gt;| 1999 | Tarzan-Soundtrack      |  2 Mio. |&lt;br /&gt;| 2002 | Testify                |  5 Mio. |&lt;br /&gt;| 2003 | Bärenbrüder-Soundtrack |         |&lt;br /&gt;| 2004 | Platinum Collection    |  1 Mio. |&lt;br /&gt;-----------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Nehmen wir an, wir wollen nur je 5 Einträge gleichzeitig anzeigen - weitere sollen durch Blättern erreichbar sein.&lt;br /&gt;&lt;br /&gt;Zuerst geben wir die Liste einfach aus. (&lt;a href="http://php-rapid-prototyping.blogspot.com/2007/02/lektion-2-mysql-tabelle-auslesen.html"&gt;Hier ausführlich, wie das geht&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; foreach(QB_TABLE2ARRAY('albums') as $album) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   echo $album['jahr'] . " " . $album['album'] . "&amp;lt;br&amp;gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Jetzt setzen wir im Kopf der PHP-Datei eine QuiBui-Variable fest, die das Blättern steuert:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$_QB_MAX_PER_PAGE&lt;/span&gt;  gibt an, wie viele Einträge pro Seite angezeigt werden sollen. Wir wollten hier 5 anzeigen.  Also:&lt;br /&gt;&lt;br /&gt;$_QB_MAX_PER_PAGE = 10;&lt;br /&gt;&lt;br /&gt;Jetzt fügen wir an die gewünschte Stelle die Links zum Blättern ein:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;echo QB_PAGINATION_LINKS(QB_COUNTTABLE('albums'));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nun ja, das war's auch schon! &lt;a href="http://www.erich-kachel.de/quibui_app/beispiele/lektion_2/lektion_2_2.php"&gt;Sehen wollen? Quelltext ist auch dabei!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-7957980886165626166?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/7957980886165626166/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=7957980886165626166' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7957980886165626166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7957980886165626166'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/09/lektion-3-durch-mysql-liste-blttern.html' title='Lektion 3: Durch MySQL-Liste blättern'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-7589342151688561317</id><published>2007-09-13T10:54:00.000+02:00</published><updated>2007-09-19T23:10:42.867+02:00</updated><title type='text'>QuiBui LE Download</title><content type='html'>Seit heute steht QuiBui "LE" zum Download bereit.&lt;br /&gt;&lt;br /&gt;Beispiele zum Einsatz von QuiBui LE findet ihr auf der Homepage:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.erich-kachel.de/quibui_app"&gt;http://www.erich-kachel.de/quibui_app&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-7589342151688561317?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/7589342151688561317/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=7589342151688561317' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7589342151688561317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/7589342151688561317'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/09/quibui-le-download.html' title='QuiBui LE Download'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-8325533489719084589</id><published>2007-03-08T22:24:00.000+01:00</published><updated>2007-03-08T22:45:16.702+01:00</updated><title type='text'>Für zwischendurch: hier werkelt QuiBui</title><content type='html'>Mal sehen wollen, wo QuiBui in aller Pracht seine Arbeit verrichtet? Ich nenne erst einmal die "prominenteste" Stelle:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.one-book.de/druckformular.php"&gt;http://www.one-book.de/druckformular.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Das Besondere hier: Prüfung der Feldeingaben, eindeutige Fehlermeldungen in den Feldern und als Erklärung separat, Blättern zwischen mehreren Formularen - vor und zurück, Versand einer Mail zum Schluss. Alles natürlich mit allen angebotenen Sicherheitsvorkehrungen eingeschaltet. Kein XSS-Defacement, keine SQL-Injections, keine Mailheader-Injections möglich.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-8325533489719084589?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/8325533489719084589/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=8325533489719084589' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/8325533489719084589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/8325533489719084589'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/03/fr-zwischendurch-hier-werkelt-quibui.html' title='Für zwischendurch: hier werkelt QuiBui'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-8965398399532173647</id><published>2007-02-28T21:23:00.000+01:00</published><updated>2007-02-28T22:36:10.946+01:00</updated><title type='text'>Lektion 2: MySQL Tabelle auslesen</title><content type='html'>Widmen wir uns heute einer anderen üblichen Aufgabenstellung aus der PHP-Anwendungsentwicklung: das Auslesen einer MySQL-Tabelle und das Darstellen der Daten.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Beispieltabelle definieren&lt;/span&gt;&lt;br /&gt;Damit wir alle wissen, worum es hier geht, möchte ich die Struktur der MySQL-Tabelle definieren.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;&lt;pre&gt;Tabelle: albums&lt;br /&gt;-----------------------------------------&lt;br /&gt;| jahr | album                  | verkauft|&lt;br /&gt;-----------------------------------------&lt;br /&gt;| 1981 | Face Value             | 19 Mio. |&lt;br /&gt;| 1982 | Hello, I Must Be Going!| 15 Mio. |&lt;br /&gt;| 1985 | No Jacket Required     | 32 Mio. |&lt;br /&gt;| 1987 | 12"ers (Remixes)       |  1 Mio. |&lt;br /&gt;| 1989 | …But Seriously         | 26 Mio. |&lt;br /&gt;| 1989 | Serious Hits… Live!    | 22 Mio. |&lt;br /&gt;| 1993 | Both Sides             | 10 Mio. |&lt;br /&gt;| 1996 | Dance Into The Light   |  5 Mio. |&lt;br /&gt;| 1998 | ...Hits                | 15 Mio. |&lt;br /&gt;| 1999 | A Hot Night In Paris   |  1 Mio. |&lt;br /&gt;| 1999 | Tarzan-Soundtrack      |  2 Mio. |&lt;br /&gt;| 2002 | Testify                |  5 Mio. |&lt;br /&gt;| 2003 | Bärenbrüder-Soundtrack |         |&lt;br /&gt;| 2004 | Platinum Collection    |  1 Mio. |&lt;br /&gt;-----------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Nachdem wir eine solche Tabelle erstellt haben (mit phpmyadmin z.B.), ihr den Namen &lt;span style="font-style: italic;"&gt;albums&lt;/span&gt; gegeben haben und die Daten eingepflegt haben, wollen wir diese in unsere Webseite anzeigen. Um uns nicht mit Design zu beschäftigen, geben wir die Daten ohne Schnickschnack aus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unsere Webseite&lt;/span&gt;&lt;br /&gt;Die Webseite sieht wie zu Anfang der Lektion 1 aus:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&amp;lt;?php&lt;br /&gt;include_once('../quibui/quibui.php');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Datenbanktabelle auslesen und anzeigen&lt;/span&gt;&lt;br /&gt;Wir brauchen die Funktion&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 102, 255); font-weight: bold;"&gt;QB_TABLE2ARRAY(p1, p2, p3, p4)&lt;/blockquote&gt;&lt;br /&gt;Wir verwenden jetzt nur &lt;span style="font-style: italic;"&gt;p1&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;P1&lt;/span&gt; nimmt den Namen der Tabelle.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 102, 255); font-weight: bold;"&gt;QB_TABLE2ARRAY('albums')&lt;/blockquote&gt;Jetzt haben wir den gesamten Inhalt der Tabelle zur Verfügung und können ihn darstellen. Dabei nutzen wir die Datenstruktur des assoziativen Arrays und gehen jeden einzelnen Datensatz durch. Unsere Datei sieht also wie folgt aus:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&amp;lt;?php&lt;br /&gt;include_once('../quibui/quibui.php');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; foreach(QB_TABLE2ARRAY('albums') as $album) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;   echo $album['jahr'] . " " . $album['album'] . "&amp;lt;br&amp;gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/p&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fertig&lt;/span&gt;&lt;br /&gt;So werden Tabelleninhalte mit QuiBui ausgelesen. Das Ergebnis sieht z.B. so aus:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  1981 Face Value&lt;br /&gt;1982 Hello, I Must Be Going!&lt;br /&gt;1985 No Jacket Required&lt;br /&gt;1987 12"ers (Remixes)&lt;br /&gt;1989 ...But Seriously&lt;br /&gt;1989 Serious Hits? Live!&lt;br /&gt;1993 Both Sides&lt;br /&gt;1996 Dance Into The Light&lt;br /&gt;1998 ...Hits&lt;br /&gt;1999 A Hot Night In Paris&lt;br /&gt;1999 Tarzan-Soundtrack&lt;br /&gt;2002 Testify&lt;br /&gt;2003 Bärenbrüder-Soundtrack&lt;br /&gt;2004 Platinum Collection&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-8965398399532173647?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/8965398399532173647/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=8965398399532173647' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/8965398399532173647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/8965398399532173647'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/02/lektion-2-mysql-tabelle-auslesen.html' title='Lektion 2: MySQL Tabelle auslesen'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-9043360358375386455</id><published>2007-02-22T23:16:00.000+01:00</published><updated>2007-02-22T23:23:05.535+01:00</updated><title type='text'>Lektion 1: Hallo NAME</title><content type='html'>Fangen wir mit einer trivialen Sache an, die unter PHP höchst sicherheitskritisch ist: Eingabe und Ausgabe von Formulardaten.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;W&lt;/span&gt;as ist hier sicherheitskritisch? Nun, es ist die Stelle, an der die üblichen XSS-Defacements ansetzen. Wie verbreitet diese Falle ist, ist hier schön zu beobachten:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://baseportal.com/baseportal/phishmarkt/de"&gt;http://baseportal.com/baseportal/phishmarkt/de&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Datei anlegen&lt;/span&gt;&lt;br /&gt;Aber schauen wir uns erst einmal unsere PHP-Datei an. Sie enthält erst den QuiBui-Aufruf.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;   include_once('../quibui/quibui.php');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Wir speichern diese in ein Verzeichnis &lt;span style="font-style: italic;"&gt;lektion_1&lt;/span&gt; auf dem Server ab. Wenn diese Datei jetzt aufgerufen wird, passiert... gar nichts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ein Formular, zum Testen&lt;/span&gt;&lt;br /&gt;Jetzt erstellen wir ein minimalistisches Formular, um die Übertragung und die Ausgabe von Daten durchzuspielen. Meine Datei sieht jetzt so aus:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&amp;lt;?php&lt;br /&gt;   include_once('../quibui/quibui.php');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;p style="color: rgb(255, 0, 0);"&gt;&amp;lt;form method="POST" action=""&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="MEINNAME"&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Senden"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/p&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;Falls nicht klar ist, was diese Zeilen machen, sollte von der Verwendung von QuiBui abgesehen werden und mit dem 1 mal 1 angefangen werden: HTML (&lt;a href="http://de.selfhtml.org/"&gt;&lt;/a&gt;&lt;a href="http://de.selfhtml.org/"&gt;SELFHTML&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Rufen wir diese Seite jetzt auf und geben in das Feld was ein, dann wandert die Eingabe beim Klicken des Knopfes &lt;span style="font-style: italic;"&gt;Senden&lt;/span&gt; wieder zu diese Seite zurück, da wir dem Formular keinen &lt;span style="font-style: italic;"&gt;action&lt;/span&gt;-Parameter mitgegeben haben. Für unsere Zwecke ist das aber sehr schön so, denn wir können gleich im selben Formular die gesendeten Daten empfangen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;POST und GET Daten auslesen&lt;/span&gt;&lt;br /&gt;Jetzt kommen die Daten aus dem Formular also wohl an. Nun müssen wir sie nur noch sichtbar und nutzbar machen. Dazu machen wir Bekanntschaft mit einem Allrounder aus den QuiBui-Funktionen:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-weight: bold; color: rgb(51, 51, 255);"&gt;QB_HTTPVARS2ARRAY(p1, p2)&lt;/blockquote&gt;&lt;br /&gt;Diese Funktion sammelt für uns umherfliegende GET und POST-Daten (und einige mehr, doch darüber später) ein und stellt sie uns zur Verfügung. Fragen wir die Funktion parameterlos ab, dann bekommen wir ein assoziatives Array mit allen gesammelten Daten. In unserem Fall möchten wir aber nur den Inhalt des Feldes mit dem Namen MEINNAME haben:&lt;br /&gt;&lt;br /&gt;QB_HTTPVARS2ARRAY('MEINNAME');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Diese neue Zeile fügen wir unserer Datei hinzu:&lt;br /&gt;&lt;br /&gt;&lt;blockquote face="courier new"&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;   include_once('../quibui/quibui.php');&lt;br /&gt;   &lt;span style="color: rgb(255, 0, 0);"&gt;echo QB_HTTPVARS2ARRAY('MEINNAME');&lt;/span&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;p&gt;&amp;lt;form method="POST" action=""&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="MEINNAME"&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Senden"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/p&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;Damit geben wir den Inhalt des Feldes aus. Die Funktion kann den Wert auch anzeigen, wenn dieser über GET übertragen wurde.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ausgabe sichern&lt;/span&gt;&lt;br /&gt;Wir haben zum Anfang gesehen, wie sich ungeschützte Ausgaben missbrauchen lassen. Um das mit unserem Beispiel - und später generell mit allen Ausgaben - nicht zu ermöglichen, verwenden wir die Funktion&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-weight: bold; color: rgb(51, 102, 255);"&gt;QB_SECUREPRINT(p1, p2)&lt;/blockquote&gt;&lt;br /&gt;Sodass die Datei zum Schluss so aussieht:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;   include_once('../quibui/quibui.php');&lt;br /&gt;   &lt;span style="color: rgb(255, 0, 0);"&gt;echo QB_SECUREPRINT(QB_HTTPVARS2ARRAY('MEINNAME'));&lt;/span&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;p&gt;&amp;lt;form method="POST" action=""&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="MEINNAME"&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Senden"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/p&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-9043360358375386455?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/9043360358375386455/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=9043360358375386455' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/9043360358375386455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/9043360358375386455'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/02/lektion-1-hallo.html' title='Lektion 1: Hallo NAME'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-8099966340117412733</id><published>2007-02-22T21:40:00.000+01:00</published><updated>2007-02-22T22:01:30.362+01:00</updated><title type='text'>QuiBui - Installation</title><content type='html'>QuiBui enthält keine Installationsroutinen. Es kann nach dem Entpacken in ein Verzeichnis und nach Anpassen der Datenbankverbindung (MySQL) einfach mit &lt;span style="font-style: italic;"&gt;include&lt;/span&gt; eingebunden werden.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Entpacken&lt;/span&gt;&lt;br /&gt;Ich empfehle diese Verzeichnisstruktur:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;pre&gt;wwwroot&lt;br /&gt;|&lt;br /&gt;- qb&lt;br /&gt;|  |&lt;br /&gt;|  |- obfuscated&lt;br /&gt;|     |&lt;br /&gt;|     |- formular.php&lt;br /&gt;|     |- functions_inc.php&lt;br /&gt;|     |- qb_check_pattern.php&lt;br /&gt;|&lt;br /&gt;|- INSTALLATION.txt&lt;br /&gt;|- mysql_inc.php.example&lt;br /&gt;|- quibui.php.example&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Das bedeutet, dass die ZIP-Datei in ein neu angelegtes Verzeichnis &lt;span style="font-style: italic;"&gt;qb&lt;/span&gt; in das Server-Rootverzeichnis kopiert wird.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Konfigurieren&lt;/span&gt;&lt;br /&gt;Es ist die Datei &lt;span style="font-style: italic;"&gt;mysql_inc.php.example&lt;/span&gt; nach &lt;span style="font-style: italic;"&gt;mysql_inc.php&lt;/span&gt; zu kopieren und zu editieren:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;/blockquote&gt;&lt;br /&gt;Die benötigten Daten sind vom Provider zu erfahren. Das sollte man schon machen können, wenn man QuiBui nutzen möchte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Verwenden&lt;/span&gt;&lt;br /&gt;Es sit die Datei &lt;span style="font-style: italic;"&gt;quibui.php.example&lt;/span&gt;  nach &lt;span style="font-style: italic;"&gt;quibui.php&lt;/span&gt; zu kopieren. Jetzt wird diese und nur diese von der künftigen Anwendung eingebunden:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;include_once('/qb/quibui.php');&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Obfuscation&lt;/span&gt;&lt;br /&gt;QuiBui ist in grossen Teilen "obfusziert", also verschleiert. Praktisch bedeutet es, dass  Variablen-, Funktionen- und Konstantennamen neue Namen "von der Stange" bekommen. Dadurch ist es immernoch möglich, den Code zu sichten. Was schwerer gehen sollte, ist dass sich andere was davon aneignen. &lt;span style="font-weight: bold;"&gt;QuiBui ist nicht Open Source, sondern Freeware.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-8099966340117412733?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/8099966340117412733/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=8099966340117412733' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/8099966340117412733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/8099966340117412733'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/02/quibui-installation.html' title='QuiBui - Installation'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070265029118552054.post-3609436173769406521</id><published>2007-02-22T21:20:00.000+01:00</published><updated>2007-02-22T21:39:58.972+01:00</updated><title type='text'>QuiBui - Vorwort</title><content type='html'>QuiBui ist eine freundliche Sammlung von PHP-Funktionen, die klassische Aufgaben bei der Anwendungsentwicklung erleichtern.&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;chon einmal ein Formular gebaut und dann mit Daten aus einer Datenbank füllen wollen? Sicherlich! Unzählige Versuche finden sich in allen Entwicklerforen und jedes mal ist der Lösungsvorschlag ein anderer. Das Resultat ist fast immer ein unübersichtlicher Salat von PHP-Code und HTML. Der Versuch, Datenbankzugriffe, Design und Sicherheit in eine Datei zu pressen. Und beim nächsten Mal, stehen wir wieder am Anfang...&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;E&lt;/span&gt;in E-Mailformular fertig erstellt und dann fleissig Spamangriffe geerntet? Sicherlich! Dabei sind es einige Regeln, die es zu beachten gilt um es den Spammern ihre "Arbeit" schon um einiges schwerer bis unmöglich zu machen. Und dazu braucht man keine "habenwollen!"-Kaptchas...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Was ist bei QuiBui anders?&lt;/span&gt; Es ist vielleicht nicht die Absicht, damit alle glücklich zu machen. Es ist kein Framework. Es sind einfach nur Funktionen, die ziemlich gezielt genau das machen, was ein PHP-Entwickler braucht, wenn er seine Anwendung konzipiert.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070265029118552054-3609436173769406521?l=php-rapid-prototyping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-rapid-prototyping.blogspot.com/feeds/3609436173769406521/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1070265029118552054&amp;postID=3609436173769406521' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/3609436173769406521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070265029118552054/posts/default/3609436173769406521'/><link rel='alternate' type='text/html' href='http://php-rapid-prototyping.blogspot.com/2007/02/quibui-vorwort.html' title='QuiBui - Vorwort'/><author><name>Erich</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
