Daten im Impressum schützen

Um deine E-Mail-Adresse und Telefonnummer im Impressum vor Spambots zu schützen, gibt es verschiedene Möglichkeiten.

Step 1:

mit CSS die E-Mail-Adresse umdrehen.

span.reverse { unicode-bidi:bidi-override; direction: rtl; }

Somit wird aus:

moc.elpmaxe@olleh

wieder:

hello@example.com

Step 2:

Der Laravel Weg:

namespace App\Helpers;

use Illuminate\Support\HtmlString;

class Mask
{
    public function email($email, $name = null)
    {
        $name = $this->obfuscate($name ?: $email);
        $email = $this->obfuscate('mailto:' . $email);
        return new HtmlString('<a href="' . $email . '">' . $name . '</a>');
    }

    private function obfuscate($str)
    {
        $safe = '';
        foreach (str_split($str) as $char) {
            if (ord($char) > 128) {
                return $char;
            }
            switch (rand(1, 3)) {
                case 1:    // decimal
                    $safe .= '&#' . ord($char) . ';';
                    break;
                case 2:    // hexadecimal
                    $safe .= '&#x' . dechex(ord($char)) . ';';
                    break;
                case 3:
                    $safe .= $char;
            }
        }
        return $safe;
    }
}

Beides kann man jetzt ganz gut kombinieren. Unter Next.js verwende ich es so:

function Email(email = "hello@example.com") {
  return Obfuscate(email).replace('@', '&#64;');
}

function Obfuscate(value) {
  let safe = '';

  // Convert string to array, reverse it, then process each letter
  for (let letter of [...value].reverse()) {
    // Check if the character is outside the ASCII range
    if (letter.charCodeAt(0) > 128) {
      safe += letter;
      continue;
    }

    // Random choice of obfuscation format
    const choice = Math.floor(Math.random() * 3) + 1;
    switch (choice) {
      case 1:
        safe += `&#${letter.charCodeAt(0)};`;
        break;
      case 2:
        safe += `&#x${letter.charCodeAt(0).toString(16)};`;
        break;
      case 3:
        safe += letter;
        break;
    }
  }

  return safe;
}

function ProtectedMail() {
  return (
    <span style={{ unicodeBidi: 'bidi-override', direction: 'rtl' }} dangerouslySetInnerHTML={{ __html: Email() }} />
  );
}

Weitere Infos und Möglichkeiten gibt es auch hier.