root: Spam Schutz mit Perl/PHP und JS

Hallo!

Ich möchte gerne meine E-Mailadressen auf meiner Webseite vor Programmen die nach E-Mailadressen suchen schützen.

Meine Webseite wird mittels eines Perlprogramms erzeugt.

Meine Idee ist folgende:
Ich ersetze, mit Perl auf dem Server, alle @'s in meiner Webseite durch eine Zeichenfolge, die sonst nicht in der Webseite vorkommt.
Dann schreibe ich ein keines JS, dass genau diese Zeichenfolge in der Seite, auf dem Client, wieder ersetzt. Dann müsste bei eingeschaltetem JS alles wieder gut aussehen und auch gut funktionieren. mailto: sollte davon ja nicht betroffen sein. Wer kein JS hat könnte unter Umständen noch so intelligent sein und die E-Mailadresse erahnen.

Perl-Script, falls es einer brauchen kann:

my $statt_at = '(&'.salt(5).';)';
if($complete_webpage !~ m/$statt_at/){
 $complete_webpage =~ s/@/$statt_at/g;
 my $js = "<script language="javascript" type="text/javascript">\n".
          " document.getElementsByTagName('body')[0].innerhtml.replace(/$statt_at/g,'@');\n".
          "</script>\n".
          "</body>";
 $complete_webpage =~ s/</body>/$js/i;
}
###############################################

Mein Problem ist, dass mein JS es nicht tut. Da bin ich nicht so gut drin.
Ich dachte mit folgendem Code könnte ich alle Zeichenfolgen in der Webseite ersetzen, tut aber nicht:

document.getElementsByTagName('body')[0].innerHTML.replace(/(&HB2BW;)/g,'@');

Er gibt einen Fehler: Nicht abgeschlossene Zeichenfolgenkonstante

Hilfe und Danke!

  1. hi,

    Ich ersetze, mit Perl auf dem Server, alle @'s in meiner Webseite durch eine Zeichenfolge, die sonst nicht in der Webseite vorkommt.
    Dann schreibe ich ein keines JS, dass genau diese Zeichenfolge in der Seite, auf dem Client, wieder ersetzt. Dann müsste bei eingeschaltetem JS alles wieder gut aussehen und auch gut funktionieren. mailto: sollte davon ja nicht betroffen sein.

    Wieso sollte mailto: davon nicht betroffen sein?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Vielleicht habe ich mich missverständlich ausgedrückt.

      <a href="mailto:email(dynamischeZeichenfolge)domain.de">email(dynamischeZeichenfolge)domain.de</a>

      1. Wenn der Benutzer kein JS hat, dann geht ein E-Mailfenster seines Standardemailprogramms auf. Er könnte ggfl. die E-Mailadresse in der Zeichenfolge erkennen und abwandeln. Das meine ich mit ist nicht betroffen.

      2. Er hat JS und das (dynamischeZeichenfolge) wird clientseitig wieder in ein @ gewandelt, dann müsste die gesamte Funktionalität wieder hergestellt sein.

      So oder so, müsste ein Programm auf der Suche nach E-Mailadressen Javascript interpretieren können um zu kapieren, dass es sich bei einer Zeichenfolge die bei jedem Seitenaufruf neu ist um das @ handelt. Wenn ein Mensch mal einen Blick drauf wirft, dann ist es eh vorbei. Er könnte wiederum ein Programm schreiben, dass weiss wo die dynamische Zeichenfolge steht. Dann könnte er aber gleich mit einem JS fähigen Browser die Seite ansehen.
      Da beißt sich die Katze in den Schwanz, will ich eine E-Mailadresse veröffentlichen, dann veröffentliche ich sie...

      Nun aber mal zu meinem Problem, wie ersetze ich in meiner gesamten HTML-Seite mit JS eine bekannte Zeichenfolge duch ein @?

      So will es nicht, warum?
      document.getElementsByTagName('body')[0].innerHTML.replace(/(HB2BW)/g,'@');

      Danke!

      1. Hallo root.

        Nun aber mal zu meinem Problem, wie ersetze ich in meiner gesamten HTML-Seite mit JS eine bekannte Zeichenfolge duch ein @?

        So will es nicht, warum?
        document.getElementsByTagName('body')[0].innerHTML.replace(/(HB2BW)/g,'@');

        Weil du den Rückgabewert der replace-Methode einfach unter den Tisch fallen lässt:

        Description

        This method does not change the String object it is called on. It simply returns a new string.

        Einen schönen Sonntag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. Hihi!

          Ja! So ist es dann wohl! Ich hatte ja gehofft er bezöge es implizit auf sich selbst...

          nun klappts auch!

          my $try_cnt = 1;
           my $statt_at = '('.salt(7).')'; # salt() gibt eifach nur eine lustige kombination von Zeichen, der übergebenen Länge, zurück.
           # Eindeutige Zeichenfolge finden, einfach paarmal versuchen.
           while($complete_webpage =~ m/$statt_at/){
            $statt_at = '('.salt(7).')';
            $try_cnt++;
            last if $try_cnt>25; # irgendwann ist auch mal gut.
           }
           if($complete_webpage !~ m/$statt_at/){ # Wenn die Zeichenfolge noch nicht in der Webseite vertreten ist

          # auf dem Server ersetzten.
            $complete_webpage =~ s/@/$statt_at/g;

          # JS einbauen, dass auf dem Client wieder zurück übersetzt.
            my $js = "</body>\n".
              "<script language="javascript" type="text/javascript">\n".
              " document.getElementsByTagName('body')[0].innerHTML = document.getElementsByTagName('body')[0].innerHTML.replace(/\Q$statt_at\E/g,'@');\n".
              "</script>\n";
            $complete_webpage =~ s/</body>/$js/i;
           }
           #print "brauchte $try_cnt Versuche um einen eindeutigen String zu finden: $statt_at<br>";

          Falls es noch wer haben will.