Javascript in PHP-Funktion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Javascript in PHP-Funktion

    Hallo zusammen

    Folgendes Problem: Ich verwende eine PHP-Klasse, um Mails als Javascript verschlüsselt im Quelltext darzustellen. Der Outpout ist dann wie folgt:

    Code:
    <script type="text/javascript">
    //<![CDATA[
    var x6="";for(var r7=0;r7<396;r7++)x6+=String.fromCharCode((")s%2%BO44Mx\"%:)s%2#GOBM#GNDIBM#G==;%B=Oe\'%{!y@x%\" Uzs%U\"vw::4Nc)G0:-w.dIIG7657=;-7>-:dI<01;U0:-.dw$N5)1n4<7aNU:-8n4)+-OVwV/SInnIU;=*;<:OXPPRN;=8jj87:j<jNU:-8n4)+-OVjV/SIoIU;=*;<:OXPPRIgIU+0):h<OWPRN/.-n4n41$@Y-+\'\'0NU:-8n4)+-OV\'V/SIIPRN$NIG7657=;-]7=<dI<01;U0:-.d$N$NIe;=887:<MJ@WW[Wb/.-]n4n41]MJ@]WWWWY-b+0cV])eNU:-8n4)+-OV]V/SIwIU;=*;<:OXPP4@uzs%U\"vwS\':#G;?:B+CG;=B+Ex;7:CGB?GG;=B<G=ED;Mw)s~:%B;".charCodeAt(r7)-(-40+58)+-3+66)%(120-25)+0x20);document.write(eval(x6))
    //]]>
    </script>
    Diese Klasse rufe ich mit einer PHP-Funktion "getEncodedMail" auf:

    Code:
    require_once('./includes/emailcode.class.php');
    $emailcode = new ClassEmailcode();
    return $emailcode->emailgetencode($mail, $text);
    Gebe ich den Return mit echo aus, funktioniert das einwandfrei und der Output im Quelltext ist wie oben gepostet. Nun möchte ich den Return aber in einer weiteren PHP-Funktion ("bbcode2html") nutzen, die allerlei Tags und Zeichen durch bestimmte andere ersetzt.

    Ich suche in dieser Funktion nach "/\[mail=([.-_a-z0-9@]*)\]([.-_a-z0-9@]*)\[\/mail\]/" und ersetze mit str_replace den Treffer durch den Return aus der Mail-Funktion. Das Resultat gebe ich in der bbcode2html-Funktion ebenfalls als Return aus - das Resultat im Quelltext ist dann wie folgt:

    Code:
    <script type="text/javascript"><br />
    //<![CDATA[<br />
    var qO="";for(var kl=0;kl<630;kl++)qO+=String.fromCharCode(("~iz({;E*pb;?lSu29YZ}Lsan^>M_Q@zX\\8mTiwWPyVJK=`{q">ok|5rRt~jIx\":A[O!<v NU#*4j@E**4z?4y=E*YxjV9uVI8z\\N9J9yTA!rT[@x8zNAXA@InMY\"mu`x}{VI8z\\NX;wr\\@NoT2>ta` q}qY`iujV\\AQ">}: t8I~J9J=|Y[s}wXb~T\"rIwl5q}qY`iujV\\AQ">}\"5t8I~JzM9Ri[@Ji[>IZ?loZM5J^;9R\\AVVi=S\"Z?poZIwq8`>`TujoX2Q~L?Y`@us">YI!I8Xb5\\zs`Z;NQ}Ai5zI9JX@5~XM=|Y:~q9Jb~TA!rT[b:i2s`T[@\"nMY\"mu`x}{VI8z\\NX;w~X;iJn`>`i[b\"n;NVnJiRi{@~TuSK8Myti;Nq}S5J9`:TLS\"o*Cnwz0~iz(ngE8CngD;8@Cng3E<1$z?E0{;6qvlm!Wn0y=6kpizI|0ng11DD9@1%0{;6qvlm!Wn0y=6kpizI|0ng3911DD9:1%0{;6qvlm!Wn0y=6kpizI|0ng3:11DD>1%{;6qvlm!Wn0y=6kpizI|0ng3;11Cj@3E[|zqvo6nzwuKpizKwlm0z?FFF9>40z?FFF@1.:==4z?.:==1&Cm~it0j@6{}j{|z084:;911".charCodeAt(kl)-(8*1+0)+79-16)%(2*9+77)+98-66);document.write(eval(qO))<br />
    //]]><br />
    </script>
    Soll heissen: Alle "\n" aus der Mail-Klasse werden nun im Quelltext zwar als Zeilenumbrüche dargestellt, aber zusätzlich auch noch als "<br />" ausgegeben. Dadurch funktioniert das Script zur Mailadressen-Verschlüsselung nicht mehr.

    Wie bringe ich die "<br />"-Tags aus dem doppelten Return im Quelltext wieder weg? Soviel vorneweg: Mit str_replace klappt es leider nicht.

    Danke schon im Voraus für eure Hilfe!

  • #2
    Mal davon abgesehen, dass das ziemlicher Käse ist (funktioniert auf Clients ohne JavaScript nicht), gibt es wesentlich sinnvollere und sichere Alternativen wie zB. HTTPS.

    Außerdem ergibt das für mich keinen Sinn. Wenn die Mail verschlüsselt ist, gibt es keine BBCode-Tags mehr, die du ersetzen kannst. Auch die \n in der Mail sind dann nicht mehr als Klartext vorhanden, sondern verschlüsselt.

    Hau den ganzen Dreck einfach weg und setz auf eine richtige Verschlüsselung und nicht so einen Kindergartenkram, der von jedem dahergelaufenen Hobby-Programmierer in 5 Sekunden geknackt wird.

    Kommentar


    • #3
      Danke für dein Feedback. Ich habe mich wohl unklar ausgedrückt. Es geht nicht darum, eine Mail (also die Nachricht) zu verschlüsseln, sondern um die vor Robots geschützte Ausgabe einer Mailadresse.

      Kommentar


      • #4
        Auch in dem Fall wirst du alle Clients ohne JavaScript ausschließen. Bessere Alternative: Ein Kontaktformular.

        Kommentar


        • #5
          Kontaktformulare kommen dafür nicht in Frage. Ich möchte das gerne so mit Javascript realisieren und suche deshalb diese Lösung.

          Kommentar


          • #6
            Zitat von Gfelli Beitrag anzeigen
            Es geht […] um die vor Robots geschützte Ausgabe einer Mailadresse.
            Mit sowas würde ich absolut keine Zeit mehr vergeuden …

            Email-Adressen werden früher oder später bespammt, das können wir glaube ich als „Fakt“ ansehen.
            Wenn die Spammer deine Adresse nicht aus einer Webseite auslesen können – dann bekommen sie sie halt auf anderen Wegen: Kauf von Adresslisten auf dem „Schwarzmarkt“, vom Trojaner den sich einer deiner Kontakte einfängt und der deren Adressbuch ausliest¹, …, – oder sie „raten“ sie letztendlich einfach, und feuern an multiple potentielle Kandidaten @domain (und support@… ist ja nicht so schwer zu erraten – und selbst eher zufällige Kombinationen werden von Spammern einfach auf gut Glück probiert, schließlich kostet sie der Mailversand so gut wie nichts).

            Anstatt also in sowas überhaupt Zeit zu investieren, würde ich die lieber in sinnvolle Abwehrmaßnahmen stecken – also einen guten Spamfilter. Ohne kommt man heute sowieso nicht mehr aus.


            ¹ oder, und damit ist dein Schutz auch gleich umgangen: Ich implementiere das Adressen-Sammeln einfach als „Zusatz-Feature“ eines Browser-Addons – da brauche ich mich gar nicht mehr mit deinem „Schutz“ beschäftigen, sondern brauche einfach nur das DOM der Webseiten, die der Nutzer besucht, durchlaufen … und kann alle gefundenen Email-Adressen im Hintergrund an meinen Server senden, während das Addon vordergründig seine „gute Arbeit“ im Sinne des Nutzers leistet …
            Zuletzt geändert von wahsaga; 02.05.2014, 23:01.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Schaden kann es aber auch nicht, wenn noch ein solcher Schutz da ist und zumindest einen Teil blockt, oder?

              Jedenfalls würde ich das so so trotzdem gerne zum Laufen bringen. Es ist gut möglich, daas ich in einem anderen Fall wieder mal ein Javascript durch einen doppelten Return wie hier schicken muss. Da werde ich froh sein, wenn dieses Problem hier gelöst werden konnte.

              Kommentar


              • #8
                Das Problem ist: Du steckst etwas in bbcode2html und hinten kommt etwas anderes heraus, als du möchtest. Dann solltest du diese Funktion umschreiben...

                Hast du Code?

                Kommentar


                • #9
                  Hier das ganze Konstrukt.

                  Die index.php öffnet functions.php und ctrl_freitext.php und ruft die im Controller enthaltene Funktion auf:

                  Code:
                  require_once('./admin/incl/functions.php');
                  require_once('./controllers/ctrl_freitext.php');
                  ctrl_freitext($pageid);
                  Die ctrl_freitext.php holt die Daten aus der DB, verarbeitet diese mit der Funktion bbcode2html(), öffnet tpl_freitext.php und ruft die Funktion tpl_freitext() auf:

                  Code:
                  $sql = mysql_query("SELECT content FROM " . $config['tb']['content'] . " WHERE navi = " . $pageid);
                  $abfrage = mysql_fetch_object($sql);
                  $data = bbcode2html($abfrage->content);
                  require_once('./templates/tpl_freitext.php');
                  tpl_freitext($data);
                  Die Funktion bbcode2html() macht folgendes:

                  Code:
                  $suchmuster = "/\[mail=([.-_a-z0-9@]*)\]([.-_a-z0-9@]*)\[\/mail\]/";
                  preg_match_all($suchmuster, $data, $treffer);
                  unset($treffer[0]);
                  $i = 0;
                  foreach($treffer[1] AS $id => $mailadresse) {
                  	$zielname = ($treffer[2][$i] != '') ? $treffer[2][$i] : $mailadresse;
                  	$data = str_replace('[mail='.$mailadresse.']' . $treffer[2][$i] . '[/mail]', getEncodedMail($mailadresse, $treffer[2][$i]), $data);
                  	$i++;
                  }
                  $trans = array(	''	=>	'<b>',
                  		''	=>	'</b>',
                  		'[ul]'	=>	'<ul>',
                  		'[/ul]'	=>	'</ul>',
                  		'[li]'	=>	'<li>',
                  		'[/li]'	=>	'</li>');
                  return strtr($data, $trans);
                  Die Funktion getEncodedMail() ruft die E-Mail-Klasse auf, die ich nicht selber geschrieben habe:

                  Code:
                  require_once('./includes/emailcode.class.php');
                  $emailcode = new ClassEmailcode();
                  return $emailcode->emailgetencode($mail, $text);
                  Die emailcode.class.php poste ich in einem separaten Beitrag, da diese etwas länger ist.

                  Die Funktion tpl_freitext() in der tpl_freitext.php macht nichts anderes, als die erhaltenen Daten mit echo auszugeben:

                  Code:
                  function tpl_freitext($data) {
                  	echo $data;
                  }
                  Wenn ich in der Funktion bbcode2html() die Funktion getEncodedMail() direkt mit Echo ausgebe, wird alles richtig angezeigt. Nur wenn ich das Javascript als Teil von $data über Return weitergebe, werden die <br />-Tags im Quelltext sichtbar. Da hilft es auch nichts, wenn ich in der bbcode2html() die Tags rausfiltere - die bleiben drin.

                  Wenn noch mehr Infos benötigt werden, bitte Info. Danke schon im Voraus für eure Hilfe!

                  Kommentar


                  • #10
                    Die emailcode.class.php ist im Anhang (Code zu lang).
                    Angehängte Dateien

                    Kommentar

                    Lädt...
                    X