【问题标题】:Looking for a php only email address obfuscator function寻找一个只有 php 的电子邮件地址混淆器功能
【发布时间】:2012-09-17 12:37:39
【问题描述】:

是否有 php 专用的电子邮件地址混淆器功能?在网上找到的大多数是 JS 和 PHP 的混合体。

【问题讨论】:

  • 您的意思是在将真实电子邮件地址发送给您之前需要填写验证码? ;)

标签: php email obfuscation


【解决方案1】:

这是我使用的几个函数。

第一个使用 html 字符代码混淆电子邮件地址:

function getObfuscatedEmailAddress($email)
{
    $alwaysEncode = array('.', ':', '@');

    $result = '';

    // Encode string using oct and hex character codes
    for ($i = 0; $i < strlen($email); $i++) {
        // Encode 25% of characters including several that always should be encoded
        if (in_array($email[$i], $alwaysEncode) || mt_rand(1, 100) < 25) {
            if (mt_rand(0, 1)) {
                $result .= '&#' . ord($email[$i]) . ';';
            } else {
                $result .= '&#x' . dechex(ord($email[$i])) . ';';
            }
        } else {
            $result .= $email[$i];
        }
    }

    return $result;
}

例子:

echo getObfuscatedEmailAddress('firstname.last-name@example.com');
-->
firstn&#x61;m&#x65;&#x2e;la&#115;t-name&#x40;examp&#108;e&#46;&#x63;om

第二个将返回电子邮件地址为 html 和 url 编码的链接:

function getObfuscatedEmailLink($email, $params = array())
{
    if (!is_array($params)) {
        $params = array();
    }

    // Tell search engines to ignore obfuscated uri
    if (!isset($params['rel'])) {
        $params['rel'] = 'nofollow';
    }

    $neverEncode = array('.', '@', '+'); // Don't encode those as not fully supported by IE & Chrome

    $urlEncodedEmail = '';
    for ($i = 0; $i < strlen($email); $i++) {
        // Encode 25% of characters
        if (!in_array($email[$i], $neverEncode) && mt_rand(1, 100) < 25) {
            $charCode = ord($email[$i]);
            $urlEncodedEmail .= '%';
            $urlEncodedEmail .= dechex(($charCode >> 4) & 0xF);
            $urlEncodedEmail .= dechex($charCode & 0xF);
        } else {
            $urlEncodedEmail .= $email[$i];
        }
    }

    $obfuscatedEmail = getObfuscatedEmailAddress($email);
    $obfuscatedEmailUrl = getObfuscatedEmailAddress('mailto:' . $urlEncodedEmail);

    $link = '<a href="' . $obfuscatedEmailUrl . '"';
    foreach ($params as $param => $value) {
        $link .= ' ' . $param . '="' . htmlspecialchars($value). '"';
    }
    $link .= '>' . $obfuscatedEmail . '</a>';

    return $link;
}

例子:

echo getObfuscatedEmailLink('firstname.last-name@example.com');
-->
<a href="mailt&#111;&#58;%66i&#37;72stna%&#54;d&#x65;&#46;&#37;6c&#x25;6&#x31;st&#x2d;name&#64;&#101;&#x78;&#x61;mple&#46;co&#109;" rel="nofollow">f&#x69;&#114;s&#x74;na&#109;e&#x2e;&#108;a&#x73;t-name&#64;e&#x78;ample&#46;co&#109;</a>

【讨论】:

  • 有趣的方法+1。但它可能存在一些兼容性问题。
  • 我没有在 Safari 和移动浏览器中测试过。 FF、IE、Chrome都不错。
  • 我喜欢这种方法。会试一试,看看我是否收到任何垃圾邮件。
【解决方案2】:

我的最爱:

标记 + PHP

<span class="rev"><?php echo strrev($email); ?> </span>

CSS

.rev{
    direction: rtl;
    unicode-bidi: bidi-override;
}

Fiddle

【讨论】:

  • 太棒了!知道复制/粘贴电子邮件时这是如何保持的吗?
  • @AakilFernandes 看小提琴:((
  • 请注意,这种方法太简单了逆向工程if (email.indexOf('.') &lt; email.indexOf('@')) email.reverse()
  • 可访问性如何?
  • @AakilFernandes moc.elpmaxe@olleh - 所以它不适合复制数据。
【解决方案3】:

这是另外一种方法,它非常严格并且不会导致https://validator.w3.org 出错

function obfuscate($email){
$encoded_email = '';
for ($a = 0,$b = strlen($email);$a < $b;$a++)
{
    $encoded_email .= '&#'.(mt_rand(0,1) == 0  ? 'x'.dechex(ord($email[$a])) : ord($email[$a])) . ';';
}
return $encoded_email;}

然后添加到页面使用:

<a href="mailto:<?= obfuscate(CONTACT_EMAIL.'?subject=Hello!') ?>"><?= CONTACT_EMAIL ?></a>

【讨论】:

    【解决方案4】:

    这里有一个 PHP 7 类型提示。

    只需使用$this-&gt;obfuscateEmail($email); 调用它

    /**
     * @param string $email
     * @return string
     */
    private function obfuscateEmail(string $email) : string
    {
        $em   = explode("@", $email);
        $name = implode(array_slice($em, 0, count($em) - 1), '@');
        $len  = floor(strlen($name) / 2);
    
        return substr($name, 0, $len) . str_repeat('*', $len) . "@" . end($em);
    }
    

    【讨论】:

      【解决方案5】:

      如果主机之前有一个字符,这是另一种方法:

      /**
      * @param string $email
      * @return string
      */
      
      private function obfuscateEmail($email)
      {
          $em   = explode("@", $email);
      
          $name = implode(array_slice($em, 0, count($em)-1), '@');
      
          if(strlen($name)==1){
              return   '*'.'@'.end($em);
          }
      
          $len  = floor(strlen($name)/2);
      
          return substr($name,0, $len) . str_repeat('*', $len) . "@" . end($em);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-20
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        相关资源
        最近更新 更多