E-postaları spam botlarından gizlemek için etkili yöntem


196

Ana sayfamda, e-postamı spam botlarından gizlemek için bu yöntemi kullanıyorum:

<a href="admin [at] example.com"
   rel="nofollow"
   onclick="this.href='mailto:' + 'admin' + '@' + 'example.com'">Contact me</a>

Bu konu hakkında ne düşünüyorsun? Etkili mi? Başka hangi yöntemleri biliyor veya kullanıyorsunuz?


Bu, stackoverflow.com/questions/163628/… ' in bir kopyası veya topluluk olmayan bir wiki uzun listesi olduğu için diğeri geçerli değil.
Ciro Santilli 法轮功 at 病 六四 事件 法轮功

5
Bu daha fazla oy, cevap ve görüş var. Daha az oy, cevap ve görüşe sahip bir başkası lehine kapatılmamalıdır.
abatishchev

1
Bunu çok daha fazla çektiği gerçeğini takip etmek için onu kaparım.
abatishchev

6
En iyi çözüm, çözümünüzü paylaşmak değildir . Ne yazık ki bu böyle bir soru. Çözümünüzü bulmak ve kendinize saklamak en iyisidir. Biri standartlaştırılırsa, spambotlar üstesinden gelmek için uyarlanır.
Dimitris

1
En iyi çözüm, aşağıdaki çözümlerin birçoğunu birleştirmektir , örneğin e-postanın ilk kısmı resim, ikinci kısmı this.href.replace(/x/g,''), üçüncü kısmı onaltılı kodlu, vb. e.

Yanıtlar:


98

Bu, şunları bir sunucu taraf ile kullanılmaktadır Yöntem, örneğin bir , aşağıdakileri içerir:<!--#include file="emailObfuscator.include" -->emailObfuscator.include

<!-- // http://lists.evolt.org/archive/Week-of-Mon-20040202/154813.html -->
<script type="text/javascript">
    function gen_mail_to_link(lhs,rhs,subject) {
        document.write("<a href=\"mailto");
        document.write(":" + lhs + "@");
        document.write(rhs + "?subject=" + subject + "\">" + lhs + "@" + rhs + "<\/a>");
    }
</script>

Bir adres eklemek için JavaScript kullanıyorum:

<script type="text/javascript"> 
    gen_mail_to_link('john.doe','example.com','Feedback about your site...');
</script>
<noscript>
  <em>Email address protected by JavaScript. Activate JavaScript to see the email.</em>
</noscript>

2005'ten beri Gmail üzerinden e-posta aldığım için spam neredeyse sorun değil. Dolayısıyla, bu yöntemin ne kadar etkili olduğundan söz edemem. Bu grafiği üreten bu çalışmayı (eski olmasına rağmen) okumak isteyebilirsiniz :

resim açıklamasını buraya girin


Neden sunucu tarafı içermeye ihtiyacınız var emailObfuscator.include? Sadece .html biçiminde yazmakla aynı olmaz mı? (belki de sadece bir örnek?) Ayrıca neden <!-- -->script içinde html yorumları kullanıyorsunuz ? Ve son olarak neden <script>etiketlerinizden biri küçük harf, diğerleri büyük harf <SCRIPT>? Bu yöntemler botların veya diğer şeylerin karıştırılmasına yardımcı olur mu?
Templar

@Templar SGK gerekli değil, botları bildiğim kadar karıştırmıyor. Sitemi modüler hale getirir (artık bu yöntemi kullanmayın). Yorum hack bulduğum kaynağa atıfta bulundu (şimdi kırık bir bağlantı). Durumdaki değişiklik sadece bir tesadüf. Botları karıştırırsa, daha iyi, ama herhangi bir etkisi olduğundan şüpheliyim.
Fuhrmanator

4
Aynı fikri araştıran daha yeni ve eksiksiz bir çalışma: grall.name/posts/1/antiSpam-emailAddressObfuscation.html
Lucas Cimon

96

CSS'de içerik ve attr ile çalışma:

.cryptedmail:after {
  content: attr(data-name) "@" attr(data-domain) "." attr(data-tld); 
}
<a href="#" class="cryptedmail"
   data-name="info"
   data-domain="example"
   data-tld="org"
   onclick="window.location.href = 'mailto:' + this.dataset.name + '@' + this.dataset.domain + '.' + this.dataset.tld; return false;"></a>

Javascript devre dışı bırakıldığında, yalnızca click olayı çalışmaz, e-posta hala görüntülenir.

Başka bir ilginç yaklaşım (en azından bir tıklama olayı olmadan) yazma yönünü geçersiz kılmak için sağdan sola işaretini kullanmak olacaktır. bunun hakkında daha fazla bilgi: https://en.wikipedia.org/wiki/Right-to-left_mark


6
Bu daha fazla başparmak-up gerektirir.
heXer

Neden olduğundan emin değilim ancak bu çözüm oldukça etkileyici görünse de e-posta istemcimi tetikleyemiyor. İşte test etmek için bir keman: jsfiddle.net/wd436tg3
Ricardo Zea

1
@RicardoZea hangi tarayıcıyı kullanıyorsunuz? keman benim için krom, yani 11, kenar ve firefox iyi çalışıyor
Cyptus

3
Muhteşem. Ancak onclick etkinliğine "; return false" ifadesini ekleyin. Bu, tarayıcı URL'sine # değerinin çirkin eklenmesini önleyecektir (orijinal href bağlantısını iptal ederek)
T4NK3R

5
ANCAK - (görünür) posta adresini (Chrome, Firefox veya Edge'de) elle kopyalayamıyorum?
T4NK3R

83

Bu şekilde bir göz atın , oldukça zeki ve css kullanarak.

CSS

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

HTML

<span class="reverse">moc.rehtrebttam@retsambew</span>

Yukarıdaki CSS daha sonra okuma yönünü geçersiz kılar ve metni kullanıcıya doğru sırada sunar.

Umarım yardımcı olur

Şerefe


54
Kesinlikle komik. Ancak ne yazık ki, bu tıklanabilir değildir ve braille okuyucular gibi CSS olmayan tarayıcıları ihmal ederken kopyala / yapıştır için çalışmaz.
Arjan

Mhh güzel, ama tarayıcı yazan insanlar gördükten sonra işe yaramaz hale gelir.
Mau

6
Ters e-posta adresini bir RegEx ile eşleştirmek, tersine çevrilmemiş şekilde eşleştirmek kadar kolaydır. Spam, milyar dolarlık bir iştir ve spam gönderenler ekranları kazımak için kendi CPU döngülerini bile kullanmazlar. Aslında, bu konuşmayı çoktan okudular ve yöntemlerini buna göre ayarladılar. Bilgisayarın okuyabileceği her şey botlar tarafından okunabilir. CSS veya JavaScript tarafından yürütülüp yürütülmediği.
Jani Hyytiäinen

3
@ JaniHyytiäinen Katılmıyorum. CPU için ödeme yapmadıkları, sınırsız kaynaklara sahip oldukları anlamına gelmez. Bir JS tercümanı çalıştırmak, maliyeti için çok az adres verirse, bunu devre dışı bırakırlar.
o0 '.

1
@Lohoris: Google, ortalama sayfa yükleme süresini (2,45 sn) ve ortalama sayfa boyutunu (320 KB) bildirir, size ne kadar ayrıştırma yapabileceğiniz konusunda bir fikir verir. Bir indirme iş parçacığı istekleri yaparken, ayrıştırma iş parçacığı ayrıştırma yapabilirsiniz. İndirme işleminin büyük bir kısmı bekliyor. Hangi dl iş parçacığına ayrıştırıcıya göndermeye karar vermeden önce önkoşulları kontrol etme imkanı verir. Örneğin, sayfa oluşturma, indexOf ('@'), indexOf ('mailto:') vb. ayrıştırma gücü.
Jani Hyytiäinen

52

Buna tamamen farklı bir bakış açım var. Bunun için MailHide kullanıyorum .

MailHide, Google'dan kullanıcının e-postayı göstermek için bir reCAPTCHA testini tamamlaması gereken bir sistemdir.


15
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
showdev

5
Genelde bu düşünceye katılırken, bu durumda cevap belirli bir araç kullanmaktır. Bağlantı koparsa cevabı sileceğim.
tvanfosson

Teşekkürler - Bu harika. Ben böyle bir şey yazıyorum (açığa bağlantı): Bana bir e-posta gönderin: açığa
vurmak

6
Google'ın MailHide'ı Match 2018'den itibaren devre dışı bıraktığına dikkat edin. Her zaman olduğu gibi "ücretsiz" Google hizmetlerinde olduğu gibi: onlardan verilerle kâr edebildikleri sürece sunarlar ve ihtiyaç duydukları şeyi aldıklarında bırakırlar. Ücretsiz hizmetler sunmak için en güvenilir şirket. Yapmaya çalıştığınız her şeyi yayınlamanız gerekirse Google'ın veya başkalarının hizmetlerinden uzak dururum.
masi

51

Aslında benim fikrim değil ama yazarı bulamıyorum:

<a href="mailto:coxntact@domainx.com"
    onmouseover="this.href=this.href.replace(/x/g,'');">link</a>

İstediğiniz kadar x ekleyin. Okumak, kopyalamak ve yapıştırmak için mükemmel çalışır ve bir bot tarafından okunamaz.


2
Temiz! Peki ya mobil kullanıcılar?
Bodzio

Bir bağlantıya dokunduğunuzda fareyle üzerine gelme tetiklenir. İyi çalışmalı.
Andrew Swift

4
Adresinizde x bulunmadığı sürece çalışır. :-p Ama, biliyorum, sadece farklı bir mektup kullan.
Dan Henderson

1
Ancak, javascript devre dışı bırakılmışsa, kullanıcılara size bir müşteri / kullanıcı kaybetme şeklinde geri dönecek varolmayan bir adres sunarsınız.
Xeevis

34
Javascript devre dışı bırakılırsa, sitelerimin hiçbiri hiç çalışmıyor ;-)
Andrew Swift

16

Sahip olabileceğiniz tek kusursuz yöntem, e-posta adresinize gönderilen bir komut dosyasına gönderen bir form olan Bana Ulaşın sayfası oluşturmak olduğunu düşünüyorum. Bu şekilde, adresiniz hiçbir zaman halka açılmamaktadır. Bu bazı nedenlerden dolayı istenmeyen olabilir, ancak bence oldukça iyi bir çözüm. Birisinin e-posta adresini kendi sitesinden posta istemcime kopyalayıp yapıştırmam ve onlara bir mesaj göndermem gerektiğinde sık sık beni rahatsız eder; Bunu kendi sitelerindeki bir form aracılığıyla yapmayı tercih ederim. Ayrıca, bu yaklaşım size anonim yorumların gönderilmesini sağlar, vb. Sadece captcha gibi bir tür anti-bot şeması kullanarak formunuzu koruduğunuzdan emin olun. Burada SO üzerinde tartışılan birçoğu var.


6
Bununla ilgili tek sorun, kopyalayıp başka bir yere yapıştırmak için zaman ayırmadığınız sürece gönderdiğiniz iletinin bir kopyasına sahip olmamanızdır. Şahsen ben kopyalama ve yapıştırma umurumda değil ama her biri kendi.
gvkv

6
Gönderenin bir kopyası olmayanlara gelince: Web'deki birçok form için kendime bir kopya alma seçeneğini seviyorum. Ancak, genellikle böyle bir seçenek hemen hemen herkese anonim olarak mesaj göndermek için kötüye izin verir ...
Arjan

12
Bu, e-posta adresinizi gizleyebilir, ancak formunuzu bir captcha resim doğrulama komut dosyasıyla güvenceye almadığınız sürece spam'ı hiç durdurmaz.
SimonDowdles

1
Ayrıca, göndericinin bir kopyasının olmaması sorununu, onlara gönderme seçeneğini de ekleyerek çözebilirsiniz.
steinybot

1
"Kendinize bir kopyasını gönder" seçeneği - formu etkili bir şekilde bir spam kanonuna dönüştürür, gönderen olarak sizinle birlikte - kötü fikir!
T4NK3R


11

Php desteğiniz varsa, böyle bir şey yapabilirsiniz:

<img src="scriptname.php">

Ve scriptname.php:

<?php
header("Content-type: image/png");
// Your email address which will be shown in the image
$email    =    "you@yourdomain.com";
$length    =    (strlen($email)*8);
$im = @ImageCreate ($length, 20)
     or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
$background_color = ImageColorAllocate ($im, 255, 255, 255); // White: 255,255,255
$text_color = ImageColorAllocate ($im, 55, 103, 122);
imagestring($im, 3,5,2,$email, $text_color);
imagepng ($im);
?>

1
php kullanmak yerine fiziksel olarak görüntü oluşturabilirsiniz. Ve css invert ile olduğu gibi hala tıklanabilir olmama probleminiz var ve bir kalem kullanılmadıkça kopyalanamazsınız: P
Claudiu

9

Cevabımın pek çok kişi tarafından beğenilmeyeceğini biliyorum, ancak lütfen aşağıya bakmadan önce burada belirtilen noktaları göz önünde bulundurun.

Makine tarafından kolayca okunabilen her şey, spam gönderenler tarafından kolayca makine tarafından okunabilir. Onların eylemleri bize aptal gibi görünse de, onlar aptal insanlar değiller. Yenilikçi ve becerikli. Sadece e-postaları hasat etmek için botlar kullanmazlar, emrinde çok sayıda yöntem kullanırlar ve buna ek olarak, sadece yeni taze e-posta listeleri için ödeme yaparlar. Bunun anlamı, işlerini yürütmek için dünya çapında binlerce siyah şapka hackerları olması. Diğer insanların tarayıcılarının ekranlarını kazımak için kötü amaçlı yazılımları kodlamaya hazır olan insanlar, sonuçta işe yaramaya çalıştığınız herhangi bir yöntemi oluşturur. Bu konu zaten 10'dan fazla kişi tarafından okundu ve bize gülüyorlar. Bazıları, onlara yeni bir meydan okuma koyamayacağımızı öğrenmek için gözyaşlarından bile sıkılabilir.

Sonunda zamanınızı değil, başkalarının zamanını kurtarmaya çalıştığınızı unutmayın. Bu nedenle, lütfen burada biraz daha fazla zaman geçirmeyi düşünün. Çalışması kolay bir sihirli mermi yoktur. Sitede 100 kişinin e-posta yayınlayan bir şirkette çalışıyorsanız ve kişi başına günlük 1 spam e-postayı azaltabiliyorsanız, yılda yaklaşık 36500 spam e-postadan bahsediyoruz. Bu tür bir e-postayı silmek ortalama 5 saniye sürüyorsa, yılda yaklaşık 50 çalışma saatinden bahsediyoruz. Azalmış sıkıntı miktarından bahsetmiyorum bile. Peki, neden bunun için birkaç saat harcamıyorsunuz?

Zamanı siz bir varlık olarak değerlendiren sadece siz ve e-postayı alan kişiler değildir. Bu nedenle, e-posta adreslerini bu şekilde gizlemenin bir yolunu bulmanız gerekir, bu da onu kırmak için işe yaramaz. E-postaları gizlemek için yaygın olarak kullanılan bir yöntem kullanırsanız, onu kırmak gerçekten işe yarar. Sonuç olarak, kraker onlarca veya yüz binlerce taze e-posta olmasa bile binlerce el alacaktır. Ve onlar için para alacaklar.

Yani, devam edin ve kendi yönteminizi kodlayın. Bu, tekerleği yeniden icat etmenin gerçekten işe yaradığı nadir bir durumdur. Makine tarafından okunamayan ve tercihen kullanıcı deneyiminden ödün vermeden bir miktar kullanıcı etkileşimi gerektiren bir yöntem kullanın.

Ne demek istediğimin bir örneğini kodlamak için 20 dakika harcadım. Örnekte, KnockoutJS'yi kullandım çünkü beğendim ve muhtemelen kendiniz kullanmayacağınızı biliyorum. Ama yine de alakasız. Yaygın olarak kullanılmayan özel bir çözümdür. Bunu kırmak, bunu yapmak için bir ödül oluşturmayacaktır, çünkü bunu yapma yöntemi sadece geniş internetteki tek bir sayfada işe yarayacaktır.

İşte keman: http://jsfiddle.net/hzaw6/

Aşağıdaki kod, iyi bir kod örneği değildir. Ancak, makinenin anlaması çok zor olan hızlı bir kod örneği, burada e-postaları bile ele alıyoruz. Ve yapılabilirse bile, büyük çapta yürütmek için para ödemeyecek.

Ve evet, tanımsız veya null referansın 'özellik alınamıyor' özellikleri nedeniyle IE = lte8 üzerinde çalışmadığını biliyorum ama sadece umursamıyorum çünkü gerçek bir uygulama değil, sadece bir yöntem demosu, ve üretimde olduğu gibi kullanılması amaçlanmamıştır. Daha havalı, teknik olarak daha sağlam vb.Kendinizi kodlamaktan çekinmeyin.

Oh, ve html veya javascript'te hiçbir zaman posta veya e-posta adı vermeyin. DOM ve pencere nesnesini posta veya e-posta adı verilen herhangi bir şey için kazımak ve e-posta ile eşleşen bir şey içerip içermediğini kontrol etmek çok kolaydır. Bu nedenle, e-postayı tam biçiminde içerecek hiçbir değişkeni istemezsiniz ve bu nedenle bu değişkenleri atamadan önce kullanıcının sayfayla etkileşime girmesini de istersiniz. Javascript nesne modeliniz DOM için hazır durumunda herhangi bir e-posta adresi içeriyorsa, bunları spam göndericilere tanıtırsınız.

HTML:

<div data-bind="foreach: contacts">
    <div class="contact">
        <div>
            <h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
            <ul>
                <li>Phone: <span data-bind="text: phone"></span></li>
                <li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
            </ul>
        </div>
    </div>
</div>

JS

function ViewModel(){
    var self = this;

    self.contacts = ko.observableArray([
        { firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
        { firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
        { firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
    ]);
    self.msgMeToThis = ko.observable('');
    self.reveal = function(m, e){
        var name = e.target.attributes.href.value;
        name = name.replace('#', '');
        self.msgMeToThis(name);
    };
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);

8

En sevdiğim yöntemlerden biri php kullanarak e-posta adresini gizlemek, klasik bir örnek, karakterleri aşağıdaki gibi HEX değerlerine dönüştürmektir:

function myobfiscate($emailaddress){
 $email= $emailaddress;                
 $length = strlen($email);                         
 for ($i = 0; $i < $length; $i++){                
 $obfuscatedEmail .= "&#" . ord($email[$i]).";";
 }
 echo $obfuscatedEmail;
}

Sonra işaretlememde şöyle diyorum:

  <a href="mailto:<?php echo myobfiscate('someone@somewhere.com'); ?>"
title="Email me!"><?php echo myobfiscate('someone@somewhere.com');?> </a>

Sonra kaynağınızı inceleyin, hoş bir sürpriz olacak!


Bu güzel bir örnek. Teşekkürler. HEX kod çözme kullanarak SpamBots herhangi bir ipucu?
jasonflaherty

7

Hexa'daki html varlıklarını kullanarak karakterleri gizlemeye çalışabilirsiniz (ör. @ İçin & # x40). Doğru bir tarayıcı çevireceği için bu uygun bir çözümdür ve normal bir bağlantınız olabilir. Dezavantajı, bir bot teorik olarak çevirebilir, ancak biraz sıradışı. Bunu blogumdaki e-postamı korumak için kullanıyorum.

Başka bir çözüm, adresin bir kısmını birleştirmek ve anında kod çözmek için javascript kullanmaktır . Dezavantajı, javascript devre dışı bir tarayıcının adresinizi göstermemesidir.

En etkili çözüm bir görüntü kullanmaktır , ancak kullanıcının adresi elle kopyalaması bir acıdır.

Yalnızca javascript'i devre dışı bırakmış kullanıcılar için bir dezavantaj (@ el ile @ yazarak) eklediğiniz için çözümünüz oldukça iyi . Ayrıca aşağıdakilerle daha güvenli olabilirsiniz:

onclick="this.href='mailto:' + 'admin' + '&#x40;' + 'domain.com'"

5

Spambotlar bunu yorumlamaz, çünkü daha az bilinen bir yöntemdir :)

İlk olarak, css tanımlayın:

email:before {
    content: "admin";
}

email:after {
    content: "@example.com";
}

Şimdi, e-postanızı görüntülemek istediğiniz yere aşağıdaki HTML'yi eklemeniz yeterlidir:

<div id="email"></div>

Ve tada!


Bu çalışır, ancak çoğu kullanıcı için kullanılabilirliği etkileyebilecek kopyala yapıştırmayı desteklemez
Iruku Kagika

4

Kullanıcıya doğru e-posta adresini görüntüleyen ve aynı zamanda çapa tıklatıldığında veya üzerine geldiğinde çalışan çok basit bir CSS ve jQuery kombinasyonu kullanıyorum:

HTML:

<a href="mailto:me@example.spam" id="lnkMail">moc.elpmaxe@em</a>

CSS:

#lnkMail {
    unicode-bidi: bidi-override;
    direction: rtl;
}

jQuery:

$('#lnkMail').hover(function(){
    // here you can use whatever replace you want
    var newHref = $(this).attr('href').replace('spam', 'com');
    $(this).attr('href', newHref);
});

İşte çalışan bir örnek.


bağlantının üzerine geldiğinde tarayıcı durum çubuğunda doğru href değerini gösterecek mi?
Nik O'Lai

Evet, bağlantı üzerine geldiğinde doğru href değerini gösterir. Bu nedenle jQuery yönteminin yerine getirilmesi gerekir.
Sergiu

Ne yazık ki, hayır, en azından ilk kez bağlantının üzerine geldiğinizde doğru href değerini göstermiyor (me@example.spam). İkinci fareyle herşey yolundaydı. Kendi bağlantınızla test edin.
Nik O'Lai

1
Chrome ve IE'de çalışıyor. Sadece Firefox'ta gibi görünüyor, ilk fareyle durum çubuğu güncellenmiyor. Firefox için bir çözüm bulmaya çalışacağım.
Sergiu

1
Görüyorum, görüyorum, aslında bunu beğendim.
Eric Bishard

3

! - Bunu referans olarak ekleyerek, bilgilerin ne kadar eski olabileceğini bilmiyorum, ancak herhangi bir komut dosyasının kullanılmasını gerektirmeyen birkaç basit çözümden bahsediyor

Bunu kendim aradıktan sonra bu sayfaya değil, aynı zamanda bu sayfalara rastladım:

http://nadeausoftware.com/articles/2007/05/stop_spammer_email_harvesters_obfuscating_email_addresses

emailadress'i ters çevirmeyi deneyin

Örnek düz HTML:

<bdo dir="rtl">moc.elpmaxe@nosrep</bdo>
Result : person@example.com

CSS kullanarak aynı etki

CSS:
.reverse { unicode-bidi:bidi-override; direction:rtl; }
HTML:
<span class="reverse">moc.elpmaxe@nosrep</span>
Result : person@example.com

Bunu daha önce bahsedilen yöntemlerden herhangi biriyle birleştirmek bile daha etkili olabilir


3

Kolay bir çözüm, gerçek karakterler yerine HTML varlıklarını kullanmaktır. Örneğin, "me@example.com" şu biçime dönüştürülecektir:

<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">email me</A>

2
Sizi meşgul edecek google.se/search?q=HTML+entities+converter deneyin ;)
grapefrukt

1
Google bunun için size birçok sayfa bulabilir. Bir örnek: hp.vector.co.jp/authors/VA022023/javascript/…
Romain Linsolas

4
Ama bir bot da bu kadar kolay regex olamazdı?
dev

20
Ah, me @ stack ... örneği daha iyi me@example.com, me@example.net veya me@example.org olarak yazılmalıdır - bunlar, sahip olmayanların örneklerde kullanması gereken tek alan adlarıdır!
Arjan


3

İşte benim çalışma sürümü:


Yedek metni olan bir yerde bir kap oluşturun:

<div id="knock_knock">Activate JavaScript, please.</div>

Ve aşağıdaki snippet'i DOM'nin altına ekleyin (oluşturma işlemiyle):

<script>
  (function(d,id,lhs,rhs){
    d.getElementById(id).innerHTML = "<a rel=\"nofollow\" href=\"mailto"+":"+lhs+"@"+rhs+"\">"+"Mail"+"<\/a>";
  })(window.document, "knock_knock", "your.name", "example.com");
</script>

Oluşturulan köprüyü belirtilen kaba ekler:

<div id="knock_knock"><a rel="nofollow" href="your.name@example.com">Mail</a></div>

Ayrıca burada küçültülmüş bir sürüm var:

<script>(function(d,i,l,r){d.getElementById(i).innerHTML="<a rel=\"nofollow\" href=\"mailto"+":"+l+"@"+r+"\">"+"Mail"+"<\/a>";})(window.document,"knock_knock","your.name","example.com");</script>

2

E-posta adreslerini gizlemek için en iyi yöntem, bot programcısı bu "kodlamayı" keşfedip bir şifre çözme algoritması uygulayana kadar iyidir.

JavaScript seçeneği uzun sürmez, çünkü JavaScript'i yorumlayan çok sayıda tarayıcı vardır.

Cevap yok imho.


JavaScript'i yorumlayan tarayıcılar var mı? Bir JavaScript kodlama yöntemim son birkaç yıldır benim için iyi çalışıyor gibi görünüyor - spam oranım oldukça istikrarlı ~ 4 / hafta oldu, bu yüzden başkalarının bu yönteme emanet ettiğim adresleri hakkında endişelenmedim. Yapmalımıyım?
Kev

Elbette, çok sayıda tarayıcıyı hariç tutabilir, ancak ben, bir adres tarayıcısı oluşturduysam, bir JavaScript lib uygulayacağım :)
guerda

düşündüğünüzden daha fazla çaba
anonim korkak

Google şu anda bazı JS üzerinden tarama yapıyor.
Alister Bulman

2

Muhtemelen sembolü [at]ve diğer kılık değiştiren botları vardır @. Yani bu gerçekten etkili bir yöntem değil.

URL kodlaması veya HTML karakter referansları (veya her ikisi) gibi bazı kodlamaları kullanabileceğinizden emin olabilirsiniz:

// PHP example
// encodes every character using URL encoding (%hh)
function foo($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('%%%X', ord($str[$i]));
    return $retVal;
}
// encodes every character into HTML character references (&#xhh;)
function bar($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('&#x%X;', ord($str[$i]));
    return $retVal;
}

$email = 'user@example.com';
echo '<a href="'.bar('mailto:?to=' . foo(','.$email.'')).'">mail me</a>';

// output
// <a href="&#x6D;&#x61;&#x69;&#x6C;&#x74;&#x6F;&#x3A;&#x3F;&#x74;&#x6F;&#x3D;&#x25;&#x32;&#x43;&#x25;&#x37;&#x35;&#x25;&#x37;&#x33;&#x25;&#x36;&#x35;&#x25;&#x37;&#x32;&#x25;&#x34;&#x30;&#x25;&#x36;&#x35;&#x25;&#x37;&#x38;&#x25;&#x36;&#x31;&#x25;&#x36;&#x44;&#x25;&#x37;&#x30;&#x25;&#x36;&#x43;&#x25;&#x36;&#x35;&#x25;&#x32;&#x45;&#x25;&#x36;&#x33;&#x25;&#x36;&#x46;&#x25;&#x36;&#x44;">mail me</a>

Ancak bunları kullanmak yasal olduğundan, her tarayıcı / e-posta istemcisi bu kodlamaları da işlemelidir.


Tamamen katılıyorum, spam gönderenler "akıllı" insanlar, senelerce sözdizimi yerine [at] veya [dot] ekledikten sonra, elbette bu kalıpları toplayan algoritmalara sahip olacaklar.
SimonDowdles

Bu HEX değerlerinin kodunu çözmeye ne dersiniz?
jasonflaherty

2

Ben SpamSpan hayranıyım - şaşırmış , ancak JS devre dışı bırakılmışsa hala deşifre edilebilir. Çok az trafikli bir web sitesinde sadece bir yıldır kullanmama rağmen, işe yarıyor gibi görünüyor.

Drupal için e-postaları otomatik olarak SpamSpans'e dönüştürmek için bir modül de var.


1

Bağlantıyı sağ tıklayıp "URL'yi kopyala" yı seçersem işe yarar mı? Değilse, çok ideal bir durum değildir (E-posta adresini kopyalayıp posta uygulamama yapıştırmayı veya belirli bir zamanda ihtiyaç duyduğum herhangi bir yere nadiren bir mailto bağlantısını tıklıyorum).

Eskiden posta adresimi çevrimiçi (UseNet, web ve benzeri) koruyan oldukça paranoyaktı, ancak bu günlerde yerel bölümleri programlı olarak alanlarla eşleştiren daha fazla "olası spam hedefi" olduğundan şüpheleniyorum. Bunu, zaman zaman posta sunucusu günlüklerimden geçirmeye dayandırıyorum. Mevcut olmayan adreslere yönelik birkaç dağıtım girişimi olma eğilimindedir (90'ların sonunda, adres kazıma işleminin çok yaygın olduğu durumlarda UseNet'te sarkan spam-bait'in kesilmiş sürümleri dahil).


1

birçok teknik kullandıktan sonra kolay bir yol buldum ve çok samimi, botlar @ Símbolo için arama ve son zamanlarda onlar karınca varyasyon için arama bu yüzden 2 teknik kullanın

  1. alanımın kullandığı gibi bir resme e-postamı yazıyorum ve mükemmel çalışıyor veya
  2. Símbolo (@) 'u bir görüntüyle değiştirmek için

@ değiştir ve alt resim alt = "@" olacak, böylece bot bir resim bulacak ve herhangi bir insan onu normal bir adres olarak görecek, böylece kopyalarsa e-postayı kopyalayacak ve iş don olacak, böylece kod

<p>myname<img src="http://www.traidnt.net/vb/images/mail2.gif" width="11" height="9" alt="@" />domain.com</p>


1

Öncelikle, e-posta adresinin yalnızca javascript etkinleştirildiğinde gösterildiğinden emin olurum. Bu şekilde, javascript olmadan okunabilecek düz bir metin yoktur.

İkinci olarak, güvenli bir özelliği uygulamanın bir yolu da <button>etiketten uzak durmaktır. Bu etiket, etiketler arasında metin tarafından okunabilir ve bu da onu bilgisayar tarafından okunabilir kılar. Bunun yerine <input type="button">bir onClick için bir javascript işleyici ile deneyin . Ardından, güvenli bir e-posta gösterimi uygulamak için başkaları tarafından belirtilen tüm teknikleri kullanın.

Diğer bir seçenek de "E-posta adresini görmek için tıklayın" düğmesine sahip olmaktır. Tıklandığında bu, kodlanmış bir e-postaya (HTML kodlarındaki karakterler) dönüşür. Başka bir tıklamayla bu 'mailto: email' işlevine yönlendirir

Son fikrin seçilebilir ve seçilemez e-posta adresleriyle kodlanmamış bir versiyonu:

<html>
<body>
<script type="text/javascript">
      e1="@domain";
      e2="me";
      e3=".extension";
email_link="mailto:"+e2+e1+e3;
</script>
<input type="text" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="text" onClick="this.value=email;" value="Click for mail-address"/>
<input type="button" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="button" onClick="this.value=email;" value="Click for mail-address"/>
</body></html>

Bunun isteyeceğiniz bir şey olup olmadığını görün ve başkalarının fikirleriyle birleştirin. Asla çok emin olamazsınız.


2
oh look - me@domain.extension - düz metin e-posta adresi var.
Alister Bulman

1

Ve benim fonksiyonum. Bu konuya verilen cevaplara bakarak yarattım.

 function antiboteEmail($email)
 {
        $html = '';

        $email = strrev($email);
        $randId = rand(1, 500);

        $html .= '<span id="addr-'.$randId.'" class="addr">[turn javascript on to see the e-mail]</span>';
        $html .= <<<EOD
                <script>
                $(document).ready(function(){

                    var addr = "$email";
                    addr = addr.split("").reverse().join("");
                    $("#addr-$randId").html("<a href=\"mailto:" + addr + "\">" + addr + " </a>");
                });
                </script>
EOD;

        return $html;
    }

İki yöntem kullanır: sağdan sola yön ve javascript koyma.


1

Seçenek 1: E-posta adresini birden çok parçaya ayırın ve bu parçalardan JavaScript'te bir dizi oluşturun. Sonra bu parçaları doğru sırayla birleştirin ve e-posta adresini web sayfasına eklemek için .innerHTML özelliğini kullanın.

 <span id="email">  </span>   // blank tag

 <script>
 var parts = ["info", "XXXXabc", "com", "&#46;", "&#64;"];
 var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
 document.getElementById("email").innerHTML=email; 
 </script>

2. Seçenek: E-posta metni yerine resim kullan

Metinden resim oluşturucu web sitesi: http://www.chxo.com/labelgen/

Seçenek 3: "@" yerine AT ve "." Yerine DOT kullanabiliriz.

yani:

 info(AT)XXXabc(DOT)com 

1
Seçenek 1'in iyi bir seçenek olmadığını düşünüyorum. Bir botla birlikte çalışan bir ayrıştırıcı, innerHTML'nin değerini kolayca anlayabilir ve seçenek 3 muhtemelen akıllı bir botun anlayabileceği için o kadar iyi değildir. Seçenek 2 en iyisi olduğunu düşünüyorum.
John Sonderson

1

JavaScript ve HTML'nin karıştırılmasını sevmiyorum, bu yüzden bu çözümü kullanıyorum. Şimdilik benim için iyi çalışıyor.

Fikir : data-attributes şifreli bilgi sağlayarak ve JS içinde şifresini çözerek bunu daha karmaşık hale getirebilirsiniz . Bu sadece harfleri değiştirerek veya sadece ters çevirerek yapılır.

HTML :

<span class="generate-email" data-part1="john" data-part2="gmail" data-part3="com">placeholder</span>

JS :

$(function() {
    $('.generate-email').each(function() {
        var that = $(this);
        that.html(
            that.data('part1') + '@' + that.data('part2') + '.' + that.data('part3')
        );
    });  
});

Deneyin: http://jsfiddle.net/x6g9L817/


1

HTML_CHARACTER hakkında ne dersiniz ?:

joe&#064;mail.com

çıktılar

joe@mail.com

1
E-posta adresi bu şekilde tıklanamaz ve @ sembolünün yerleşimi, satır içine yerleştirildiyse her zaman aynı görünmeyeceği için kurşun geçirmez olmayacaktır.
Brent O'Connor

0

İşte bu sorunun basit bir jquery çözümü:

<script type="text/javascript">
$(document).ready(function() {
    str1="mailto:";
    str2="info";
    str3="@test.com";
    $("#email_a").attr("href", str1+str2+str3);

});
</script>

<a href="#" id="email_a"><img src="sample.png"/></a>

0

Ofaurax'ın cevabını en çok beğendim ama biraz daha gizli bir e-posta için bunu değiştirirdim:

onclick="p1='admin'; p2='domain.com'; this.href='mailto:' + p1 + '& #x40;' + p2"

0

Başka bir cevap daha vermeliyim. Sadece oynamak için eğlenceli bir şey buldum.

Birçok ortak karakter tablosunda @ ve az harflerinin birden fazla kez yeniden göründüğünü öğrendim. Orijinal karakterleri yeni eşlemelerle eşleştirebilir ve spam botlarının e-postanın ne olduğunu bulmasını zorlaştırabilirsiniz.

Dizede döngü yapar ve bir harfin karakter kodunu alırsanız, buna 65248 ekleyin ve sayıya göre bir html öğesi oluşturun, okunabilir bir e-posta adresi bulursunuz.

var str = 'john.doe@email.com';
str = str.toLowerCase().replace(/[\.@a-z]/gi, function(match, position, str){
    var num = str.charCodeAt(position);
    return ('&#' + (num + 65248) + ';');
});

İşte çalışan bir keman: http://jsfiddle.net/EhtSC/8/

Aynı görünen karakterler arasında daha eksiksiz bir eşleme kümesi oluşturarak bu yaklaşımı geliştirebilirsiniz. Ancak, e-postayı örneğin not defterine kopyalar / yapıştırırsanız, çok fazla kutu alırsınız.

Bazı kullanıcı deneyimi sorunlarının üstesinden gelmek için, e-postayı bağlantı olarak oluşturdum. Tıkladığınızda karakterleri orijinalleriyle yeniden eşler.

Bunu geliştirmek için isterseniz daha karmaşık karakter eşlemeleri oluşturabilirsiniz. Örneğin 'a' yerine kullanılabilecek birkaç karakter bulabilirseniz neden bunlarla rastgele eşleme yapmıyorsunuz?

Muhtemelen şimdiye kadarki en güvenli yaklaşım değil ama onunla oynamaktan gerçekten çok eğlendim: D

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.