<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://guide.falk.plus/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://guide.falk.plus/feed.php">
        <title>Best Practice Guide - gitea_code:jtl-shop-altcha-spamschutz</title>
        <description></description>
        <link>https://guide.falk.plus/</link>
        <image rdf:resource="https://guide.falk.plus/lib/exe/fetch.php?media=wiki:logo.png" />
       <dc:date>2026-09-22T09:36:09+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:info_xml&amp;rev=1790007398&amp;do=diff"/>
                <rdf:li rdf:resource="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:templatehandler_php&amp;rev=1790000171&amp;do=diff"/>
                <rdf:li rdf:resource="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:bootstrap_php&amp;rev=1789999946&amp;do=diff"/>
                <rdf:li rdf:resource="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:fp-altcha_js&amp;rev=1789998030&amp;do=diff"/>
                <rdf:li rdf:resource="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:validationhandler_php&amp;rev=1789997973&amp;do=diff"/>
                <rdf:li rdf:resource="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:altchaservice_php&amp;rev=1789997860&amp;do=diff"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://guide.falk.plus/lib/exe/fetch.php?media=wiki:logo.png">
        <title>Best Practice Guide</title>
        <link>https://guide.falk.plus/</link>
        <url>https://guide.falk.plus/lib/exe/fetch.php?media=wiki:logo.png</url>
    </image>
    <item rdf:about="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:info_xml&amp;rev=1790007398&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-09-21T16:16:38+00:00</dc:date>
        <dc:creator>jf (jf@undisclosed.example.com)</dc:creator>
        <title> - Fix: ExsID entfernt (loeste Lizenzpruefung aus)</title>
        <link>https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:info_xml&amp;rev=1790007398&amp;do=diff</link>
        <description>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jtlshopplugin&gt;
    &lt;Name&gt;ALTCHA Spamschutz&lt;/Name&gt;
    &lt;Description&gt;Selbst gehosteter, quelloffener Spamschutz auf Basis des ALTCHA Proof-of-Work-Verfahrens (MIT-Lizenz). Schuetzt Registrierung und Newsletter-Anmeldung ohne Datenweitergabe an Dritte -- bewusst ohne Google reCAPTCHA und ohne Umleitung ueber Cloudflare oder aehnliche Dienste. Fuer beliebige JTL-Shop-5-Installationen geeignet.&lt;/Description&gt;
    &lt;Author&gt;falk.plus&lt;/Author&gt;
    &lt;URL&gt;https://falk.…</description>
    </item>
    <item rdf:about="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:templatehandler_php&amp;rev=1790000171&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-09-21T14:16:11+00:00</dc:date>
        <dc:creator>jf (jf@undisclosed.example.com)</dc:creator>
        <title> - Anonymisierung: Plugin-Name entfernt</title>
        <link>https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:templatehandler_php&amp;rev=1790000171&amp;do=diff</link>
        <description>&lt;?php

declare(strict_types=1);

namespace Plugin\fp_altcha_spamschutz\src\Handler;

use JTL\phpQuery\phpQueryObject;
use JTL\Plugin\PluginInterface;
use JTL\Smarty\JTLSmarty;
use Plugin\fp_altcha_spamschutz\src\Service\AltchaService;

/**
 * Fuegt das ALTCHA-Widget (Container + Skript) in Registrierungs- und Newsletter-Formular ein.
 * Wird ueber HOOK_SMARTY_OUTPUTFILTER aufgerufen, also nach dem Rendern der Seite, auf dem
 * fertigen HTML-Dokument (phpQuery, jQuery-aehnliche PHP-DOM-API).
 */
…</description>
    </item>
    <item rdf:about="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:bootstrap_php&amp;rev=1789999946&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-09-21T14:12:26+00:00</dc:date>
        <dc:creator>jf (jf@undisclosed.example.com)</dc:creator>
        <title> - Anonymisierung + reCAPTCHA/Cloudflare-Hinweis</title>
        <link>https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:bootstrap_php&amp;rev=1789999946&amp;do=diff</link>
        <description>&lt;?php

declare(strict_types=1);

namespace Plugin\fp_altcha_spamschutz;

use JTL\Events\Dispatcher;
use JTL\Plugin\Bootstrapper;
use JTL\Plugin\PluginInterface;
use JTL\Shop;
use Plugin\fp_altcha_spamschutz\src\Handler\TemplateHandler;
use Plugin\fp_altcha_spamschutz\src\Handler\ValidationHandler;
use Plugin\fp_altcha_spamschutz\src\Service\AltchaService;

require_once __DIR__ . &#039;/src/Vendor/AltchaOrg/Altcha/V1/Hasher/HasherInterface.php&#039;;
require_once __DIR__ . &#039;/src/Vendor/AltchaOrg/Altcha/V1/…</description>
    </item>
    <item rdf:about="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:fp-altcha_js&amp;rev=1789998030&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-09-21T13:40:30+00:00</dc:date>
        <dc:creator>jf (jf@undisclosed.example.com)</dc:creator>
        <title> - fp-altcha.js Mirror aus Gitea anlegen</title>
        <link>https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:fp-altcha_js&amp;rev=1789998030&amp;do=diff</link>
        <description>/*!
 * fp-altcha.js -- kleiner, eigenstaendiger Loeser fuer das klassische ALTCHA V1
 * Proof-of-Work-Verfahren (SHA-256 Hashcash-Stil).
 *
 * Sucht fuer eine vom Server vorgegebene Aufgabe {algorithm, challenge, salt, maxnumber, signature}
 * eine Zahl n mit 0 &lt;= n &lt;= maxnumber, fuer die SHA-256(salt + n) == challenge gilt, und traegt das
 * Ergebnis base64-kodiert in ein verstecktes Formularfeld &quot;altcha&quot; ein. Die Verifikation auf dem
 * Server erfolgt mit der offiziellen ALTCHA-PHP-Bibliothek …</description>
    </item>
    <item rdf:about="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:validationhandler_php&amp;rev=1789997973&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-09-21T13:39:33+00:00</dc:date>
        <dc:creator>jf (jf@undisclosed.example.com)</dc:creator>
        <title> - ValidationHandler.php Mirror aus Gitea anlegen</title>
        <link>https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:validationhandler_php&amp;rev=1789997973&amp;do=diff</link>
        <description>&lt;?php

declare(strict_types=1);

namespace Plugin\fp_altcha_spamschutz\src\Handler;

use Plugin\fp_altcha_spamschutz\src\Service\AltchaService;

/**
 * Prueft die ALTCHA-Loesung bei Registrierung und Newsletter-Anmeldung.
 *
 * Registrierung: nutzt den dokumentierten Hook HOOK_REGISTRIEREN_PAGE_REGISTRIEREN_PLAUSI (41),
 * der genau fuer diesen Zweck (Plausibilitaetspruefung nach Formularabsendung) vorgesehen ist.
 * Bei fehlender/ungueltiger Pruefung wird ein Eintrag zu &quot;fehlendeAngaben&quot; hinzug…</description>
    </item>
    <item rdf:about="https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:altchaservice_php&amp;rev=1789997860&amp;do=diff">
        <dc:format>text/html</dc:format>
        <dc:date>2026-09-21T13:37:40+00:00</dc:date>
        <dc:creator>jf (jf@undisclosed.example.com)</dc:creator>
        <title> - AltchaService.php Mirror aus Gitea anlegen</title>
        <link>https://guide.falk.plus/doku.php?id=gitea_code:jtl-shop-altcha-spamschutz:altchaservice_php&amp;rev=1789997860&amp;do=diff</link>
        <description>&lt;?php

declare(strict_types=1);

namespace Plugin\fp_altcha_spamschutz\src\Service;

use AltchaOrg\Altcha\V1\Altcha;
use AltchaOrg\Altcha\V1\ChallengeOptions;
use AltchaOrg\Altcha\V1\Hasher\Algorithm;
use JTL\Plugin\PluginInterface;

/**
 * Kapselt die ALTCHA V1 Proof-of-Work Bibliothek (MIT-Lizenz, https://github.com/altcha-org/altcha-lib-php).
 *
 * Warum V1 statt der aktuellen ALTCHA-Widget-Version (v3)?
 * Das offizielle JS-Widget v3 nutzt ein neueres, komplexeres Protokoll (PBKDF2/Argon2id/…</description>
    </item>
</rdf:RDF>
