Απόκρυψη διευθύνσεων email με JavaScript

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από skeftomilos » 04 Μάιος 2005 08:48

Ας υποθέσουμε ότι θέλουμε να προσθέσουμε μερικές διευθύνσεις email σε κάποια web σελίδα μας, με τέτοιο τρόπο ώστε ο κάθε χρήστης να μπορεί κάνοντας ένα κλικ να μας στείλει ένα μήνυμα. Ο HTML κώδικας που χρειάζεται είναι πολύ απλός:

Κώδικας: Επιλογή όλων

<a href="mailto&#58;john@yahoo.com">Contact John</a>
Το πρόβλημα είναι ότι η διεύθυνση είναι εντελώς απροστάτευτη από τα robot των spammers, και αργά ή γρήγορα (μάλλον γρήγορα!) θα καταλήξει στις λίστες τους. Υπάρχουν διάφορες τεχνικές παραμόρφωσης μία διεύθυνσης ώστε να μην αναγνωρίζεται από τα robot (π.χ. "john at yahoo dot com" ή μετατροπή του κειμένου σε image), αλλά δεν συμβιβάζονται με την επιθυμία μας για ενεργά "mailto" links. θα προτείνω μία τεχνική με JavaScript που μπορεί να κάνει την απαιτούμενη απόκρυψη:

Κώδικας: Επιλογή όλων

<html>
  <head>
    <script type="text/javascript">
      function window_load&#40;&#41; &#123;
        window.load_time = new Date&#40;&#41;
      &#125;
      function mail&#40;element&#41; &#123;
        if &#40;window.load_time && &#40;new Date&#40;&#41;.getTime&#40;&#41; - window.load_time.getTime&#40;&#41; > 2000&#41;&#41; &#123;
          var addr = element.getAttribute&#40;"mailto"&#41;
          addr = addr.replace&#40;"&#40;y&#41;", "@yahoo.com"&#41;
          addr = addr.replace&#40;"&#40;h&#41;", "@hotmail.com"&#41;
          addr = addr.replace&#40;"&#40;g&#41;", "@gmail.com"&#41;
          element.setAttribute&#40;"title", addr&#41;
          element.setAttribute&#40;"href", "mailto&#58;" + addr&#41;
        &#125;
      &#125;
    </script>
  </head>
  <body onload="window_load&#40;&#41;">
    <a href="johnmail.png" mailto="john&#40;y&#41;" onmouseover="mail&#40;this&#41;" onclick="mail&#40;this&#41;">Contact John</a><br>
    <a href="marymail.png" mailto="mary&#40;h&#41;" onmouseover="mail&#40;this&#41;" onclick="mail&#40;this&#41;">Contact Mary</a><br>
    <a href="alexmail.png" mailto="alex&#40;g&#41;" onmouseover="mail&#40;this&#41;" onclick="mail&#40;this&#41;">Contact Alex</a><br>
  </body>
</html>
Η αρχική διεύθυνση των links είναι ένα image με την αντίστοιχη διεύθυνση email, και χρειάζεται για την περίπτωση που ο χρήστης έχει απενεργοποιήσει τη JavaScript. Στην κανονική περίπτωση που η JavaScript είναι ενεργή, οι διευθύνσεις αυτές θα αντικατασταθούν μόλις ο χρήστης κάνει mouseover ή click στο link. Για παράδειγμα η αρχική διεύθυνση johnmail.png θα γίνει mailto:john@yahoo.com. Σε κάθε link υπάρχει ένα custom attribute ("mailto") που περιέχει κωδικοποιημένη την email διεύθυνση. Π.χ. ο κωδικός "john(y)" σημαίνει ο john στο yahoo. Για την αποκωδικοποίηση της διεύθυνσης και τη μεταφορά της στο href φροντίζει η ρουτίνα mail(). Όπως βλέπετε η ρουτίνα γνωρίζει τι σημαίνει (y), (h) και (g), και μπορούμε με τον ίδιο τρόπο να προσθέσουμε περισσότερους email providers αν υπάρχει ανάγκη. Εκτός από το href προσθέτουμε την αποκωδικοποιημένη διεύθυνση και στο title ώστε ο χρήστης να βλέπει ένα tool-tip όταν αιωρεί το mouse πάνω από το link.

Είναι ασφαλής αυτή η τεχνική? Σίγουρα όχι απόλυτα. Πάντως μας προφυλάσσει από τις πιο αφελείς επιθέσεις. Ο πηγαίος κώδικας της σελίδας δεν περιέχει καμία email διεύθυνση, παρά μόνο τους κρυπτικούς κωδικούς τύπου "john(y)". Ακόμα δε κι αυτοί δε βρίσκονται στο HTML κείμενο ή στο script αλλά σε ένα άγνωστο attribute. Αν το robot του spammer είναι εξυπνότερο, πιθανότατα θα αναλύσει τη σελίδα με τη μέθοδο DOM που χρησιμοποιούν και οι browsers. Components με δυνατότητες browser υπάρχουν ευρέως διαθέσιμα, οπότε αυτό δεν είναι πρόβλημα για τον αποφασισμένο κυνηγό διευθύνσεων. Το μόνο κόστος είναι ο επιπλέον φόρτος για τη CPU του server. Όμως ούτε μέσα από το DOM μπορεί να βρεθεί ίχνος διευθύνσεων στην παραπάνω σελίδα. Ο λόγος είναι ότι η αποκωδικοποίηση δε γίνεται αυτόματα στο onload αλλά απαιτεί μία ενέργεια του χρήστη, mouseover ή click.

Έτσι ο spammer θα πρέπει να βάλει το robot να εκτελεί και τα scripts της σελίδας. Οι αναρίθμητοι δυνατοί τρόποι εκτέλεσης των scripts κάνουν αυτό το έργο αποκαρδιωτικό. Το robot θα πρέπει να φορτώσει δεκάδες οι και εκατοντάδες φορές της ίδια σελίδα, να τρέξει μία λίγο-πολύ τυχαία σειρά από scripts και να εξετάσει το DOM για email patterns. Πολλά δευτερόλεπτα επεξεργασίας για κάθε σελίδα, ενώ οι προς εξέταση σελίδες μετριούνται σε εκατομμύρια. Και όλα αυτά για μια συγκομιδή διευθύνσεων μάλλον μηδαμινή.

Αν πάντως ο spammer διαβάσει αυτό το άρθρο και πιστέψει ότι αυτή η τεχνική θα χρησιμοποιηθεί σε αρκετό βαθμό, ίσως αποφασίσει να τρέχει σε όλες τις σελίδες τα συγκεκριμένα scripts που μπορούν να νικήσουν τη συγκεκριμένη αμυντική οχύρωση. Μπορεί στο 99,9% των σελίδων τα scripts να τρέχουν τσάμπα, αλλά ακόμα και το 0,1% είναι αρκετό αν κρύβει ζουμερές διευθύνσεις. Το αντίμετρο λοιπόν για αυτή την τεχνική είναι το εξής: Έυρεση όλων των links (εύκολο), εκτέλεση του συμβάντος onmouseover του καθενός (εύκολο), και ανάγνωση του attribute href ή title (εύκολο). Επομένως προκύπτει ότι αυτή και παρόμοιες τεχνικές είναι ασφαλείς όταν και για όσο παραμένουν αδημοσίευτες. Φυσικά θα ήθελα πολύ να ενισχύσω την τεχνική έτσι ώστε να διατηρεί την ισχύ της και σε συνθήκες δημοσιότητας, αλλά δεν είναι και τόσο απλό. Μία λύση που εφάρμοσα στο παραπάνω παράδειγμα είναι η παρεμπόδιση της λειτουργίας του script για τα δύο πρώτα δευτερόλεπτα μετά το φόρτωμα της σελίδας. Το σκεπτικό είναι ότι αυτά τα δύο δευτερόλεπτα καθυστέρησης είναι μάλλον απίθανο να ενοχλήσουν το χρήστη (δε θα τα καταλάβει καν), αλλά ίσως κάνουν τον spammer να αποφασίσει ότι η καθυστέρηση του robot είναι πολύ μεγάλη για να αξίζει τον κόπο. Προϋπόθεση είναι βέβαια να υποχρεώσουμε τον spammer να αργοπορεί δύο δευτερόλεπτα σε όλες τις σελίδες που εξετάζει και όχι μόνο στη δική μας, άρα δεν πρέπει να αφήσουμε ορατή την "ταυτότητα" της τεχνικής.

Αν τελικά αποφασίσετε να χρησιμοποιήσετε αυτή την τεχνική, κάντε το με δική σας ευθύνη. Σε κάθε περίπτωση σας συμβουλεύω να αλλάξετε τα ονόματα όλων των συναρτήσεων, των μεταβλητών και του custom attribute, και βέβαια τον τρόπο κωδικοποίησης της email διεύθυνσης. Επιπλέον αν κάποιος έχει καμιά ιδέα για την περαιτέρω ενίσχυση της τεχνικής, περιμένω να την ακούσω με ενδιαφέρον.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 19 Οκτ 2006 22:08

/respect

Ιδέες..
1) Θα μπορούσε να βγαίνει ένα 'a' . md5(microtime()) όνομα για κάθε function, διαφορετικό κάθε φορά που ανοίγει η σελίδα
2) Θα μπορούσαν να υπάρχουν πολλά functions τα οποία να εκτελούνε μία εντολή κάθε φορά (σαν opcodes) και άλλα functions τα οποία να τα συντονίζουν, αλλά και άλλα που να υπάρχουν σαν σκουπίδια. Mini obfuscator δηλαδή..

θα κάτσω να κάνω καμιά εφαρμογή σε αυτά που λέω.. μου έδωσες ωραίες ιδέες skeftomilε :)

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από alkisg » 19 Οκτ 2006 22:31

Βασικά Skeftomile δεν ξέρω κανένα bot που να υποστηρίζει javascript... Τα bots συνήθως είναι σε κάποια μη-gui γλώσσα, όπως perl, php, python, C, C++, Delphi...
Για Javascript υποστήριξη ο μόνος τρόπος που ξέρω είναι να χρησιμοποιηθεί κάποιο component είτε του Mozilla είτε του MSIE. Σιγά να μην κάτσει κανένας να φτιάξει τέτοιο bot... Και δε θα έχει και ωφέλη, αφού θα τρέχει πολύ πιο αργά και θα σκανάρει έτσι λιγότερες σελίδες, άρα αν και θα έχει μεγαλύτερο ποσοστό επιτυχίας, θα συλλέγει τελικά λιγότερες διευθύνσεις...

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από skeftomilos » 20 Οκτ 2006 01:34

cpulse μου φαίνεται πως το προσεγγίζεις σωστά. Είμαι περίεργος να δω τι θα φτιάξεις. :)

Άλκη μπορεί να έχεις δίκιο, δεν είμαι καθόλου ενημερωμένος σχετικά με το τι crawlers κυκλοφορούν. Από την άλλη σκέφτομαι πως δεν είναι δύσκολα προγράμματα στην κατασκευή τους. Π.χ. η ενσωμάτωση του Browser component της MS είναι υπόθεση πέντε γραμμών κώδικα.

Στα τρία τελευταία μου projects ενσωμάτωσα τεχνικές προστασίας για τα emails, στο ένα μετά από απαίτηση του - πνιγμένου στο spam - πελάτη. Που σημαίνει ότι σε αυτά δεν υπάρχουν πουθενά διευθύνσεις στο source. Αν τυχόν επικρατήσει μια τέτοια τάση, η συγκομιδή των κοινών robot θα μειωθεί τόσο που ίσως οι spammers να σκεφτούν να τα κάνουν πιο έξυπνα. Η αύξηση απαιτήσεων σε CPU μπορεί να μην είναι σημαντικό εμπόδιο, δεδομένου ότι το bot καθυστερεί έτσι και αλλιώς με το να κατεβάζει σελίδες από ένα δίκτυο με πεπερασμένο bandwidth.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 20 Οκτ 2006 02:50

Στο προγραμματισμό έχω κάνει πολλά παλαβά πράγματα.. ένα ήταν να φτιάξω και μια search-ο-μηχανή. Δεν θα μπω σε λεπτομέρειες για αυτό που θα πω γιατί μπορεί να δώσω ιδέες σε κακόβουλους.. αλλά σε γενικές γραμμές το script του σκεφτόμυλου μπορεί να έχει πολύ επιπλέον αποτελεσματικότητα αν το global variable window.load_time το σετάρει ένας timer! Πραγματικά είναι πολύ καλή η προσέγγιση σου σκεφτόμυλε!

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 23 Οκτ 2006 11:44

Προσοχή Προσοχή! Το κείμενο που ακολουθεί είναι για παρανοϊκούς.. αν είστε λογικός άνθρωπος προλαβαίνετε να φύγετε από το thread όσο είναι καιρός.

Έφτιαξα μια μέθοδο με ελαφριά κρυπτογράφηση.. στο δρόμο κατάλαβα οτι μπορεί να λειτουργήσει από μόνη της οπότε δεν έκανα ακριβώς αυτά που έλεγα πριν με τα opcodes.

Η κρυπτογράφηση είναι πολύ ελαφριά.. αλλά αρκετή για να μην βγαίνει απολύτως κανένα νόημα από ηλίθια έως καλά bots. Με πολύ λίγα λόγια απομονώνω τα δύο LSB, τα αποθηκεύω σε hashes και αντικαθιστώ τα πρωτότυπα με τυχαία bits. Χρησιμοποιώ για hashes το φάσμα των ASCII 40 έως 124.. για να αποφύγω τα quotes και double quotes και επίσης να μην μπω στο πεδίο των Unicode χαρακτήρων.

Ο χρήστης μπορεί να βάλει ένα email με την μορφή

Κώδικας: Επιλογή όλων

<a href="mailto&#58;address@example.com>email me</a>
και το PHP σκριπτάκι που τρέχει σαν wrapper του script αναλαμβάνει να κρυπτογραφήσει τα mail links με τυχαίες ακολουθίες. Από κει και πέρα ακολουθώ τα βήματα του Σκεφτόμυλου.

Κώδικας: Επιλογή όλων

<?php
$bases = array&#40;&#41;;
for &#40;$i = 40; $i <= 124; $i += 4&#41; $bases&#91;&#93; = $i;

$onload_key_count = 0;
$onload_keys = '';

function scramble_email&#40;$m&#41; &#123;
  global $bases, $onload_key_count, $onload_keys;
  $hash = '';
  $encoded = '';

  $len = strlen&#40;$m&#91;1&#93;&#41;;
  $base_end = count&#40;$bases&#41; - 1;
  for &#40;$i = 0; $i < $len; $i++&#41; &#123;
    $h = 0;
    $c = ord&#40;$m&#91;1&#93;&#91;$i&#93;&#41;;
    if &#40;$c & 1&#41; &#123;
      $h += 1;
      $c -= 1;
    &#125;
    if &#40;$c & 2&#41; &#123;
      $h += 2;
      $c -= 2;
    &#125;

    $hash .= chr&#40;$bases&#91;rand&#40;0, $base_end&#41;&#93; + $h&#41;;

    if &#40;rand&#40;0, 1&#41; == 1&#41; $c += 1;
    if &#40;rand&#40;0, 1&#41; == 1&#41; $c += 2;
    $encoded .= chr&#40;$c&#41;;
  &#125;

  $onload_keys .= "    window.k&#91;$onload_key_count&#93;='$hash';\n";
  $onload_key_count++;

  return '<a href="#" k="' . &#40;$onload_key_count - 1&#41; . '" addr="' . addslashes&#40;$encoded&#41; . '" onmouseover="mail&#40;this&#41;" onclick="mail&#40;this&#41;"';
&#125;

function ob_handle&#40;$buffer&#41; &#123;
	$buffer = preg_replace_callback&#40;'/<a href="mailto&#58;&#40;&#91;^"&#93;+&#41;"/i', 'scramble_email', $buffer&#41;;
	return str_replace&#40;'//ONLOAD_KEYS', $GLOBALS&#91;'onload_keys'&#93;, $buffer&#41;;
&#125;
ob_start&#40;'ob_handle'&#41;;

?>
<!-- saved from url=&#40;0014&#41;about&#58;internet -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http&#58;//www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
<!--//
  function window_load&#40;&#41; &#123;
    window.load_time = new Date&#40;&#41;;
    window.k = new Array;
//ONLOAD_KEYS
  &#125;

  function decode&#40;encoded, hash&#41; &#123;
    var c, h, decoded = '';

    for &#40;var i = 0; i < encoded.length; i++&#41; &#123;
      c = encoded.charCodeAt&#40;i&#41;;
      if &#40;c & 1&#41; c -= 1;
      if &#40;c & 2&#41; c -= 2;

      h = hash.charCodeAt&#40;i&#41;;
      if &#40;h & 1&#41; c += 1;
      if &#40;h & 2&#41; c += 2;

      decoded += String.fromCharCode&#40;c&#41;;
    &#125;
    return decoded;
  &#125;

  function mail&#40;element&#41; &#123;
    if &#40;window.load_time && &#40;new Date&#40;&#41;.getTime&#40;&#41; - window.load_time.getTime&#40;&#41; > 2000&#41;&#41; &#123;
       var addr = decode&#40;element.getAttribute&#40;'addr'&#41;, window.k&#91;element.getAttribute&#40;'k'&#41;&#93;&#41;;
       element.setAttribute&#40;'title', addr&#41;;
       element.setAttribute&#40;'href', 'mailto&#58;' + addr&#41;;
    &#125;
  &#125;
//-->
</script>

</head>

<body onload="window_load&#40;&#41;">

<p><a href="mailto&#58;address@example.com">contact</a></p>

</body>
</html>
Για κάποιο λόγο όμως δεν αλλάζουν τα links όπως πρέπει.. ειδικά ο ΙΕ στο 1ο click ακολουθεί το κεντρικό link στο href και αφού κάνει click μετά αλλάζει το href. Στο 2ο click δουλεύει σωστά. Δεν είμαι όμως και τόσο καλός στην JavaScript.. οπότε ίσως κάποιος άλλος να μπορεί λύσει αυτό το μυστήριο.

Όπως είχα γράψει και στο προηγούμενο post έβαλα και timer στο onload:

Κώδικας: Επιλογή όλων

<body onload="setTimeout&#40;function&#40;&#41; &#123; window_load&#40;&#41;; &#125;, 300&#41;">
Αλλά το έβγαλα μήπως φταίει αυτό που δεν λειτουργούν τα links σωστά.

Υπάρχει μια λύση.. στο onload να δημιουργούνται εκεί τα hrefs. Αλλά θα μείωνε την προστασία από τα bots..

Επίσης το ίδιο script μπορεί να δουλέψει και σαν αντικατάστατο το captcha.. όταν λυθεί αυτό το πρόβλημα μπορούμε να το επεκτείνουμε κι εκεί.

Για όσους θέλουν να πειραματιστούνε το function της κωδικοποίησης σε javascript είναι:

Κώδικας: Επιλογή όλων

  function encode&#40;input&#41; &#123;
    var i, h, c, encoded = '', hash = '';

    var bases = new Array;
    for &#40;i = 40; i <= 124; i += 4&#41; bases.push&#40;i&#41;;

    for &#40;i = 0; i < input.length; i++&#41; &#123;
      h = 0;
      c = input.charCodeAt&#40;i&#41;;
      if &#40;c & 1&#41; &#123;
        h += 1;
        c -= 1;
      &#125;
      if &#40;c & 2&#41; &#123;
        h += 2;
        c -= 2;
      &#125;

      hash += String.fromCharCode&#40;bases&#91;Math.floor&#40;Math.random&#40;&#41; * bases.length&#41;&#93; + h&#41;;

      if &#40;Math.random&#40;&#41; >= 0.5&#41; c += 1;
      if &#40;Math.random&#40;&#41; >= 0.5&#41; c += 2;
      encoded += String.fromCharCode&#40;c&#41;;
    &#125;

    return &#123;encoded&#58;encoded, hash&#58;hash&#125;;
  &#125;


== Edit ==
- Άλλαξα ένα htmlspecialchars() που είχε σε κάποιο σημείο σε addslashes()
- Έβγαλα το onmousemove event στα replacements.. δεν χρειαζόνταν απλά το έβαλα μέσα στις παραλλαγές μήπως και το κάνω να δουλέψει σωστά.
- Το <!-- saved from url=(0014)about:internet --> χρειάζεται μόνο για να τρέχει local σε Internet Exploder.. στα live δεν χρειάζεται.
Τελευταία επεξεργασία από το μέλος cpulse την 24 Οκτ 2006 00:11, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από ThyClub » 23 Οκτ 2006 23:25

Το διάβασα όλο... Είμαι παρανοικός?

Double respect :O

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 24 Οκτ 2006 00:12

ThyClub έγραψε:Το διάβασα όλο... Είμαι παρανοικός?
Standard!!!

Τι respect βρε;; πες καμιά ιδέα να το φτιάξουμε :p

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από skeftomilos » 24 Οκτ 2006 01:06

Πολύ καλή προσπάθεια cpulse! :D

Ο λόγος που μερικές φορές δε δουλεύει είναι ότι ο χαρακτήρας \ (back slash) χρειάζεται escape:

Κώδικας: Επιλογή όλων

$hash = str_replace&#40;"\\", "\\\\", $hash&#41;;
Σε ότι αφορά τη JavaScript είναι μερικές βελτιώσεις που μπορώ να προτείνω. Κατ' αρχήν όπως έμαθα αργότερα το συμβάν onload τρέχει μετά το φόρτωμα όλων των γραφικών της σελίδας, που είναι μάλλον πολύ αργά. Η window.load_time Θα μπορούσε εναλλακτικά να αρχικοποιηθεί στο κάτω μέρος της σελίδας, πριν το </body>:

Κώδικας: Επιλογή όλων

    <script type="text/javascript">window.load_time = new Date&#40;&#41;;</script>
  </body>
</html>
Ακόμα είναι εφικτό να παραληφθεί το δεύτερο attribute k. Η ίδια η τιμή του attribute addr μπορεί να χρησιμοποιηθεί ως indexer:

Κώδικας: Επιλογή όλων

window.k = &#123;
  '`ferfrsCexblqod-bol' &#58; 'u<|&#58;yCWHelqm0d&#93;&#58;_&#91;y',
  'hoknCzchol,bnl' &#58; 'v/LV`umLo+fO+m'
&#125;
...
...window.k&#91;element.getAttribute&#40;'attr'&#41;&#93;...
Η ταυτότητα της τεχνικής δεν είναι καλά κρυμμένη. Ένα έξυπνο robot θα μπορούσε να κάνει έναν έλεγχο για ταυτόχρονη ύπαρξη window_load() και window.k[ στο source, οπότε θα ήξερε με τι είχε να κάνει και θα ενεργούσε ανάλογα. Όμως αυτό ΔΕΝ είναι κάτι που λύνεται εύκολα.

Αντί για href="#" μπορεί να υπάρχει κάποιο καταλληλότερο link για τους χωρίς JavaScript χρήστες, όπως:

Κώδικας: Επιλογή όλων

href="image.php?k=`ferfrsCexblqod-bol"
...και η σελίδα image.php να παράγει δυναμικά ένα image με γραμμένο το email. Δυστυχώς δε νομίζω να υπάρχει τρόπος να αντιμετωπιστεί ικανοποιητικά ο συνδυασμός: Όχι_JavaScript/Πρόβλημα_όρασης/Spam_Protection

Δεν υπάρχει πρόβλεψη για navigation χωρίς χρήση mouse, με τα πλήκτρα Tab και Enter. Τα συμβάντα onmouseover και onclick δεν είναι αρκετά, χρειάζεται και το onfocus. To onmousemove μάλλον δε χρειάζεται.

Το PHP script δε θα κάνει αντικατάσταση όσων links αν έχουν επιπλέον attribute πριν το href, όπως id, class, style, title κ.λπ. Επίσης δεν αντικαθιστά διευθύνσεις σε στοιχεία AREA μέσα σε MAP. Αυτά είναι βέβαια προβλήματα που λύνονται. :)

Αν τελικά προκύψει ένα πολύ special PHP πακέτο θα είναι ωραία αν μεταφερθεί και σε άλλες server-side πλατφόρμες. Π.χ. η ASP.NET μπορεί (αν και πιο δύσκολα) να κάνει παρόμοια πράγματα με την ob_start χρησιμοποιώντας Filters.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 24 Οκτ 2006 01:33

Sweeeet :)

Θα πρέπει να δώσω λίγο χρόνο σε κάτι άλλες δουλίτσες που έχω και θα το ολοκληρώσουμε σίγουρα αυτό.. υπάρχουν κι άλλες ιδέες που μου έρχονται στο μυαλό.. πχ τα window.k να φορτώνονται από ξεχωριστό .js αρχείο.. ή να λειτουργούν όλα με κάπoιο τυχαίο seed σε κάθε session. Τα περισσότερα bots δεν κρατάνε cookies άρα αναγκάζονται να χρησιμοποιούνε διαφορετικό session σε κάθε hit. Ή να χρησιμοποιηθεί το ETag από τα HTTP headers.. όσο έχεις όρεξη μπορείς να φτιάχνεις μεθόδους..

Αύριο επανέρχομαι δριμήτερος :)

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από alkisg » 24 Οκτ 2006 10:17

Επίσης η php μπορεί να δημιουργήσει και image μέσω gd ή imagemagik...
http://www.houseoftech.com/scripts.php

Θα ήταν ωραίο να φτιάχναμε μια συνάρτηση σε php, asp κτλ που θα παρήγαγε αυτόματα και την εικόνα αλλά και την αντίστοιχη javascript που αν είναι ενεργοποιημένη η javascript θα αντικαθιστά την εικόνα με κείμενο και θα φτιάχνει και το href...

Και όλο αυτό να το καλούμε απλά σαν
<? DumpEmail('myemail@domain.gr', style, encryption) ?>

όπου το encryption είναι κάποιο data (π.χ. αριθμός) ξεχωριστό για κάθε site, ώστε κάθε κρυπτογραφημένο email να βγαίνει διαφορετικό και να αποκλείεται να το πιάνουν τα bots...

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 24 Οκτ 2006 23:31

Ουφ.. λοιπόν.. σας δίνω ό,τι έχω μέχρι τώρα.. ετοιμάζω κι άλλα :)
Το "01" στο file name επειδή ακολουθούν κι άλλα με διαφορετικές προσεγγίσεις.

js_email_antispam_01.php

Κώδικας: Επιλογή όλων

<?php

$onload_key_count = 0;
$onload_keys = '';

function scramble_email&#40;$m&#41; &#123;
  global $onload_key_count, $onload_keys;

  $link = '';
  $odd = true;
  $onload_keys .= ",'";
  $len = strlen&#40;$m&#91;1&#93;&#41;;
  for &#40;$i = 0; $i < $len; $i++&#41; &#123;
	  $odd = !$odd;
	  if &#40;$odd&#41; $onload_keys .= str_pad&#40;dechex&#40;ord&#40;$m&#91;1&#93;&#91;$i&#93;&#41;&#41;, 2, '0', STR_PAD_LEFT&#41;;
	  else $link .= str_pad&#40;dechex&#40;ord&#40;$m&#91;1&#93;&#91;$i&#93;&#41;&#41;, 2, '0', STR_PAD_LEFT&#41;;
  &#125;
  $onload_keys .= "'";

  $onload_key_count++;
  return 'href="javascript&#58;nospam&#40;&#41;" k="' . &#40;$onload_key_count - 1&#41; . '" addr="' . $link . '" onfocus="mail&#40;this&#41;"';
&#125;

function ob_handle&#40;$buffer&#41; &#123;
  global $onload_keys;

  $buffer = preg_replace_callback&#40;'/href="mailto&#58;&#40;&#91;^"&#93;+&#41;"/i', 'scramble_email', $buffer&#41;;

  if &#40;$onload_keys != ''&#41; $onload_keys = substr&#40;$onload_keys, 1&#41;;
  return str_replace&#40;'/* ONLOAD_KEYS */', 'window.k = new Array&#40;' . $onload_keys . '&#41;;', $buffer&#41;;
&#125;
ob_start&#40;'ob_handle'&#41;;

?>
<!-- saved from url=&#40;0014&#41;about&#58;internet -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http&#58;//www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
  function decode&#40;addr, wink&#41; &#123;
    var iAddr = -2, iWink = -2, decoded = '';
    while &#40;1&#41; &#123;
      iAddr += 2;
      if &#40;iAddr >= addr.length&#41; break;
      decoded += String.fromCharCode&#40;parseInt&#40;addr.substr&#40;iAddr, 2&#41;, 16&#41;&#41;;
      iWink += 2;
      if &#40;iWink >= wink.length&#41; break;
      decoded += String.fromCharCode&#40;parseInt&#40;wink.substr&#40;iWink, 2&#41;, 16&#41;&#41;;
    &#125;
    return decoded;
  &#125;

  function mail&#40;element&#41; &#123;
    if &#40;window.load_time && &#40;new Date&#40;&#41;.getTime&#40;&#41; - window.load_time.getTime&#40;&#41; > 1000&#41;&#41; &#123;
       var addr = decode&#40;element.getAttribute&#40;'addr'&#41;, window.k&#91;element.getAttribute&#40;'k'&#41;&#93;&#41;;
       element.setAttribute&#40;'title', addr&#41;;
       element.setAttribute&#40;'href', 'mailto&#58;' + addr&#41;;
    &#125;
  &#125;

  function nospam&#40;&#41; &#123;
    alert&#40;'If you see this message you are problably using spam software, or JavaScript is disabled.\nPlease retry using a regular internet browser with enabled JavaScript.'&#41;;
    void&#40;0&#41;;
  &#125;
</script>

</head>

<body>

  <p><a href="mailto&#58;address@example.com">mail</a></p>

  <script type="text/javascript"> window.load_time = new Date&#40;&#41;; /* ONLOAD_KEYS */ </script>
</body>
</html>

Αλλαγές από το προηγούμενο:
- Αντι να χωρίζω τα τελευταία bits, σπάω εναλλάξ τα bytes.. ένα byte στο window.k ένα στο addr attribute κοκ. Και βγαίνουν σε δεκαεξαδική μορφή για να μην υπάρχει πρόβλημα με ειδικούς χαρακτήρες.
- Ελαφρά τροποποιημένο ο regular expression για να αντιμετωπίσει καλύτερα τα προβλήματα που ανέφερε ο Θοδωρής
- Μίκρυνα τον timer στα 1000 milliseconds
- Το window.load_time στο κάτω μέρος του body όπως διέταξε ο master skeftomilos
- Τελικά στα replacements το onfocus είναι αρκετό.. οπότε δεν υπάρχει πλέον ούτε onclick ούτε onmouseover. Και λειτουργεί και το tab ;-)
- Για link.. αν ακολουθήσω την ιδέα σου Θοδωρή με τα images θα πρέπει να βάλω και τα δύο κλειδιά, το οποίο χαμηλώνει το επίπεδο ασφάλειας. Κάτι άλλο θα πρέπει να υπάρχει εκεί.. ίσως κάποιο hashed key το οποίο θα είναι κρυμμένο σε sessions. Προς το παρόν έβαλα ένα javascriptoμηνυματάκι.

Τι ακολουθεί:
- Μια έκδοση με ένα εξωτερικό .js αρχείο. Το PHP θα βγάζει τα ίδια αποτελέσματα αλλά τα window.k θα είναι XORed και το εξωτερικό .js θα τα ξε-XORάρει ;-) Γι αυτό χρησιμεύει πολύ η μορφή που έφτιαξα ποιό πάνω με τα δεκαεξαδικά. Μπορεί κάποιος πραγματικά να κάνει πολλά με τέτοια κόλπα.. πχ να τα XORοποιεί με cookies.. get vars.. ό,τι του κατεβάσει το παλαβό μυαλό του. Εγώ σκέφτηκα να το κάνω με στατικούς πίνακες που να αλλάζουν όταν το PHP καταλάβει οτι το mtime του εξωτερικού .js είναι παλιό.
- Μια super ιδέα που την μισοφανταζόμουνα κατά καιρούς αλλά με πώρωσε ο Άλκης.. Captcha με κομμένες εικόνες και ονόματα αρχείων που αλλάζουν κάθε τρείς και λίγο.. σαν το computer να παίζει τον παπά. Με ολόκληρες εικόνες.. γίνεται εύκολα αλλά επίσης σπάει εύκολα. Οι σωστές προσεγγίσεις είναι με distorted εικόνες.

Πολύ sexy η μέρα σήμερα.. όλο ιδέες και για αυτό, αλλά και για κάτι άλλα πολύ ζόρικα scriptάκια που θα μπορώ να σας δείξω σε λίγο καιρό :)

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από skeftomilos » 25 Οκτ 2006 02:55

Γμτ και έλεγα ότι θα κοιμηθώ νωρίς σήμερα... :D

Η κωδικοποίηση είναι βελτιωμένη σε σχέση με την προηγούμενη έκδοση. Η parseInt αστράφτει με την παρουσία της. Νομίζω όμως ότι περισσότερη ή λιγότερη πολυπλοκότητα δεν κάνει σημαντική διαφορά, γιατί αν το robot ξέρει που είναι τα data θα κάνει τον υπολογισμό στο πι και φι. Το ζήτημα είναι να μη μπορεί να βρεθεί με αυτόματο τρόπο η θέση των δεδομένων ή να μην είναι σταθερή και προβλέψιμη η ρουτίνα αποκωδικοποίησης.

Το array window.k μπορεί να γίνει αιτία συγκρούσεων ονομάτων. Οι ιδιότητες του αντικειμένου window και το global namespace της JavaScript είναι ένα και το αυτό. Για παράδειγμα ο παρακάτω κώδικας εμφανίζει popup με τον αριθμό 10:

Κώδικας: Επιλογή όλων

window.k = &#91;&#93;
var k = 10
alert&#40;window.k&#41;
Επομένως θα χρειαστεί κάποιο καλύτερο namaspace για τις global μεταβλητές, π.χ. SpAm$PrOtEcToR

Κώδικας: Επιλογή όλων

<script type="text/javascript">var SpAm$PrOtEcToR = &#123;load_time&#58; new Date&#40;&#41;, k&#58; &#91;'64727340786d6c2e6f'&#93;&#125;</script>
Ακόμα καλύτερα αν το namespace είναι τυχαίο και διαφορετικό από response σε response.

Ορισμένοι πελάτες έχουν αρχίσει να ζητάνε W3C valid sites, που σημαίνει ότι γι αυτούς θα υπάρξει πρόβλημα με τα custom attributes addr και k. Μια λύση είναι να μεταφερθεί το κωδικοποιημένο email εκεί που ήταν αρχικά, δηλαδή στο href. Ο indexer k μπορεί να ενσωματωθεί με τα data, π.χ.:

Κώδικας: Επιλογή όλων

href="image.php?addr=64727340786d6c2e6f&amp;k=0"
Το συμβάν onmouseover είναι χρήσιμο για να φαίνεται το email στη statusbar, όταν ο χρήστης κάνει mouseover. Το onclick μοιάζει πράγματι να είναι περιττό, αλλά θυμάμαι το είχα προσθέσει για το φόβο των Ιουδαίων (= άγνωστων browsers). :)

Τέλος να ένα demo με Captcha κομμένης εικόνας. Πιστεύεται ότι παρέχει καλή προστασία;

- Απόκρυψη email με χρήση δύο εικόνων
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 25 Οκτ 2006 23:25

Νομίζω οτι αυτή η έκδοση είναι αριστούργημα..
Λοιπόν στο δρόμο κατάλαβα οτι αν χρησιμοποιήσω XORs δεν χρειάζονται και πολύ τα διπλά κλειδιά.

Πως δουλεύει αυτή η έκδοση..
Ψάχνει για href="mailto:address@example.com".. αλλάζει τα bits με την μέθοδο του XOR και με βάση συγκεκριμένα κλειδιά. Βγάζει το αποτέλεσμα με την μορφή δεκαεξαδικών αριθμών για να μην υπάρχει πρόβλημα με control characters, quotes, ανισότητες κτλ.

Όταν η σελιδούλα φτάσει στον ηρωικό user η διεύθυνση δεν λειτουργεί αν δεν περάσει ένα δευτερόλεπτο.. 300 milliseconds για να φορτώσει η μεταβλητή που κρατάει χρόνο φόρτωσης και άλλα 700 milliseconds για extra ασφάλεια. Η ιδέα του Σκεφτόμυλου είναι πραγματικά φοβερή.. ο λόγος είναι οτι τα spam bots ανοίγουν πολλά threads ταυτόχρονα και λιώνουν την CPU του spammer.. δεν έχουν την πολυτέλεια να περιμένουν τους timers, άρα οι timers είναι πολύ δυνατό όπλο στα χέρια μας. Εκτώς όλων των άλλων.. κανονικά οι timers λειτουργούν σε ξεχωριστά threads, άρα και μόνο η ύπαρξη τους είναι απαγορευτική για το spam bot.

Το νέο trick αυτής της έκδοσης είναι οτι η κεντρική σελίδα περιέχει κάποια κλειδιά αλλά όχι τα σωστά! Τα σωστά φορτώνονται από εξωτερικό .js αρχείο. Το ίδιο .js αρχείο είναι που ενημερώνει και το PHP script για τα σωστά κλειδιά. Επίσης το PHP script αναλαμβάνει να ανανεώσει το .js με νέα κλειδιά αμα παλιώσουν.

Γιατί εξωτερικό αρχείο; Γιατί τα περισσότερα bots δεν σκάνε και πολύ.. φορτώνουν την κεντρική σελίδα και ό,τι βρούνε βρήκαν.

Γιατί το αρχείο δεν μένει για πάντα το ίδιο; Γιατί κάποιος έξυπνος cracker μπορεί να το αποθηκεύσει και να το χρησιμοποιεί καταστρέφοντας όλη την προσπάθεια που κάνουμε.

Γιατί το αρχείο πρέπει να ανανεώνεται ανα μεγαλούτσικα χρονικά διαστήματα; Για να υπάρχει και λίγο caching από πλευράς των χρηστών. Αν οι σελίδες έχουν πολλά hits τότε ο server τουλάχιστον γλιτώνει να σερβίρει το .js συνεχώς.

js_email_antispam_02.php

Κώδικας: Επιλογή όλων

<?php

$js_file = './js_email_antispam_02.js';
if &#40;time&#40;&#41; - filemtime&#40;$js_file&#41; > 86400&#41; &#123; // 86400 deuterolepta = 60 deuterolepta * 60 lepta * 24 wres = 1 mera
  $keys = array&#40;&#41;;
  for &#40;$i = 1; $i <= 15; $i++&#41; $keys&#91;&#93; = rand&#40;0, 255&#41;;
  if &#40;$fp = fopen&#40;$js_file, 'w'&#41;&#41; &#123;
    fwrite&#40;$fp, 'SpAm$PrOtEcToR&#91;\'k\'&#93; = new Array&#40;' . implode&#40;', ', $keys&#41; . '&#41;;'&#41;;
    fclose&#40;$fp&#41;;
  &#125;
&#125; else &#123;
  $keys = file&#40;$js_file&#41;;
  eval&#40;'$keys = ' . substr&#40;$keys&#91;0&#93;, strpos&#40;$keys&#91;0&#93;, 'Array'&#41;&#41;&#41;;
&#125;

function scramble_email&#40;$m&#41; &#123;
  global $keys;

  $len = strlen&#40;$m&#91;1&#93;&#41;;
  $iKey = 0;
  $link = '';
  for &#40;$i = 0; $i < $len; $i++&#41; &#123;
    $link .= str_pad&#40;dechex&#40;ord&#40;$m&#91;1&#93;&#91;$i&#93;&#41; ^ $keys&#91;$iKey&#93;&#41;, 2, '0', STR_PAD_LEFT&#41;;
    $iKey++;
    if &#40;$iKey >= count&#40;$keys&#41;&#41; $iKey = 0;
  &#125;
  return 'href="image.php?' . $link . '" onfocus="mail&#40;this&#41;" onmouseover="mail&#40;this&#41;"';
&#125;

function ob_handle&#40;$buffer&#41; &#123;
  return preg_replace_callback&#40;'/href="mailto&#58;&#40;&#91;^"&#93;+&#41;"/i', 'scramble_email', $buffer&#41;;
&#125;
ob_start&#40;'ob_handle'&#41;;

?>
<!-- saved from url=&#40;0014&#41;about&#58;internet -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http&#58;//www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
  var SpAm$PrOtEcToR = &#123; 'k' &#58; new Array&#40;73, 22, 212, 87, 122, 73, 229, 188, 58, 150, 210, 150, 1, 20, 210&#41; &#125;;

  function mail&#40;element&#41; &#123;
    if &#40;SpAm$PrOtEcToR&#91;'load_time'&#93; && &#40;new Date&#40;&#41;.getTime&#40;&#41; - SpAm$PrOtEcToR&#91;'load_time'&#93;.getTime&#40;&#41; > 700&#41; && !element.getAttribute&#40;'title'&#41;&#41; &#123;
      var href = element.getAttribute&#40;'href'&#41;;
      href = href.substr&#40;href.indexOf&#40;'?'&#41; + 1&#41;;
      var k = 0, addr = '';
      for &#40;var i = 0; i < href.length; i += 2&#41; &#123;
        addr += String.fromCharCode&#40;parseInt&#40;href.substr&#40;i, 2&#41;, 16&#41; ^ SpAm$PrOtEcToR&#91;'k'&#93;&#91;k&#93;&#41;;
        k++;
        if &#40;k >= SpAm$PrOtEcToR&#91;'k'&#93;.length&#41; k = 0;
      &#125;
      element.setAttribute&#40;'title', addr&#41;;
      element.setAttribute&#40;'href', 'mailto&#58;' + addr&#41;;
    &#125;
  &#125;
</script>

</head>

<body>

  <p><a href="mailto&#58;address@example.com">mail</a></p>

  <script type="text/javascript"> setTimeout&#40;function&#40;&#41; &#123; SpAm$PrOtEcToR&#91;'load_time'&#93; = new Date&#40;&#41;; &#125;, 300&#41; </script>
  <script type="text/javascript" src="js_email_antispam_02.js"></script>
</body>
</html>
js_email_antispam_02.js

Κώδικας: Επιλογή όλων

SpAm$PrOtEcToR&#91;'k'&#93; = new Array&#40;190, 200, 91, 158, 139, 6, 132, 109, 214, 180, 39, 248, 246, 74, 91&#41;;
Όλα αυτά χρησιμεύουν για τον τυχοδιώκτη spammer που γυρνάει τα sites και όπου μπορεί βρίσκει ψάρια. Αν είναι έξυπνος και σε έχει βάλει στο μάτι δεν γλιτώνεις με τέτοια κόλπα.. Αλλά γιατί να σε βάλει στο μάτι όταν μπορεί από άλλα sites να βρίσκει διευθύνσεις χωρίς κόπο; Επίσης η βλακεία δεν έχει όριο.. οπότε έχεις μια ελπίδα να την γλιτώσεις λόγο ηλίθιου προγραμματιστή spammer.

Η προσωπική μου συμβουλή για μέγιστη ασφάλεια είναι να χρησιμοποιούνται διαφορετικές μέθοδοι, οι οποίες να αλλάζουν μεγαλούτσικες περιόδους (πχ ανα μήνα). Ο λόγος είναι να κάνεις ψυχολογικό πόλεμο στον επίδοξο cracker. Να του δώσεις αρκετό χρόνο να πείσει τον πελάτη του οτι μπορεί να σπάσει το site σου.. ή να το προλάβει να το παίξει έξυπνος στους φίλους του. Να χαλάσει αρκετό χρόνο για να στήσει την επίθεση του. Και όταν πια είναι σίγουρος οτι μπορεί να σε αντιμετωπίσει εσύ να αλλάζεις όχι μόνο κλειδιά και ονόματα μεταβλητών.. αλλά ολόκληρο τον τρόπο σκέψης της προστασίας του site σου. Οπότε γίνεται ρεζίλι και στον πελάτη του, και στους φίλους του και τον τρομοκρατείς με την έννοια ότι του κάνεις οτι δεν είσαι κάποιος τυχαίος.

Όσοι από εσάς έχετε όρεξη.. μπορείτε με βάση τα παραπάνω posts να φτιάξετε αμέτρητους συνδυασμούς!!! :)

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Απόκρυψη διευθύνσεων email με JavaScript

Δημοσίευση από cpulse » 25 Οκτ 2006 23:44

Σχετικά με τις εικόνες.. άλλο σκεφτόμουνα. Ένα gif να έχει μισό 'a'.. ένα άλλο το άλλο μισό 'a'. Το ίδιο να γίνεται για όλα τα γράμματα και τα file names να είναι εντελώς παράλογα. Και όχι μόνο αυτό.. αλλά να αλλάζουν και ανα κάποια περίοδο. Πχ.. το 1ο μισό του 'a' να έχει για file name.. 3f3oow.gif

Όμως όταν είδα και το link που μου έδειξες Σκεφτόμυλε μου ήρθε κι άλλη μια ιδέα.. να υπάρχουν πολλές εικόνες μπερδεμένες όπως τα έχεις, αλλά με CSS η μία εικόνα να κάνει overlay στην άλλη οπότε μόνο οπτικά να βγαίνει νόημα.

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης