<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>CBlog - PHP</title>
    <link>https://blog.cboltz.de/</link>
    <description></description>
    <dc:language>de</dc:language>
    <generator>Serendipity 2.5.0 - http://www.s9y.org/</generator>
    <pubDate>Sun, 18 Jun 2017 20:48:51 GMT</pubDate>

    <image>
    <url>https://blog.cboltz.de/templates/2k11/img/s9y_banner_small.png</url>
    <title>RSS: CBlog - PHP - </title>
    <link>https://blog.cboltz.de/</link>
    <width>100</width>
    <height>21</height>
</image>

<item>
    <title>Packaging MediaWiki extensions</title>
    <link>https://blog.cboltz.de/archives/76-Packaging-MediaWiki-extensions.html</link>
            <category>english</category>
            <category>Linux</category>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/76-Packaging-MediaWiki-extensions.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=76</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=76</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    &lt;p&gt;As part of the work for the openSUSE wiki upgrade and move, I had to package a bunch of MediaWiki extensions. We&#039;ll use the MediaWiki 1.27.x LTS release, which means the extensions need to work with this version.&lt;/p&gt;

&lt;p&gt;When it comes to packaging, there are three categories of extensions:&lt;/p&gt;

&lt;h2&gt;The Good&lt;/h2&gt;

&lt;p&gt;These extensions are hosted on phabricator.wikimedia.org, and you can easily download a tarball matching your MediaWiki version using the &quot;Download snapshot&quot; link on the extension page.&lt;/p&gt;

&lt;p&gt;Packaging these extensions is easy - just unpack the tarball and copy/package everything to the extension directory.&lt;/p&gt;

&lt;p&gt;These extensions are standardized enough to use a spec file template - usually I only had to adjust the extension name, tarball name and version. Speaking of the version - most extensions don&#039;t have explicit version numbers, so I decided to use the tarball date instead.&lt;/p&gt;

&lt;p&gt;An example for this category is Auth_remoteuser (&lt;a href=&quot;https://www.mediawiki.org/wiki/Extension:Auth_remoteuser&quot;&gt;extension page&lt;/a&gt;, &lt;a href=&quot;https://build.opensuse.org/package/show/openSUSE:infrastructure:wiki/mediawiki_1_27-Auth_remoteuser&quot;&gt;package&lt;/a&gt;) which we use to keep the &quot;nice&quot; wiki login form.&lt;/p&gt;

&lt;h2&gt;The Bad&lt;/h2&gt;

&lt;p&gt;These extensions are hosted on GitHub and typically only have a &quot;master&quot; branch. They usually still work with MediaWiki 1.27.x, but there&#039;s a small risk that they require features added in newer MediaWiki versions, and this risk will grow over time.&lt;/p&gt;

&lt;p&gt;On the packaging side, they are as easy as the &quot;good&quot; extensions.&lt;/p&gt;

&lt;p&gt;An example is the ParamProcessor extension (&lt;a href=&quot;https://www.mediawiki.org/wiki/Extension:ParamProcessor&quot;&gt;extension page&lt;/a&gt;, &lt;a href=&quot;https://build.opensuse.org/package/show/openSUSE:infrastructure:wiki/mediawiki_1_27-ParamProcessor&quot;&gt;package&lt;/a&gt;) which is needed by the Maps extension&lt;/p&gt;

&lt;h2&gt;The Ugly&lt;/h2&gt;

&lt;p&gt;These extensions can be hosted on phabricator.mediawiki.org or GitHub, so there are &quot;god ugly&quot; and &quot;bad ugly&quot; extensions ;-) The thing that makes packaging really ugly is that they don&#039;t include all the code they need. Instead, you have to download the missing parts with composer.&lt;/p&gt;

&lt;p&gt;composer works fine in a &quot;real&quot; system, but makes packaging hard. Running it from the spec will obviously fail because OBS doesn&#039;t allow network connections while building a package (and even if it&#039;s annoying in this case, not having network access during build is a good thing[tm]).&lt;/p&gt;

&lt;p&gt;My solution is a little script that unpacks the extension tarball and runs &quot;composer install --no-dev&quot; inside the extension directory. The most important part is the &quot;--no-dev&quot; parameter because that avoids lots of superfluous things. Afterwards, I build a tarball from the &quot;vendor&quot; directory and add it to the package.&lt;/p&gt;

&lt;p&gt;Yeah, I know that&#039;s not nice - guess why I named this section &quot;The Ugly&quot; ;-)&lt;/p&gt;

&lt;p&gt;One of the packages that need a &quot;composer install&quot; run is the GitHub extension (&lt;a href=&quot;https://www.mediawiki.org/wiki/Extension:GitHub&quot;&gt;extension page&lt;/a&gt;, &lt;a href=&quot;https://build.opensuse.org/package/show/openSUSE:infrastructure:wiki/mediawiki_1_27-GitHub&quot;&gt;package including script to run composer&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Luckily, &quot;ugly&quot; only applies to packaging. The extensions and their maintainers are for sure not ugly - for example, the maintainer of the GitHub extension was very fast in fixing a bug :-)&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Sun, 18 Jun 2017 22:46:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/76-guid.html</guid>
    <category>mediawiki</category>
<category>opensuse</category>

</item>
<item>
    <title>PostfixAdmin 3.0</title>
    <link>https://blog.cboltz.de/archives/72-PostfixAdmin-3.0.html</link>
            <category>english</category>
            <category>Linux</category>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/72-PostfixAdmin-3.0.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=72</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=72</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    &lt;p&gt;&lt;!-- s9ymdb:127 --&gt;&lt;img alt=&quot;PostfixAdmin logo&quot; class=&quot;serendipity_image_right&quot; src=&quot;https://blog.cboltz.de/uploads/postfixadmin-logo.png&quot; style=&quot;width:280px&quot; /&gt;I just released the long awaited PostfixAdmin 3.0.&lt;/p&gt;

&lt;p&gt;Right. there isn&#039;t a beta label anymore :-) It&#039;s more than two years since we released the first beta for 3.0 (and even more years of working towards 3.0 - I started working on the PFAHandler class in 2011) so I think we can safely drop the beta label.&lt;/p&gt;

&lt;p&gt;PostfixAdmin 3.0 is now officially the stable version of PostfixAdmin. I&#039;ll keep the 2.3 branch maintained for a while if someone finds critical or security bugs, but nevertheless it&#039;s probably a good idea to upgrade to 3.0 whenever you have some time.&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;https://sourceforge.net/p/postfixadmin/discussion/676076/thread/483a30d4/&quot; target=&quot;_blank&quot;&gt;official announcement&lt;/a&gt; for details and the changelog, and my &lt;a href=&quot;http://blog.cboltz.de/archives/69-PostfixAdmin-3.0-beta-slides.html&quot; target=&quot;_blank&quot;&gt;PostfixAdmin 3.0 slides&lt;/a&gt; (which still wear the beta label) for a quick overview of PostfixAdmin and what&#039;s new in 3.0.&lt;/p&gt;

&lt;p&gt;BTW: I already submitted PostfixAdmin 3.0 to openSUSE Tumbleweed and Leap 42.2. It will arrive there as soon as the submit requests get accepted.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Sun, 11 Sep 2016 23:43:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/72-guid.html</guid>
    <category>mail</category>
<category>php</category>
<category>postfixadmin</category>

</item>
<item>
    <title>MultiBoilerplate: Vorlagen pro Namespace</title>
    <link>https://blog.cboltz.de/archives/55-MultiBoilerplate-Vorlagen-pro-Namespace.html</link>
            <category>english</category>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/55-MultiBoilerplate-Vorlagen-pro-Namespace.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=55</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=55</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    &lt;p&gt;Die Mediawiki-Extension &lt;a target=&quot;_blank&quot; href=&quot;http://www.mediawiki.org/wiki/Extension:MultiBoilerplate&quot;&gt;MultiBoilerplate&lt;/a&gt; ermöglicht es, beim Anlegen einer Seite eine oder mehrere Vorlagen zur Auswahl anzubieten. Das ist schonmal gut. Noch besser ist es allerdings, wenn die Vorlagen-Liste je nach Namespace eingestellt werden kann - eine Vorlage für eine neue Seite ist z. B. nicht als Vorlage für eine Hilfeseite  geeignet.&lt;/p&gt; 
&lt;p&gt;Die Lösung ist ein kleiner Patch, den ich für MultiBoilerplate geschrieben habe. Dieser ist im &lt;a target=&quot;_blank&quot; href=&quot;https://bugzilla.wikimedia.org/show_bug.cgi?id=22759&quot;&gt;Mediawiki Bugtracker&lt;/a&gt; verfügbar (und wird hoffentlich in der nächsten MultiBoilerplate-Version aufgenommen ;-) Der Patch enthält auch eine Beschreibung der nötigen Config-Optionen.&lt;br /&gt;&lt;/p&gt; 
&lt;p style=&quot;color: #00cc00;&quot;&gt;The Mediawiki-Extension &lt;a target=&quot;_blank&quot; href=&quot;http://www.mediawiki.org/wiki/Extension:MultiBoilerplate&quot;&gt;MultiBoilerplate&lt;/a&gt; allows to offer one or more boilerplates when creating a new page. That&#039;s quite good. It&#039;s even better to offer different boilerplates for each namespace - for example, a boilerplate for a new page is not necessarily a good boilerplate for a help page.&lt;/p&gt; 
&lt;p style=&quot;color: #00cc00;&quot;&gt;The solution is a small patch I wrote for MultiBoilerplate. You can download it from the &lt;a target=&quot;_blank&quot; href=&quot;https://bugzilla.wikimedia.org/show_bug.cgi?id=22759&quot;&gt;Mediawiki Bugtracker&lt;/a&gt; (and will hopefully be included in the next version of MultiBoilerplate ;-) The patch includes a description of the necessary config options.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 18 Apr 2010 21:02:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/55-guid.html</guid>
    <category>mediawiki</category>
<category>multiboilerplate</category>

</item>
<item>
    <title>Prosit Neujahr!</title>
    <link>https://blog.cboltz.de/archives/54-Prosit-Neujahr!.html</link>
            <category>english</category>
            <category>Linux</category>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/54-Prosit-Neujahr!.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=54</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=54</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    &lt;p&gt;Prosit Neujahr und alles Gute für 2010! Dieser Artikel enthält einiges, das ich schon 2009 bloggen wollte, und außerdem eine kleine Neujahrsüberraschung von SpamAssassin ;-)&lt;/p&gt; 
&lt;p style=&quot;color: #00cc00;&quot;&gt;Happy New Year! This article contains some things I wanted to blog about in 2009 already, and a little new year surprise from SpamAssassin ;-)&lt;/p&gt; 
&lt;ul&gt; 
&lt;li&gt; &lt;a href=&quot;http://sourceforge.net/projects/postfixadmin&quot; target=&quot;_blank&quot;&gt;PostfixAdmin&lt;/a&gt; 2.3 wurde im Oktober 2009 releast, RPMs gibt es natürlich im &lt;a href=&quot;http://download.opensuse.org/repositories/home:/cboltz/&quot; target=&quot;_blank&quot;&gt;openSUSE Build Service&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://sourceforge.net/projects/postfixadmin&quot;&gt;PostfixAdmin&lt;/a&gt;&lt;span style=&quot;color: #00cc00;&quot;&gt; 2.3 was released in october 2009, RPMs are available in the &lt;/span&gt;&lt;a href=&quot;http://download.opensuse.org/repositories/home:/cboltz/&quot;&gt;openSUSE Build Service&lt;/a&gt;&lt;/li&gt; 
&lt;li&gt;Postfixadmin 2.4 (oder 3.0?) wird Smarty für die Templates verwenden&lt;br /&gt;&lt;span style=&quot;color: #00cc00;&quot;&gt;PostfixAdmin 2.4 (or 3.0?) will use smarty for the templates&lt;/span&gt;&lt;/li&gt; 
&lt;li&gt;PostfixAdmin 2.3.1 (alle Bugfixes seit dem 2.3-Release, aber ohne Smarty) ist in Arbeit&lt;br /&gt;&lt;span style=&quot;color: #00cc00;&quot;&gt;PostfixAdmin 2.3.1 (with all bugfixes since 2.3 release, but without smarty) is under development&lt;/span&gt;&lt;/li&gt; 
&lt;li&gt;openSUSE 11.2 wurde im November 2009 releast, und auch gleich von uns (Jan, Jan-Simon und mir) auf der Open Source Expo in Karlsruhe präsentiert&lt;br /&gt;&lt;span style=&quot;color: #00cc00;&quot;&gt;openSUSE 11.2 was released in november 2009, and presented by us (Jan, Jan-Simon and me) at the Open Source Expo in Karlsruhe&lt;/span&gt;&lt;/li&gt; 
&lt;li&gt;und die Neujahrsüberraschung von SpamAssassin: 2010 bekommt jede Mail erstmal 3.188 Punkte... - &lt;a href=&quot;https://bugzilla.novell.com/show_bug.cgi?id=567852&quot;&gt;Bugreport&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;color: #00cc00;&quot;&gt;and the new year surprise from SpamAssassin: every mail in 2010 gets 3.188 points... - &lt;/span&gt;&lt;a href=&quot;https://bugzilla.novell.com/show_bug.cgi?id=567852&quot; target=&quot;_blank&quot;&gt;Bugreport&lt;/a&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
    </content:encoded>

    <pubDate>Fri, 01 Jan 2010 17:30:00 +0100</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/54-guid.html</guid>
    <category>bug</category>
<category>linux</category>
<category>opensuse</category>
<category>postfixadmin</category>
<category>server</category>
<category>spam</category>

</item>
<item>
    <title>th_mailformplus und Attachments</title>
    <link>https://blog.cboltz.de/archives/52-th_mailformplus-und-Attachments.html</link>
            <category>english</category>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/52-th_mailformplus-und-Attachments.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=52</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=52</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    &lt;p&gt;Auf der Typo3-Website eines Kunden verwende ich th_mailformplus für ein Webformular mit Dateiupload. Funktioniert auch soweit, allerdings wurde die hochgeladene Datei (trotz entsprechender Konfiguration des Formulars) nicht an die Maill angehängt.&lt;/p&gt; 
&lt;p&gt;Seit vorhin kenne ich den Grund: Der Mail-Funktion wird nur der Dateiname ohne Pfad angegeben, und dadurch findet die Funktion natürlich die Datei nicht und kann sie auch nicht anhängen :-(&amp;#160; Außerdem endet der Dateiname noch mit \n.&lt;/p&gt; 
&lt;p&gt; Ich habe eben einen kleinen &lt;a href=&quot;http://bugs.typo3.org/view.php?id=6593&quot; target=&quot;_blank&quot;&gt;Patch in den Typo3-Bugtracker&lt;/a&gt; hochgeladen, der den Pfad beim Dateinamen einfügt und das \n per trim() entsorgt. Und schon werden Mails mit Anhang verschickt :-)&lt;/p&gt; 
&lt;p style=&quot;color: #00cc00;&quot;&gt;I use th_mailformplus for a mailform with file upload on a customer&#039;s typo3 website. Works mostly, but the uploaded file was not attached to the mail (even if the mailform config was correct).&lt;/p&gt; 
&lt;p style=&quot;color: #00cc00;&quot;&gt;Since a short while ago I know the reason: The mail function is called with the filename without path, and therefore obviously can&#039;t find the file :-(&amp;#160; Besides that, the filename ends with \n.&lt;/p&gt; 
&lt;p&gt;&lt;span style=&quot;color: #00cc00;&quot;&gt;I just uploaded a &lt;a href=&quot;http://bugs.typo3.org/view.php?id=6593&quot; target=&quot;_blank&quot;&gt;small patch to the Typo3 bugtracker&lt;/a&gt; which inserts the path into the filename and removes the \n using trim(). Now mailformplus sends mails with attachments :-)&lt;/span&gt;&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 02 Jul 2009 01:00:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/52-guid.html</guid>
    <category>bug</category>
<category>typo3</category>

</item>
<item>
    <title>Paste Search</title>
    <link>https://blog.cboltz.de/archives/37-Paste-Search.html</link>
            <category>english</category>
            <category>Linux</category>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/37-Paste-Search.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=37</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=37</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    
&lt;p&gt;Schöner Titel zum Mitraten, oder? ;-)&lt;/p&gt;&lt;p&gt;Paste Search ist ein unspektakuläres PHP-Script, das aber die Usability von Konqueror (und anderen Webbrowsen) enorm verbessert. Konkret geht es um das Verhalten beim &amp;quot;Mittelklicken&amp;quot; des Browserfensters, das normalerweise eine Google-Suche auslöst und nach dem Begriff in der Zwischenablage sucht. Dieses Standardverhalten ist schonmal gut, aber oft habe ich andere Ziele - beispielsweise ein Bugreport auf bugzilla.novell.com oder im SourceForge Tracker.&lt;/p&gt;&lt;p&gt;Die Lösung ist relativ einfach: Das folgende PHP-Script wird auf einen Webserver hochgeladen und als Standard-Suchmaschine im Browser eingetragen. Ab diesem Zeitpunkt wird bei Zahlen automatisch im Bugtracker gesucht (die Unterscheidung erfolgt anhand der Nummer - alles bis 500000 geht an bugzilla.novell.com, der Rest an SourceForge), bei Text mit Google.&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#006600&quot;&gt;Nice title to guess on, right? ;-)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#006600&quot;&gt;Paste Search is an unspectacular PHP script that greatly enhances the usability of Konqueror (and other web browsers). To be exact, it is about the behaviour when &amp;quot;middle-clicking&amp;quot; the browser window which usually starts a google search for the content of the clipboard. This default behaviour is not bad, but sometimes I have other targets - for example bugreports on bugzilla.novell.com or in the SourceForge trackers.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#006600&quot;&gt;The solution is quite simple: Upload the following PHP script to a  webserver and configure your browser to use it as default search engine. If you paste numbers to your browser now, it will go to the bugtracker automatically (the selection depends on the bug number - up to 500000 goes to bugzilla.novell.com, everything above to the SourceForge tracker). If you paste text, you will be redirected to Google.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;?php # cbPasteSearch.php&lt;br /&gt;if (empty($_GET[&#039;q&#039;])) {&lt;br /&gt;    echo &amp;quot;Please run me with ?q=searchterm&amp;quot;;&lt;br /&gt;} else {&lt;br /&gt;    $q = trim($_GET[&#039;q&#039;]);&lt;br /&gt;    if (preg_match(&amp;quot;/^[0-9]+$/&amp;quot;, $q)) { # numeric&lt;br /&gt;        if ($q &amp;lt; 500000) { # Novell bugzilla&lt;br /&gt;            header(&amp;quot;Location: https://bugzilla.novell.com/show_bug.cgi?id=$q&amp;quot;);&lt;br /&gt;        } else { # SF tracker&lt;br /&gt;            header(&amp;quot;Location: https://sourceforge.net/support/tracker.php?aid=$q&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;    } else { # not numeric - ask Google&lt;br /&gt;            header(&amp;quot;Location: http://www.google.de/search?q=$q&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;p&gt;Natürlich kann man sich das Script nach Bedarf durch zusätzliche if-Abfragen anpassen. Vorschläge dazu nehme ich in den Kommentaren gern entgegen ;-) &lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#006600&quot;&gt;Of course you can customize the script as needed by adding additional if statements. Please add your ideas to the comment section ;-)&lt;/font&gt;&lt;br /&gt; &lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 18 Apr 2008 21:34:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/37-guid.html</guid>
    <category>browser</category>
<category>bug</category>
<category>linux</category>
<category>php</category>

</item>
<item>
    <title>Gästebuch-Spamfilter 2.0</title>
    <link>https://blog.cboltz.de/archives/20-Gaestebuch-Spamfilter-2.0.html</link>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/20-Gaestebuch-Spamfilter-2.0.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=20</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=20</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    
Auch wenn das Aufkommen an Gästebuchspam aktuell zurückgeht (im April nur noch 1/5 dessen, was zwischen November und März monatlich an Spameinträgen reinkam), wird es Zeit, dass ich mal wieder ein Update meines &lt;a href=&quot;http://blog.cboltz.de/archives/5-Gerade-zum-richtigen-Zeitpunkt....html&quot;&gt;Gästebuch-Spamfilters&lt;/a&gt; veröffentliche.&lt;p&gt;Eine reine Filterung auf &amp;quot;&amp;lt;a href=...&amp;gt;&amp;quot; und &amp;quot;[url]&amp;quot; reicht leider nicht mehr aus, aber es gibt ja noch mehr Möglichkeiten. Aktueller Stand:&lt;/p&gt;&lt;pre&gt;preg_match_all(&amp;quot;@http://@&amp;quot;, $eintrag, $http_count_tmp);&lt;br /&gt;preg_match_all(&amp;quot;@%@&amp;quot;, $www, $prozent_count_tmp);&lt;br /&gt;if (&lt;br /&gt;    preg_match ( &amp;quot;/\[URL=.*\]|&amp;lt;a[^&amp;gt;]*href|^abc123$/i&amp;quot;, trim($eintrag))&lt;br /&gt;    || ( count($http_count_tmp[0]) &amp;gt; 3 )&lt;br /&gt;    || ( $leerfeld != &amp;quot;&amp;quot; )&lt;br /&gt;    || ( ( $name == $ort ) &amp;amp;&amp;amp; ( $name != &amp;quot;&amp;quot; ) )&lt;br /&gt;    || ( count($prozent_count_tmp[0]) &amp;gt; 10 )&lt;br /&gt;) {&lt;br /&gt;    echo &amp;quot;Verp*** dich, Spammer!&amp;quot;;&lt;br /&gt;    die;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Gefiltert wird also auf folgende Kriterien:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;der Eintrag enthält &amp;quot;&amp;lt;a href=...&amp;gt;&amp;quot; oder &amp;quot;[url]&amp;quot;&lt;/li&gt;&lt;li&gt;lustigster Filter: der Eintrag lautet &amp;quot;abc123&amp;quot; - scheinbar lieben die Spammer solche Kurzeinträge ;-)&lt;/li&gt;&lt;li&gt;im Eintrag kommt mehr als dreimal &amp;quot;http://&amp;quot; vor&lt;/li&gt;&lt;li&gt;das Leerfeld (ein per CSS display:none ausgeblendetes Eingabefeld) wurde ausgefüllt&lt;/li&gt;&lt;li&gt;die Homepage mehr als 10 %-Zeichen enthält (gern verwendet bei &amp;quot;Fremdhosting&amp;quot; von Spam, aka unsichere, gecrackte Forensoftware u. ä.)&lt;/li&gt;&lt;li&gt;zwei Felder mit gleichem Eintrag&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Die aktuelle Trefferquote liegt sehr nahe an 100%. Insbesondere das Leerfeld hat mir in letzter Zeit gute Dienste geleistet, weil viele Spammer nur noch einen kurzen Text (englisch, italienisch oder in kaputtem deutsch) ohne Links eintragen.&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE 17.8.2007:&lt;/b&gt;&lt;br /&gt;Filter auf &amp;gt;10 Prozentzeichen und auf Felder mit gleichem Eintrag hinzugefügt (ist schon seit einiger Zeit im Gästebuch-Spamfilter enthalten - seitdem ist wieder Ruhe.)&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 06 May 2007 15:44:57 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/20-guid.html</guid>
    <category>php</category>
<category>regex</category>
<category>spam</category>

</item>
<item>
    <title>Typo3 und $_POST</title>
    <link>https://blog.cboltz.de/archives/12-Typo3-und-_POST.html</link>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/12-Typo3-und-_POST.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=12</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=12</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    
&lt;p&gt;Im Gästebuch der &lt;a target=&quot;_blank&quot; href=&quot;http://www.lj-rheinhessenpfalz.de&quot;&gt;Landjugend RheinhessenPfalz&lt;/a&gt; habe ich &lt;a href=&quot;http://blog.cboltz.de/archives/5-Gerade-zum-richtigen-Zeitpunkt....html&quot;&gt;ein paar Zeilen PHP-Code&lt;/a&gt; verwendet, um Gästebuch-Spam abzufangen. Das Funktionsprinzip war recht einfach: wenn der Eintrag nach Spam aussieht, setze &lt;font face=&quot;courier new,courier,monospace&quot;&gt;$_POST[&#039;firstname&#039;] = &amp;quot;&amp;quot;&lt;/font&gt;. Das Gästebuch hat dann den fehlenden Vornamen beklagt ;-) und den Eintrag zuverlässig abgewiesen.&lt;/p&gt;&lt;p&gt;Nach dem Update auf Typo3 4.0 funktioniert das so nicht mehr - scheinbar wird $_POST von Typo3 gecacht.&lt;/p&gt;&lt;p&gt;Der Einfachheit halber habe ich jetzt doch ve_guestbook gepatcht:&lt;/p&gt;&lt;pre&gt;--- pi1/class.tx_veguestbook_pi1.php_ORIG   2006-10-22 03:07:02.000000000 +0200&lt;br /&gt;+++ pi1/class.tx_veguestbook_pi1.php        2006-10-22 02:56:52.000000000 +0200&lt;br /&gt;@@ -947,6 +947,11 @@  function checkForm() {&lt;br /&gt;                        }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;+               if (!empty($this-&amp;gt;postvars[&#039;entry&#039;])) {&lt;br /&gt;+                       if (preg_match ( &amp;quot;/\[url=.*\]|&amp;lt;a[^&amp;gt;]*href/i&amp;quot;, $this-&amp;gt;postvars[&#039;entry&#039;]))&lt;br /&gt;+                           $error .= &amp;quot;&amp;lt;li&amp;gt;Bitte keinen Spam posten!&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;+               }&lt;br /&gt;+&lt;br /&gt;                if ($this-&amp;gt;config[&#039;email_validation&#039;] &amp;amp;&amp;amp; !empty($this-&amp;gt;postvars[&#039;email&#039;])) {&lt;br /&gt;&lt;br /&gt;                        if (t3lib_div::validEmail($this-&amp;gt;postvars[&#039;email&#039;]) == false) {&lt;/pre&gt;&lt;p&gt;Der Feature Request für eine offizielle &amp;quot;Eintrag Blacklist&amp;quot; Konfiguratonsoption in ve_guestbook, die ganz normal übers Typo3-Backend konfiguriert werden kann, ist übrigens auch schon beim Autor eingereicht ;-)&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE (17.11.2006)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Der Fehler lag woanders - Typo3 4.0.2 cacht ve_guestbook zu aggressiv. &lt;/p&gt;&lt;p&gt;Das führte zum Einen dazu, dass mein Hack, $_POST zu verändern, nicht mehr funktioniert hat, und zum anderen dazu, dass keine neue Gästebucheinträge akzeptiert wurden - die Bestätigungsseite wurde gechacht und der Eintragen-Code im Gästebuch wurde deshalb nicht mehr ausgeführt :-(&lt;/p&gt;&lt;p&gt;Die Lösung: Die Seite komplett vom Cachen ausschließen (nicht wirklich empfehlenswert) oder im Typoscript &lt;font face=&quot;courier new,courier,monospace&quot;&gt;plugin.tx_veguestbook_pi1 = USER_INT&lt;/font&gt; eintragen. (&lt;a target=&quot;_blank&quot; href=&quot;http://www.typo3forum.de/index.php?id=13&amp;action=list_post&amp;tid=49736&amp;page=2&quot;&gt;Quelle&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Und schon kann man wieder $_POST missbrauchen ;-)&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 23 Oct 2006 00:29:30 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/12-guid.html</guid>
    <category>php</category>
<category>spam</category>
<category>typo3</category>

</item>
<item>
    <title>Single Sign-on in phpMyAdmin aus einer anderen PHP-Session II</title>
    <link>https://blog.cboltz.de/archives/11-Single-Sign-on-in-phpMyAdmin-aus-einer-anderen-PHP-Session-II.html</link>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/11-Single-Sign-on-in-phpMyAdmin-aus-einer-anderen-PHP-Session-II.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=11</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=11</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    
&lt;p&gt;In &lt;a href=&quot;http://blog.cboltz.de/archives/7-Single-Sign-on-in-phpMyAdmin-aus-einer-anderen-PHP-Session.html&quot; target=&quot;_blank&quot;&gt;Single Sign-on in phpMyAdmin aus einer anderen PHP-Session&lt;/a&gt; habe ich erklärt, wie man mit einer bestehenden Session passwortlos zu phpMyAdmin kommt und einen entsprechden Hack für die config.inc.php gezeigt.&lt;/p&gt;&lt;p&gt;Inzwischen wurde phpMyAdmin 2.9.0-rc1 releast, in dem ein neues Authentifizierungsmoduls &amp;quot;signon&amp;quot;, basierend auf meinem Hack, enthalten ist. Zu konfigurieren ist das Ganze über ein paar Variablen in der config.inc.php:&lt;/p&gt;&lt;pre&gt;$cfg[&#039;Servers&#039;][$i][&#039;auth_type&#039;]     = &#039;signon&#039;;&lt;br /&gt;$cfg[&#039;Servers&#039;][$i][&#039;SignonURL&#039;]     = &#039;/login.php&#039;;&lt;br /&gt;$cfg[&#039;Servers&#039;][$i][&#039;LogoutURL&#039;]     = &#039;/logout.php&#039;;&lt;br /&gt;$cfg[&#039;Servers&#039;][$i][&#039;SignonSession&#039;] = &#039;PHPSESSID&#039;;&lt;/pre&gt;&lt;p&gt;
Die MySQL-Logindaten müssen natürlich in der Session hinterlegt werden. Gegenüber meinem ursprünglichen Code haben sich die Variablennamen leicht verändert. Die Session wird mit folgendem Code befüllt:&lt;/p&gt;&lt;pre&gt;$_SESSION[&#039;PMA_single_signon_user&#039;] = &amp;quot;username&amp;quot;;&lt;br /&gt;$_SESSION[&#039;PMA_single_signon_password&#039;] = &amp;quot;password&amp;quot;;&lt;br /&gt;if (!isset($_SESSION[&#039;PMA_single_signon_token&#039;])) {&lt;br /&gt;    $_SESSION[&#039;PMA_single_signon_token&#039;] = md5(uniqid(rand(), true));&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Kleine Stolperfalle: PMA_single_signon_user und PMA_single_signon_password werden beim Logout aus phpMyAdmin gelöscht. /logout.php sollte also wirklich sofort den Logout machen. Wenn man eine Abfrage &amp;quot;wirklich ausloggen?&amp;quot; hat und der User &amp;quot;nein!&amp;quot; antwortet, wird man trotzdem von phpMyAdmin ausgesperrt (oder muss PMA_single_signon_* nochmal neu setzen). Ja, ich habe das reklamiert, der phpMyAdmin-Entwickler wollte das aber nicht ändern.&lt;/p&gt;&lt;p&gt;Übrigens: PMA_single_signon_token benötigt man immer dann, wenn man direkt auf eine Unterseite von phpMyAdmin verlinken will (z. B. um einen Datensatz direkt zu bearbeiten). Im Link zu phpMyAdmin muss der Wert dann im ?token= Parameter angegeben werden.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 10 Sep 2006 23:34:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/11-guid.html</guid>
    <category>login</category>
<category>php</category>
<category>phpmyadmin</category>

</item>
<item>
    <title>Single Sign-on in phpMyAdmin aus einer anderen PHP-Session</title>
    <link>https://blog.cboltz.de/archives/7-Single-Sign-on-in-phpMyAdmin-aus-einer-anderen-PHP-Session.html</link>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/7-Single-Sign-on-in-phpMyAdmin-aus-einer-anderen-PHP-Session.html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=7</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=7</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    
&lt;p&gt;Ich habe eine Seite mit selbstgestricktem Login auf Basis von PHP-Sessions. Jetzt will ich phpMyAdmin einbinden, ohne dass man sich nochmal darin einloggen muss - schließlich sind die Leute ja schon auf meiner Seite eingeloggt.&lt;/p&gt;&lt;p&gt;Sowas schreit förmlich nach Single Sign-On. Schönes Buzzword, allerdings findet Google für phpMyAdmin recht wenig zu diesem Thema.&lt;/p&gt;&lt;p&gt;Nach einigem Trial&amp;amp;Error sowie einem Nachmittag in #phpmyadmin habe ich eine Lösung geschrieben, die nur eine Ergänzung der config.inc.php braucht, ansonsten nicht in phpMyAdmin eingreift und nichtmal das normale Login stört - ich kann also dieselbe phpMyAdmin-Instanz für Single Sign-On und Cookie-basiertes Login verwenden.&lt;/p&gt;
 &lt;a class=&quot;block_level&quot; href=&quot;https://blog.cboltz.de/archives/7-Single-Sign-on-in-phpMyAdmin-aus-einer-anderen-PHP-Session.html#extended&quot;&gt;&quot;Single Sign-on in phpMyAdmin aus einer anderen PHP-Session&quot; vollständig lesen&lt;/a&gt;
    </content:encoded>

    <pubDate>Sun, 30 Jul 2006 20:50:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/7-guid.html</guid>
    <category>login</category>
<category>php</category>
<category>phpmyadmin</category>

</item>
<item>
    <title>Gerade zum richtigen Zeitpunkt...</title>
    <link>https://blog.cboltz.de/archives/5-Gerade-zum-richtigen-Zeitpunkt....html</link>
            <category>PHP</category>
    
    <comments>https://blog.cboltz.de/archives/5-Gerade-zum-richtigen-Zeitpunkt....html#comments</comments>
    <wfw:comment>https://blog.cboltz.de/wfwcomment.php?cid=5</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://blog.cboltz.de/rss.php?version=2.0&amp;type=comments&amp;cid=5</wfw:commentRss>
    

    <author>nospam@example.com (Christian Boltz)</author>
    <content:encoded>
    
&lt;p&gt;Vor ein paar Tagen habe ich einen Spamfilter ins Gästebuch von &lt;a target=&quot;_blank&quot; href=&quot;http://www.Landjugend-Insheim.de&quot;&gt;Landjugend-Insheim.de&lt;/a&gt; eingebaut, nachdem eine Handvoll Spameinträge aufgeschlagen war.&lt;/p&gt;Weil das Gästebuch nur Plain Text-Einträge erlaubt, ist das Funktionsprinzip einfach: ich kann auf &lt;font face=&quot;courier new,courier,monospace&quot;&gt;&amp;lt;a href=...&amp;gt;&lt;/font&gt; und &lt;font face=&quot;courier new,courier,monospace&quot;&gt;[url=...]&lt;/font&gt;filtern. Die Spammer sind immer so nett, diese Tags in reichlicher Anzahl in ihre Einträge zu packen ;-)&lt;p&gt;Technisch gesehen sieht das so aus:&lt;/p&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;if ( preg_match ( &amp;quot;/\[URL=.*\]|&amp;lt;a[^&amp;gt;]*href/i&amp;quot;, $eintrag)) {&lt;br /&gt;    echo &amp;quot;Verp*** dich, Spammer!&amp;quot;;&lt;br /&gt;    die;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;p&gt;Naja, die echte Fehlermeldung ist etwas freundlicher - es könnte ja auch mal jemand einen &amp;quot;guten&amp;quot; Eintrag schreiben und auf aktiviertes HTML hoffen. Der bekommt dann natürlich nach Entfernen der Links eine zweite Chance.&lt;/p&gt;&lt;p&gt;Gestern und heute hat mir dieser Filter reichlich Arbeit gespart - innerhalb von 36 Stunden hat er mir 170 Spameinträge vom Hals gehalten...&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 09 Jul 2006 15:01:00 +0200</pubDate>
    <guid isPermaLink="false">https://blog.cboltz.de/archives/5-guid.html</guid>
    <category>landjugend</category>
<category>php</category>
<category>regex</category>
<category>spam</category>

</item>

</channel>
</rss>
