WBCE CMS – Way Better Content Editing.
You are not logged in.
Hallo,
ich habe testweise in einem Mailfeld folgende Adresse eingegeben
sey+/@online.de
Diese Eingabe wurde akzeptiert
Erst der Ersatz der function in der class.wb.php durch
[== PHP ==]
public function validate_email(string $email): bool
{
if (empty($email)) {
return false;
}
if (function_exists('idn_to_ascii')) {
// Use internal if available.
// See: https://www.php.net/manual/en/function.idn-to-ascii.php
$email = idn_to_ascii($email);
} else {
require_once WB_PATH . '/include/idna_convert/idna_convert.class.php';
$IDN = new idna_convert();
$email = $IDN->encode($email);
unset($IDN);
}
// regex from NorHei 2011-01-11
$retval = preg_match("/^((([!#$%&'*+\\-\/\=?^_`{|}~\w])|([!#$%&'*+\\-\/\=?^_`{|}~\w][!#$%&'*+\\-\/\=?^_`{|}~\.\w]{0,}[!#$%&'*+\\-\/\=?^_`{|}~\w]))[@]\w+(([-.]|\-\-)\w+)*\.\w+(([-.]|\-\-)\w+)*)$/", $email);
return ($retval != false);
}Quellenangabe zum code:
https://forum.wbce.org/viewtopic.php?id=5849
Könnte dies evtl. in der WBCEUP.zip, Version 1.6.8, auch geändert werden?
Gruß
Heinz
Last edited by bbs2 (24.06.2026 10:54:58)
Offline
Hallo,
ergänzende Feststellung
Mit dem code aus dem vorigen Beitrag wird die Mailadresse
sey/@online.de
akzeptiert.
Die Adresse
sey&@online.de
wird richtigerweise jedoch als fehlerhaft reklamiert.
Gruß
Heinz
Offline
Der Internet-Standard RFC 2822 legt fest, aus welchen Buchstaben, Zahlen und Sonderzeichen die Adresse bestehen darf: A-Z, a-z, 0-9 sowie .!#$%&'*+-/=?^_`{|}~
Wir Benötigen: Cents, Euros... jetzt spenden!
Offline
Hallo Florian,
dies ist bzgl. des internationalen Standards richtig.
Viele Provider erlauben jedoch alle diese Zeichen nicht.
Deshalb will ich eine Validitätsprüfung realisieren, die restriktiver ist als
[== PHP ==]
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;Hier als Beispiel die Regel von Strato für Mailadressen
"Erlaubt sind Ziffern und Buchstaben ohne Sonderzeichen und ohne Umlaute sowie Minus (-), Unterstrich (_) und Punkt (.). Punkte dürfen weder am Anfang noch am Ende der Adresse noch aufeinander folgend eingesetzt werden."
Aktuell wird in mpform bei der Prüfung z.B: auch + (pluszeichen) im local-part akzeptiert
Zudem führt die Mailadresse müller@online.de zur Ablehnung und danach in dem
Mailfeld zu folgenden Inhalt:
müller<span>@</span>online<span>.</span>de
Lösung:
Ich werde die Prüfung in class.wb.php im Original belassen und
in der evalform.php in mpform eine zusätzliche, restriktivere Prüfung
ergänzen.
Nachteil, bei einem update von mpform wird diese file überschrieben
Vielleicht sollte deshalb die Prüfung in die private.php integriert werden.
Die Prüfung basiert auf den zulässigen Zeichen in Mailadressen bei
IONOS, 1und1, web.de, gmx.deergänzt um die Zulässigkeit des Zeichens + im local-part.
Dies sieht so aus
[== PHP ==]
if ($field['type'] == 'email') {
$v = $post_field;
$pattern = '/^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
if (!preg_match($pattern,$v)) {
// only allow valid chars
$err_txt[$field_id] = 'Unzulässige Zeichen in der Mailadresse';
$fer[]=$field_id;
}
}Gruß
Heinz
Last edited by bbs2 (26.06.2026 14:58:52)
Offline
Hallo,
ich habe noch einmal die Validitätsprüfungen bei Mailadressen mit 2 Methoden getestet:
1. Standardprüfung nur mit class.wb.php, also ohne Veränderungen in der evalform.php
und
2. mit ergänztem PHP-Code in der evalform.php in mpform wie oben in meinem Beitrag vom 24.06.26 angegeben.
Grundsätzlich funktionieren beide. Jedoch führen bestimmte Mailadressen bei beiden
Validierungsmethoden zu verwirrenden Anzeigen bei Eingabe einer unzulässigen Mailadresse:
1. Eingabe von müller@t-online.de
2. Beanstandung der Eingabe mit der Rückgabe der Mailadresse
müller<span>@</span>t-online<span>.</span>de
Siehe screenshot "Beanstandung der Mailadresse" in der Anlage.
Woran kann der response liegen?
Systemhinweise:
Der Fehler tritt auch nach der Installation des mpform-updates vom 26.06.26 auf.
WBCE 1.6.8
PHP 8.4.22
Danke
Heinz
Offline
Re: Unzureichende Validitätsprüfung bei der Mailadresse
Hallo Heinz,
das Verhalten mit der Umwandlung von @ und . war tatsächlich ein Bug im Zusammenspiel mit dem Output-Filter. Der eingegebene Wert wurde beim Zurückschreiben ins Formular nicht gegen die Obfuskierung des Output-Filters geschützt.
Das ist in Version 1.3.47 behoben — bitte aktualisieren.
-> https://forum.wbce.org/viewtopic.php?pid=48256#p48256
Gruß
Slugger
Hoster: ALL-INKL *** Grundsätzliche WBCE Konfig ***
WBCE: 1.6.5 • BE: 2.1.0 • PHP: 8.x * Alle • BE: Argos
Status Projekt 1-4: OK
Online
florian
Danke,
du hast mich befreit. Ich habe tagelang den Fehler gesucht.
Nach Installation der neuen Version 1.3.47 läuft alles
einwandfrei
Viele Grüße
Heinz
Offline
Slugger
Hallo,
da standardmäßig in mpform eine Mail-Adressen-Validitätsprüfung nach internationalen Regeln erfolgt,
jedoch fast alle Provider in Deutschland wesentlich strictere Regeln haben (z.B. Umlaute sind nicht erlaubt),
habe ich in mpform in der privat.php eine strengere Validitätsprüfung aufgenommen:
[== PHP ==]
if (($field_id == 12)or($field_id == 34)or($field_id == 50)or($field_id == 68)or($field_id == 56)or($field_id == 113)or($field_id == 356)) {
$v = $post_field;
$meldung="";
if (!empty($v)) {
$pattern1 = '/^[a-zA-Z0-9._-]+$/';
$pattern2 = '/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
$pos = strpos($v,'@') ;
if ($pos !== false) {
$local = substr($v,0,$pos);
$domain= substr($v,$pos+1,null);
if (!preg_match($pattern1,$local)) {
$meldung = 'Zeichenfehler vor @: '.$local."<br>";
}
if (!preg_match($pattern2,$domain)) {
$meldung = $meldung.'Zeichenfehler nach @: '.$domain;
}
return $meldung;
} else {
return '@ fehlt in der Mailadresse';
}
}
}Erlaubt sind in obiger Prüfung lediglich Buchstaben ohne Umlaute, Zahlen und der Punkt (.) sowie die Sonderzeichen _-
Eine Prüfung der zugelassenen Längen erfolgt nicht, kann natürlich ergänzt werden.
Leider ist es mir nicht gelungen statt
[== PHP ==]
if (($field_id == 12)or($field_id == 34)or($field_id == 50)or($field_id == 68)or($field_id == 56)or($field_id == 113)or($field_id == 356)) {in der privat.php die Abfrage
[== PHP ==]
if ($field['type'] == 'mail') {zu verwenden ohne die evalform.php zu verändern.
Viele Grüße
Heinz
Offline
Hm ...
Hast Du Deine Prüfung in der "private.php" unter der Funktion "private_function_for_field" geschrieben?
Da könntest Du zu der $field_id Dir den "type" holen:
z.B.
function private_function_for_field(
$field_id,
$post_field
) {
global $database;
$fieldType = $database->get_one("SELECT `type` FROM `{TP}mod_mpform_fields` WHERE `field_id` = ".$field_id);
if ($fieldType === "email") // [sic!]
{
// test-stuff here!
}Dann fällt das //unsägliche// "id_abfragen" weg ... und Du könntest die "eval" unangetastet lassen ...
hope it helps
Gruß
Kant
Last edited by kant (09.07.2026 00:36:17)
Sapere aude!
Offline
Super , vielen Dank.
das funktioniert jetzt.
1. Evalform bleibt unverändert. Upgrades von mpform berühren die private Mail-Adressen-Prüfung nicht
2. Alle Formulare, auch zukünftige, unterliegen der Mailprüfung in der private.php
3. Jeder kann einfach seine individuelle Adressenprüfung realisieren. Weitere Bedingungen, wie z.B. der verbotene Punkt am Anfang
der Adresse, kann auch noch ergänzt werden.
4. Die Fehlermeldungen zeigen konkreter auf den Fehler hin (Fehlereingrenzung)
5. Fehlermeldetext kann individualisiert werden.
Hier noch einmal den Code in der Private.php, in die Funktion
function private_function_for_field($field_id,$post_field)
integriert werden muss:
[== PHP ==]
global $database;
$fieldType = $database->get_one("SELECT `type` FROM `{TP}mod_mpform_fields` WHERE `field_id` = ".$field_id);
if ($fieldType === "email") // [sic!]
{
$v = $post_field;
$meldung="";
if (!empty($v)) {
$pattern1 = '/^[a-zA-Z0-9._+-]+$/';
$pattern2 = '/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
// $pattern = '/^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
$pos = strpos($v,'@') ;
if ($pos !== false) {
$local = substr($v,0,$pos);
$domain= substr($v,$pos+1,null);
if (!preg_match($pattern1,$local)) {
$meldung = 'Zeichenfehler vor @: '.$local."<br>";
}
if (!preg_match($pattern2,$domain)) {
$meldung = $meldung.'Zeichenfehler nach @: '.$domain;
}
return $meldung;
} else {
return '@ fehlt in der Mailadresse';}
} }
Last edited by bbs2 (09.07.2026 12:33:59)
Offline
Hallo - ich noch mal ;-)
kannst Du bitte bei Dir mit dem Source "aldus1501@"
also "nur_local und @ aber kein_tld/domain" kurz nachprüfen?
Ich vermute da schlummert noch ein //Biest// im Core ;-(
Danke und Gruß
Kant
Sapere aude!
Offline
Hallo,
die Prüfung läuft auch in diesem Fall bei unverändertem Code tadellos. Siehe Bild.
Allerdings sollte die Meldung hierzu aussagekräftiger sein.
Mit der Einfügung
$local = substr($v,0,$pos);
$domain= substr($v,$pos+1,null);
if (strlen($local) == 0) {
return 'Der locale Teil der Mailadresse fehlt vollständig';}
if (strlen($domain)==0) {
return 'Die Domain fehlt vollständig';}
wird die Fehlermeldung konkreter
Gruß
Heinz
Offline
Hm ... dann hab ich hier wohl local einen bock :-(
2026-07-09T21:11:44+00:00 [Visitor Request] http://localhost:8888/projekte/wbce_168/wbce/pages/tests/mpform.php
2026-07-09T21:11:44+00:00 [Exception] There was an unknown exception: idn_to_ascii(): Argument #1 ($domain) must not be empty in line (642) of /framework/class.wb.php"idn_to_ascii" kann mit einem //leeren// domain-str hier nicht umgehen ... Ergebnis ist eine weiße Seite - vor dem "private"-Test(-s) ...
Ich schieb es mal auf meine lokalen //frickeleien// hier ;-) (PHP 8.4 - MAMP - WBCE 1.6.8 [GiT])
Danke für's ausprobieren und schönen Abend noch
Kant
Last edited by kant (09.07.2026 23:24:50)
Sapere aude!
Offline
Weitere Tests waren erfolgreich.
Aktuell wurden alle Syntaxfehler in der Adresse herausgefiltert
Die weiße Seite vor Ausführung der private.php bei dir hat wohl andere Ursachen,
da der leere String erst innerhalb der private.php entsteht:
[== PHP ==]
$local = substr($v,0,$pos);
$domain= substr($v,$pos+1,null);
if (empty($local)) {
return 'Der lokale Teil (vor @) der Mailadresse fehlt vollständig';}
if (empty($domain)) {
return 'Die Domain fehlt vollständig';}Offline