Linuchs: Unsichtbares Zeichen in Mail-Adresse

Hallo,

Habe hier eine Mailadresse, die ich mit Sylpheed nicht abschicken kann. Zu sehen ist nichts Ungewöhnliches, aber mit einem unsichtbaren Zeichen zwischen e und >:

<klaus.mann@example.de>

Wenn ich - auch jetzt im Eingabefeld - mit dem Cursor von .de nach rechts weitergehe, bleibt er vor dem > einmal hängen. Habe in meinem Editor Geany keine Möglichkeit gefunden, das Zeichen sichtbar zu machen.

Ist offenbar ein Schutz gegen Spam-Mail, aber was ist es genau?

Linuchs

  1. @@Linuchs

    Habe in meinem Editor Geany keine Möglichkeit gefunden, das Zeichen sichtbar zu machen.

    Richard Ishidas Unicode code converter kann das.

    Ist offenbar ein Schutz gegen Spam-Mail, aber was ist es genau?

    U+FEFF Byte Order Mark. Hat dort nichts zu suchen.

    LLAP 🖖

    --
    „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
    „Hat auf dem Forum herumgelungert …“
    (Wachen in Asterix 36: Der Papyrus des Cäsar)
    1. Hallo Gunnar,

      Richard Ishidas Unicode code converter kann das.

      Danke, aber offenbar ist keine Umsetzung für PHP geeignet. Habe eine Stunde den Fehler gesucht und möchte eine derartige Mail-Adressen in Listen kenntlich machen. Wie codiere ich dieses Zeichen richtig?

        $search     = array( ',', "'",      '"',      U+FEFF );
        $replace    = array( ' ', "&#039;", '\&quot', '#' );
      

      Linuchs

      1. also, da kommt ein unbekanntes Zeichen aus der Datenbank und ich habe keine Chance, es zu sehen.

        Möglicherweise "interpretiert" der Browser das Zeichen und wenn ich es "greifen" will, um es in den PHP-Code einzufügen, ist es ein anderes unsichtbares Zeichen.

        PHP-Programm erkennt es jedenfalls nicht als 0xFEFF

        Linuchs

    2. Hi,

      U+FEFF Byte Order Mark. Hat dort nichts zu suchen.

      However, if encountered elsewhere [i.e. not at start of file, Anmerkung von MudGuard] it should, according to Unicode, be treated as a "zero-width non-breaking space." (allerdings seit Unicode 3.2 deprecated -> use U+2060 Word Joiner instead ...)

      (sagt zumindest Wikipedia)

      cu,
      Andreas a/k/a MudGuard

  2. Moin!

    echo '<klaus.mann@example.de>' | sed "s/[^A-Za-Z0-9@._<>-]/#/g"
    

    macht in der Konsole sichtbar, dass ein nicht erlaubtes Zeichen da ist.

    echo '<klaus.mann@example.de>' | sed "s/[^A-Za-Z0-9@._<>-]//g"
    

    löscht es.

    <?php
    echo urlencode('<klaus.mann@example.de >');
    

    zeigt Dir auch was an...

    Jörg Reinholz

    1. Moin!

      Ich sehe jetzt, dass Du auch nach PHP fragst.

      echo '<klaus.mann@example.de>' | sed "s/[^A-Za-Z0-9@._<>-]/#/g"
      

      macht in der Konsole sichtbar, dass ein nicht erlaubtes Zeichen da ist.

      In PHP:

      <?php
      $mailTest=preg_replace('/[^A-Za-Z0-9@._<>-]/', '#', $mail);
      
      echo '<klaus.mann@example.de>' | sed "s/[^A-Za-Z0-9@._<>-]//g"
      

      löscht es.

      In PHP:

      <?php
      $mailSauber=preg_replace('/[^A-Za-Z0-9@._<>-]/', '', $mail);
      

      Jörg Reinholz

    2. Zwischenergebnis:

      echo $firma1_mailcode." [".mb_substr($row['email'], -1, 1 )."] [".bin2hex( mb_substr($row['email'], -1, 2 ))."]<br>\n";
      

      zeigt

      1.. [...@schipperchor-spieka.de] [65]
      2.. [...@gmail.com] [6d]
      3.. [...@gmx.de] [efbbbf]
      4.. [...@freeler.nl] [6c]
      

      Die 3 ist mein Problemfall. Hier bei der Eingabe "hängt" der Cursor wieder vor dem ersten ]

      Das gehört aber nicht zum UTF8 Zeichensatz?

      1. Bin inzwischen etwas konfus nach ein paar Stunden mit diesem "Geistteilchen"-Problem. Habe den falschen PHP-Code gepostet.

        falsch:

        echo $firma1_mailcode." [".mb_substr($row['email'], -1, 1 )."] [".bin2hex( mb_substr($row['email'], -1, 2 ))."]<br>\n";
        

        richtig:

        echo $firma1_mailcode." [".$row['email']."] [".bin2hex( mb_substr($row['email'], -1, 1 ))."]<br>\n";
        

        zeigt

        1.. [...@schipperchor-spieka.de] [65]
        2.. [...@gmail.com] [6d]
        3.. [...@gmx.de] [efbbbf]
        4.. [...@freeler.nl] [6c]
        
      2. @@Linuchs

        Das gehört aber nicht zum UTF8 Zeichensatz?

        Es gibt keinen UTF-8-Zeichensatz. Auch nicht ohne Deppenleerzeichen.

        LLAP 🖖

        --
        „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
        „Hat auf dem Forum herumgelungert …“
        (Wachen in Asterix 36: Der Papyrus des Cäsar)
    3. Hallo Jörg,

      <?php
      echo urlencode('<klaus.mann@example.de >');
      

      zeigt Dir auch was an...

      ... [klaus.mann%40example.de%EF%BB%BF]

      Wie zum Teufel ersetzt man das?

      $row['email']    = str_replace( 0xbbbf, '#', $row['email'] );
      

      wirkt nicht.

      1. Moin!

        Du musst einfacher denken:

        <?php
        $s='<klaus.mann@example.de%EF%BB%BF>';
        $schadhaft=urldecode($s);
        $suche=urldecode('%EF%BB%BF');
        echo str_replace($suche, '#', $schadhaft);
        

        Jörg Reinholz

        1. Moin!

          Das Problem mit den BOM haben offenbar viele. Deshalb als Skript für alle:

          <?php
          function rmBOM($str, $replacment='') {
             
              # source: https://en.wikipedia.org/wiki/Byte_order_mark
          
              $boms=array(
                  urldecode('%EF%BB%BF'),       #UTF-8
                  urldecode('%FE%FF'),          #UTF-16 (BE)
                  urldecode('%FF%FE'),          #UTF-16 (LE)
                  urldecode('00%00%FE%FF'),     #UTF-32 (BE)
                  urldecode('FF%FE%00%00'),     #UTF-32 (LE)
                  urldecode('2B%2F%76%38'),     #UTF-7
                  urldecode('2B%2F%76%39'),     #UTF-7
                  urldecode('2B%2F%76%2B'),     #UTF-7
                  urldecode('2B%2F%76%2F'),     #UTF-7
                  urldecode('2B%2F%76%38%2D'),  #UTF-7
                  urldecode('%F7%64%4C'),       #UTF-1
                  urldecode('%DD%73%66%73'),    #UTF-EBCDIC
                  urldecode('%0E%FE%FF'),       #SCSU
                  urldecode('%FB%EE%28'),       #BOCU-1
                  urldecode('%84%31%95%33')     #GB-18030
              );
              return str_replace($boms, $replacment, $str);
          }
          
          #/* Test:
          $s='<klaus.mann@example.de%EF%BB%BF>';
          $schadhaft=urldecode($s);
          
          echo 'Schadhaft: ', $schadhaft, "\n";
          echo 'Anzeige:   ', rmBOM($schadhaft, '#BOM!#'), "\n";
          echo 'Bereinigt: ', rmBOM($schadhaft),  "\n";
          #*/
          

          Jörg Reinholz

          1. Moin!

            Ich kaufe 7 "%"

            <?php
            function rmBOM($str, $replacment='') {
             # source: https://en.wikipedia.org/wiki/Byte_order_mark
             
                $boms=array(
                    urldecode('%EF%BB%BF'),       #UTF-8
                    urldecode('%FE%FF'),          #UTF-16 (BE)
                    urldecode('%FF%FE'),          #UTF-16 (LE)
                    urldecode('%00%00%FE%FF'),    #UTF-32 (BE)
                    urldecode('%FF%FE%00%00'),    #UTF-32 (LE)
                    urldecode('%2B%2F%76%38'),    #UTF-7
                    urldecode('%2B%2F%76%39'),    #UTF-7
                    urldecode('%2B%2F%76%2B'),    #UTF-7
                    urldecode('%2B%2F%76%2F'),    #UTF-7
                    urldecode('%2B%2F%76%38%2D'), #UTF-7
                    urldecode('%F7%64%4C'),       #UTF-1
                    urldecode('%DD%73%66%73'),    #UTF-EBCDIC
                    urldecode('%0E%FE%FF'),       #SCSU
                    urldecode('%FB%EE%28'),       #BOCU-1
                    urldecode('%84%31%95%33')     #GB-18030
                );
                return str_replace($boms, $replacment, $str);
            }
            
            #/* Test:
            $s='<klaus.mann@example.de%EF%BB%BF>';
            $schadhaft=urldecode($s);
            
            echo 'Schadhaft: ', $schadhaft, "\n";
            echo 'Anzeige:   ', rmBOM($schadhaft, '#BOM!#'), "\n";
            echo 'Bereinigt: ', rmBOM($schadhaft),  "\n";
            #*/
            

            Jörg Reinholz

      2. Tach!

        ... [klaus.mann%40example.de%EF%BB%BF]

        Wie zum Teufel ersetzt man das?

        Händisch im Datenbestand korrigieren? Sprich den Feldinhalt neu und ohne komische Zeichen einfügen.

        dedlfix.

        1. Händisch im Datenbestand korrigieren?

          Klar. Doch wenn dann der nächste Fall eintritt, steht irgend jemand wieder vor dem aufwändigen Problem der Fehlersuche.

          Man kann den Fehler nicht sehen und nicht hören.

          Linuchs

          1. Hallo

            Händisch im Datenbestand korrigieren?

            Klar. Doch wenn dann der nächste Fall eintritt, steht irgend jemand wieder vor dem aufwändigen Problem der Fehlersuche.

            Das ist wohl wahr.

            Man kann den Fehler nicht sehen und nicht hören.

            In diesem Thread wurden mehrere Lösungen angeboten, die den Fehler sehr wohl sicht- und behebbar machen. Wenn du sie nicht nutzt, ist das deine Sache.

            Tschö, Auge

            --
            Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
            Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
            1. In diesem Thread wurden mehrere Lösungen angeboten, die den Fehler sehr wohl sicht- und behebbar machen. Wenn du sie nicht nutzt, ist das deine Sache.

              Naja, die erste von Jörg war schon falsch:

              $mailSauber=preg_replace('/[^A-Za-Z0-9@._<>-]/', '', $mail);
              

              a-Z mochte PHP gar nicht, wahrscheinlich ist Groß Z kleiner als Klein a.

              Aber auch nach der Korrektur war's das nicht. Die anderen Lösungen sind später gekommen,muss ich noch ausprobieren, hatte inzwischen eine andere Baustelle. Mails waren ja verschickt.

              Linuchs

              1. muss ich noch ausprobieren,

                  $suche      = urldecode('%EF%BB%BF');
                  $search     = array( ',', "'",      '"',      $suche ); // "Shanty-Chor Neustadt" <vorname.nachname@provider.de!>
                  $replace    = array( ' ', "&#039;", '\&quot', '#' );
                  while( $row = mysql_fetch_array($res) )
                  {
                    // HTML so codieren, dass HTML eine gueltige Mail-Adresse weitergeben kann
                    $firma1_mailcode  = str_replace( $search, $replace, $row['firma1'] );
                    $row['email']     = str_replace( $search, $replace, $row['email'] );  // in Mail unsichtbares blank markieren
                

                Lösung von Jörg 29.01.2016 16:13 mit dem urldecode funzt. Danke

                $row['email']    = preg_replace('/[^A-Za-z0-9@._<>-]/', '#', $row['email'] );
                

                schreddert mir die Liste wegen

                <a href="mailto:Shanty-Chor xyz &lt;vorname.nachname@provider.de</a>
                

                korrekte Listen-Positionen sehen so aus:

                <a href="mailto:Vorname Nachname &lt;vnachname@provider.nl&gt;">vnachname@provider.nl</a>
                

                Was also stimmt an dem preg_replace() nicht?

                Linuchs

                1. das Problem hat mich so fusselig gemacht, dass ich schon Echtdaten poste. Sorry, ist durchgerutscht.

                  1. Aloha ;)

                    das Problem hat mich so fusselig gemacht, dass ich schon Echtdaten poste. Sorry, ist durchgerutscht.

                    Keine Ahnung ob schon vor mir jemand tätig war, ich habe aber zur Sicherheit nochmal und deutlich anonymisiert.

                    Grüße,

                    RIDER

                    --
                    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                    # Facebook # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
                2. Moin!

                  Was also stimmt an dem preg_replace() nicht?

                  Du hast den Regex auf etwas an angewendet, was nicht mit Deinen bisherigen Beschreibungen übereinstimmt.

                  Jörg Reinholz

          2. Tach!

            Händisch im Datenbestand korrigieren?

            Klar. Doch wenn dann der nächste Fall eintritt, steht irgend jemand wieder vor dem aufwändigen Problem der Fehlersuche.

            Der nächste Fall ist nach dem Zufallsprinzip anders geartet und verlangt eine andere Herangehensweise. Solange es nicht auffällt, dass es da immer wieder dasselbe Problem gibt, halte ich eine Gegenmaßnahme abseits der händischen Korrektur für zuviel investierte Zeit. Dabei wird außerdem das Gesamtsystem um den hinzugefügten Code komplexer. Und man darf auch nicht vergessen, dass diese Gegenmaßnahme an allen Einfallsstellen platziert werden muss.

            Man kann den Fehler nicht sehen und nicht hören.

            Einen x-beliebigen String durch urlencode() zu schicken, ergibt auf alle Fälle etwas auswertbares.

            dedlfix.