5 Commits

Author SHA1 Message Date
126b063e78 feat: Math-CAPTCHA (serverseitig, kein externer Dienst) – v1.5.0
- kgv_cf_generate_captcha(): Rechenaufgabe (+/-/×) mit WordPress-Transient
- kgv_cf_verify_captcha(): serverseitige Prüfung + einmaliger Token-Verbrauch
- Formular: CAPTCHA-Feld mit verstecktem Token
- Submit-Handler: Abweisung bei falscher/abgelaufener Antwort
- CSS: CAPTCHA-Feld gestylt
- Version 1.4.7 → 1.5.0
2026-04-21 22:12:20 +02:00
4e85783827 Release v1.4.7 2026-04-21 07:42:58 +02:00
7d205bfd6a release: 1.4.6 2026-04-20 23:00:42 +02:00
51e9bcc564 Release 1.4.5 2026-04-18 10:10:28 +02:00
76b6677a61 fix: Button-CSS im KGV Contact Form korrigiert 2026-04-18 10:06:50 +02:00
5 changed files with 96 additions and 6 deletions

0
.gitignore vendored Normal file → Executable file
View File

View File

@@ -3,7 +3,7 @@ Contributors: ronnygrobel
Tags: contact form, kontaktformular, vereinswebseite, kategorien, datenschutz
Requires at least: 6.0
Tested up to: 6.8
Stable tag: 1.4.4
Stable tag: 1.4.7
Requires PHP: 7.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -42,6 +42,10 @@ Ja, pro Kategorie koennen mehrere E-Mail-Adressen hinterlegt werden.
== Changelog ==
= 1.4.6 =
* Release 1.4.6 erstellt.
* Versionsnummer in Plugin-Datei und Readme erhoeht.
= 1.4.4 =
* Versionsabgleich zwischen Plugin-Header, Code und Readme.
* WordPress-Readme-Format weiter vereinheitlicht.

View File

@@ -23,9 +23,26 @@
.kgv-contact-form textarea:focus{outline:none;border-color:#2271b1;box-shadow:0 0 0 3px rgba(34,113,177,.12)}
.kgv-cf-privacy{margin:8px 0 18px;font-size:.95rem;line-height:1.5}
.kgv-cf-privacy label{display:flex;gap:10px;align-items:flex-start}
.kgv-contact-form button{appearance:none;border:none;border-radius:10px;padding:12px 18px;font-weight:700;cursor:pointer;background:#2271b1;color:#fff}
.kgv-contact-form button{
display: inline-flex;
align-items: center;
justify-content: center;
padding: 8px 12px;
min-height: 38px;
border-radius: 5px;
text-decoration: none;
background: var(--kgv-accent,#1f6f4a);
color: #fff;
font-weight: 700;
line-height: 1.2;}
.kgv-cf-alert{max-width:760px;margin:0 0 16px;padding:12px 14px;border-radius:12px}
.kgv-cf-alert-success{border:1px solid #c6e1c6;background:#ecf7ed}
.kgv-cf-alert-error{border:1px solid #e5b3b3;background:#fff2f2}
.kgv-cf-hp{position:absolute !important;left:-9999px !important;opacity:0 !important;pointer-events:none !important}
.kgv-cf-captcha label{font-weight:600;margin-bottom:8px;display:block}
.kgv-cf-captcha input[type="text"]{max-width:120px}
@media (max-width:700px){.kgv-cf-grid{grid-template-columns:1fr}.kgv-contact-form{padding:18px;border-radius:14px}}

View File

@@ -2,10 +2,10 @@
/**
* Plugin Name: KGV Kontakt Form
* Description: Kontaktformular mit Nachrichtenbereich, Kategorien, Routing je Kategorie, Datenschutz-Checkbox, gelesen/ungelesen, Mehrfach-E-Mail und Rollenfreigabe für Kontaktanfragen.
* Version: 1.4.4
* Version: 1.5.0
* Author: Ronny Grobel
* Author URI: https://apex-project.de/
* Plugin URI: https://apex-project.de/
* Plugin URI: https://wordpress.apex-project.de/
* Update URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Contact-Form
* Gitea Plugin URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Contact-Form
* Requires Plugins: KGV-Updater
@@ -13,7 +13,7 @@
if (!defined('ABSPATH')) exit;
define('KGV_CF_VERSION', '1.4.4');
define('KGV_CF_VERSION', '1.5.0');
define('KGV_CF_VIEW_CAP', 'kgv_view_contact_requests');
define('KGV_CF_MANAGE_CAP', 'manage_options');
@@ -110,6 +110,55 @@ function kgv_cf_run_schema_update() {
}
}
// --- CAPTCHA (serverseitig, kein externer Dienst) ---
function kgv_cf_generate_captcha() {
$a = wp_rand(1, 12);
$b = wp_rand(1, 12);
$ops = ['+', '-', '×'];
$op = $ops[array_rand($ops)];
switch ($op) {
case '-':
if ($b > $a) { [$a, $b] = [$b, $a]; }
$answer = $a - $b;
break;
case '×':
$a = wp_rand(1, 9);
$b = wp_rand(1, 9);
$answer = $a * $b;
break;
default:
$answer = $a + $b;
}
$token = bin2hex(random_bytes(16));
set_transient('kgv_cf_cap_' . $token, (string) $answer, HOUR_IN_SECONDS);
return [
'token' => $token,
'question' => sprintf('Sicherheitsfrage: Wie viel ist %d %s %d?', $a, $op, $b),
];
}
function kgv_cf_verify_captcha($token, $given) {
if (empty($token) || !ctype_xdigit($token) || strlen($token) !== 32) {
return false;
}
$key = 'kgv_cf_cap_' . sanitize_text_field($token);
$stored = get_transient($key);
delete_transient($key);
if ($stored === false) {
return false;
}
return trim((string) $given) === $stored;
}
// --- Ende CAPTCHA ---
function kgv_cf_enqueue_assets() {
wp_enqueue_style(
'kgv-contact-form-style',
@@ -336,6 +385,15 @@ function kgv_cf_render_form() {
<input type="text" name="kgv_hp" value="" autocomplete="off" tabindex="-1" class="kgv-cf-hp">
<?php
$captcha = kgv_cf_generate_captcha();
?>
<p class="kgv-cf-field kgv-cf-captcha">
<label for="kgv_captcha_answer"><?php echo esc_html($captcha['question']); ?> *</label>
<input type="text" id="kgv_captcha_answer" name="kgv_captcha_answer" inputmode="numeric" pattern="-?[0-9]+" autocomplete="off" required>
<input type="hidden" name="kgv_captcha_token" value="<?php echo esc_attr($captcha['token']); ?>">
</p>
<?php wp_nonce_field('kgv_contact_form_submit', 'kgv_nonce'); ?>
<p class="kgv-cf-submit">
@@ -360,6 +418,13 @@ function kgv_cf_handle_form_submit() {
return;
}
$captcha_token = isset($_POST['kgv_captcha_token']) ? sanitize_text_field(wp_unslash($_POST['kgv_captcha_token'])) : '';
$captcha_answer = isset($_POST['kgv_captcha_answer']) ? sanitize_text_field(wp_unslash($_POST['kgv_captcha_answer'])) : '';
if (!kgv_cf_verify_captcha($captcha_token, $captcha_answer)) {
kgv_cf_redirect_with_flag('kgv_error', '1');
}
$name = sanitize_text_field($_POST['kgv_name'] ?? '');
$email = sanitize_email($_POST['kgv_email'] ?? '');
$category_id = absint($_POST['kgv_category'] ?? 0);

6
readme.txt Normal file → Executable file
View File

@@ -3,7 +3,7 @@ Contributors: ronnygrobel
Tags: contact form, kontaktformular, vereinswebseite, kategorien, datenschutz
Requires at least: 6.0
Tested up to: 6.8
Stable tag: 1.4.4
Stable tag: 1.5.0
Requires PHP: 7.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -42,6 +42,10 @@ Ja, pro Kategorie koennen mehrere E-Mail-Adressen hinterlegt werden.
== Changelog ==
= 1.4.6 =
* Release 1.4.6 erstellt.
* Versionsnummer in Plugin-Datei und Readme erhoeht.
= 1.4.4 =
* Versionsabgleich zwischen Plugin-Header, Code und Readme.
* WordPress-Readme-Format weiter vereinheitlicht.